最好不要用枚举所有窗口,然后对比进程ID的方法,这种方法太慢.
解决方案 »
- 互联网上任意两台主机连接通信的问题?
- VC下怎么弄opengl啊
- 关于OpenGl和VC方面的编程
- 有没有人做过内存泄漏检测工具开发
- 请问如何把屏幕截图保存为JPG文件?
- 传送结构体,其中包含STL中的list<CPoint>结构,C端收不到point?(高手请进)
- 中值滤波的图像除噪作用主要出去什么噪声?
- 请教各位IE插件的问题
- 请问各位大侠一个关于模板的问题
- MFC中滚动条问题
- 点击checkbox,如何使得checkbox保持原状态?即:原来是没选中的,点击后保持没选中;原来是选中的,点击后保持选中。
- CString mm("22"); int i = atoi(mm); 怎么会编译不通过?
用SetActiveWindow
{
LPARAM lParam;
WNDENUMPROC UserProc;
}TASKBARPARAM;BOOL CALLBACK EnumTaskBarWindowsProc(
HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
)
{
TASKBARPARAM * pParam;
WCHAR szWndText[1024];
int nRetVal;
pParam = (TASKBARPARAM *)lParam; if(0 != GetWindow(hwnd, GW_OWNER))
return TRUE; if(FALSE == IsWindowVisible(hwnd))
return TRUE; szWndText[0] = 0;
nRetVal = InternalGetWindowText(hwnd, szWndText, 1023);
if(nRetVal == 0 || szWndText[0] == 0)
return TRUE; if(wcsicmp(L"Program Manager", szWndText) == 0)
return TRUE; return pParam->UserProc(hwnd, pParam->lParam);
}
BOOL EnumTaskBarWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
{
TASKBARPARAM TaskBarParam;
TaskBarParam.lParam = lParam;
TaskBarParam.UserProc = lpEnumFunc;
return EnumWindows(EnumTaskBarWindowsProc, (LPARAM)&TaskBarParam);
}
EnumProcesses(dwProc, sizeof(dwProc), &dwLen);
for (DWORD i = 1; i < dwLen / sizeof(DWORD); i++)
{
HANDLE hProc;
TCHAR szProcessName [256] = {0};
HMODULE ahMod[10];
DWORD dwNeeded;
hProc = OpenProcess (PROCESS_ALL_ACCESS,FALSE,dwProc[i]);
if (hProc)
{
if (EnumProcessModules (hProc, ahMod, sizeof(ahMod), &dwNeeded))
{
if (GetModuleBaseName(hProc, ahMod[0], szProcessName, sizeof(szProcessName))){
if (strcmp(szProcessName,_T("3SConf.exe"))==0) {
EnumWindows(EnumWindowsProc,0);
}
TRACE("Proc: %ld :%s\n", dwProc[i], szProcessName);
}
}
CloseHandle (hProc);
}
}
其中EnumWindows(EnumWindowsProc,dwProc[i])是自己写的回调函数:
BOOL CALLBACK _stdcall EnumWindowsProc(HWND hWnd,LPARAM lParam)
{
DWORD ProcID = 0;
GetWindowThreadProcessId(hWnd,&ProcID);
if(ProcID == lParam)
{
HWND pWnd = hWnd;
while(GetParent(pWnd)!=NULL)
pWnd = GetParent(pWnd);
SetActiveWindow(pWnd);
}
return TRUE;
}
有没有办法找到主窗口?? 就是AfxGetMainWnd获取的窗口???
具体请参考MSDN.
你说的有道理,我估计微软在设计Windows的时候就没有意识到主窗口这个概念, 这样的话我们只能这样来判断了,凡凡是在主线程中创建的,又是弹出创建,没有父窗口/Ower窗口,则这个就是主窗口了