以下代码运行时10次至少有1次无法找到进程主窗口,问题在哪?BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)
{
ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;
DWORD dwProcessId; GetWindowThreadProcessId(hWnd, &dwProcessId); if (pProcessWindow->dwProcessId == dwProcessId && IsWindow(hWnd) && GetParent(hWnd) == NULL)
{
pProcessWindow->hwndWindow = hWnd;
return FALSE;
}
return TRUE;
} BOOL MyCreateProcess()
{
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
// 进程信息
PROCESS_INFORMATION pi;
if(CreateProcess(L"E:\\test.exe", NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
{
ProcessWindow procwin;
procwin.dwProcessId = pi.dwProcessId;
procwin.hwndWindow = NULL;
WaitForInputIdle(pi.hProcess, 5000);
EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);
g_hTestWnd = procwin.hwndWindow;
}
else
g_hTestWnd = NULL;
return (g_hTestWnd?TRUE:FALSE);
}
{
ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;
DWORD dwProcessId; GetWindowThreadProcessId(hWnd, &dwProcessId); if (pProcessWindow->dwProcessId == dwProcessId && IsWindow(hWnd) && GetParent(hWnd) == NULL)
{
pProcessWindow->hwndWindow = hWnd;
return FALSE;
}
return TRUE;
} BOOL MyCreateProcess()
{
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
// 进程信息
PROCESS_INFORMATION pi;
if(CreateProcess(L"E:\\test.exe", NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
{
ProcessWindow procwin;
procwin.dwProcessId = pi.dwProcessId;
procwin.hwndWindow = NULL;
WaitForInputIdle(pi.hProcess, 5000);
EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);
g_hTestWnd = procwin.hwndWindow;
}
else
g_hTestWnd = NULL;
return (g_hTestWnd?TRUE:FALSE);
}
解决方案 »
- QQ好友列表如何获取 08
- vs2010咋这么多版本啊,下了几个大家看看?
- 如何传递参数?
- 如何做一个模板(模板匹配问题)?
- HTTP CLILEN T 问题(XMLHTTP问题)
- 已知三个点,怎样在三个点中画一条平滑的曲线?在线等,谢谢 。
- 向大神求救多边形切割算法的具体代码
- 请问如何在Listbox(列表框)上做出右键的功能?(类似winamp的右键功能)
- 我买了两本书,一本叫《C#技术内幕》,一本叫《C#语言参考手册》,大家对这两本书的评价?
- 我在MFC工程中加入一个C++文件(没有类,用C语言实现一个函数,要用到CDOcment类的变量),如何在C++中用Cdocument类中结构体变量和成员变量?
- VC调用matlab进行曲线拟合
- _waccess 这个函数怎么用的啊?
#include "afxwin.h"HWND g_hTestWnd;typedef struct tage
{
DWORD dwProcessId;
HWND hwndWindow;
}ProcessWindow;BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)
{
ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;
DWORD dwProcessId; GetWindowThreadProcessId(hWnd, &dwProcessId); if (pProcessWindow->dwProcessId == dwProcessId && IsWindow(hWnd) && GetParent(hWnd) == NULL)
{
pProcessWindow->hwndWindow = hWnd;
return FALSE;
}
return TRUE;
} BOOL MyCreateProcess()
{
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
// 进程信息
PROCESS_INFORMATION pi;
if(CreateProcess("c:\\windows\\notepad.exe", NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
{
ProcessWindow procwin;
procwin.dwProcessId = pi.dwProcessId;
procwin.hwndWindow = NULL;
WaitForInputIdle(pi.hProcess, 5000);
EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);
g_hTestWnd = procwin.hwndWindow;
}
else
g_hTestWnd = NULL;
return (g_hTestWnd?TRUE:FALSE);
}
int main(int argc, char* argv[])
{
BOOL r = MyCreateProcess(); printf( "r = %d\r\n", r ); return 0;
}
没发现问题,有的时候慢倒是。