16,472
社区成员
发帖
与我相关
我的任务
分享
int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param)
{
DWORD pID;
DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);//get process id
if (TpID == (DWORD)param)
{
apphwnd=hwnd;//hwnd is the window handle
SetEvent(g_hEvent);
return false;
}
ResetEvent(g_hEvent);
return true;
}
::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
HANDLE handle;//process handle
HWND apphwnd;//window handle
/*************Global functions for hosting******************/
//Function to enumerate all windows.
int CALLBACK EnumWindowsProc(HWND hwnd, LPARAM param)
{
DWORD pID;
DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);//get process id
if (TpID == (DWORD)param)
{
apphwnd=hwnd;//hwnd is the window handle
SetEvent(g_hEvent);
return false;
}
ResetEvent(g_hEvent);
return true;
}
//Functio to start a orocess and return the process handle
HANDLE StartProcess(LPCTSTR program, LPCTSTR args)
{
HANDLE hProcess = NULL;
PROCESS_INFORMATION processInfo;
STARTUPINFO startupInfo;
::ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
startupInfo.dwFlags=STARTF_USESHOWWINDOW;
startupInfo.wShowWindow=SW_HIDE;
if(::CreateProcess(program, (LPTSTR)args,
NULL, // process security
NULL, // thread security
FALSE, // no inheritance
0, // no startup flags
NULL, // no special environment
NULL, // default startup directory
&startupInfo,
&processInfo))
{ /* success */
::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
hProcess = processInfo.hProcess;
} /* success */
return hProcess;
}
/**********************************************************/
//handle for host menu
void CHostMSPaintDlg::OnActionHostmspaint()
{
CRect rect;
DWORD nRet=-1;
g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
GetClientRect(&rect);//get our dialog size into rect
handle=StartProcess(NULL,"C:\\Program Files\\Microsoft Office\\Office12\\WINWORD.EXE c:\\操作word的类.docx");//Start ms paint
nRet=WaitForSingleObject(g_hEvent,5000); //waited the target window for 2000 ms
CloseHandle(g_hEvent);
if(nRet!=WAIT_OBJECT_0)
{
::MessageBox(NULL,_T("启动word,超时!"),_T("错误提示"),MB_ICONEXCLAMATION);
SendMessage(WM_CLOSE,0,0);
return;
}
if(apphwnd!=NULL)//check for window handle
{
::SetParent(apphwnd,m_hWnd);//set parent of ms paint to our dialog.
SetWindowLong(apphwnd, GWL_STYLE, WS_VISIBLE);//eraze title of ms paint window.
//Positioning ms paint.
::MoveWindow(apphwnd, rect.left, rect.top,rect.right, rect.bottom, true);
::ShowWindow(apphwnd,SW_SHOW);
}
else//no window for our process
MessageBox("Cannot find Window");
}
有兴趣的可以自己做个实验
{ /* success */
WaitForInputIdle(processInfo.hProcess, INFINITE);
::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
hProcess = processInfo.hProcess;
} /* success */
加上WaitForInputIdle这个,CreateProcessr后,立即去找窗口,可能会找不到,那个进程都可能还没被加载进内存,你怎么能找到?DWORD TpID = GetWindowThreadProcessId(hwnd, &pID);//get process id
这句是得到创建hwnd这个窗口的线程ID(TpID)和进程ID(pID),你确定如下
::EnumWindows(&EnumWindowsProc, processInfo.dwThreadId);//Iterate all windows
processInfo.dwThreadId这个线程有创建过窗口?