今天碰到一个问题,如何打开一个外部exe程序,并得到它的主窗口句柄,上网搜了一下相关资料,特别感谢
jishiping(JSP 季世平) ,相关代码如下:
HWND HelpHwnd = (void*)-1 ;
struct EnumParam
{
HWND hMainWnd;
DWORD dwProcessID;
};
BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam)
{
DWORD dwID;
EnumParam* pep = (EnumParam*)lParam;
GetWindowThreadProcessId(hwnd, &dwID);
if (dwID == pep->dwProcessID)
{
pep->hMainWnd = hwnd;
return FALSE;
}
return TRUE;
}
//---------------------------------------------------------------------------
void InvokeHelp()
{
String helpFile = ".//HelpDoc.chm";
if (!FileExists(helpFile))
{
return;
}
Sleep(1000);//如果不延时的话,恐怕查到的是杀掉的进程
HWND hwnd = FindWindowEx(NULL, HelpHwnd, NULL, NULL);
if (hwnd == NULL)
{
EnumParam ep;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ep.hMainWnd = NULL;
memset(&si, 0, sizeof(si));
si.cb = sizeof(STARTUPINFO);
helpFile = "hh " + helpFile;
if (CreateProcess(NULL, helpFile.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
Sleep(1000); //如果不延时的话,恐怕进程列表未及时刷新
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
ep.dwProcessID = pi.dwProcessId;
EnumWindows((WNDENUMPROC)EnumWinProc, (long)&ep);
HelpHwnd = ep.hMainWnd;
}
}
else
{
SetForegroundWindow(HelpHwnd);
SetActiveWindow(HelpHwnd);
}
}