创建进程后得到该进程的主窗口句柄

  http://blog.csdn.net/starlee/article/details/4861174/

 最近抽空用VC写了一个小应用程序。主要功能就是创建进程,并到该进程的主窗口句柄,然后再给该窗口发消息。下面把代码共享给大家。

 

[cpp] view plain copy
  1. HWND CreateMyProcess()  
  2. {  
  3.     // 进程启动信息  
  4.     STARTUPINFO si;  
  5.     memset(&si, 0, sizeof(STARTUPINFO));  
  6.     si.cb = sizeof(STARTUPINFO);  
  7.     si.dwFlags = STARTF_USESHOWWINDOW;  
  8.     si.wShowWindow = SW_SHOW;  
  9.   
  10.     // 进程信息  
  11.     PROCESS_INFORMATION pi;  
  12.       
  13.     // 创建进程  
  14.     // 第二个参数是要启动的应用程序路径名,比如:C:/Test.exe  
  15.     if (CreateProcess(NULL, "应用程序路径名", NULL, NULL, false, 0, NULL, NULL, &si, &pi))  
  16.     {  
  17.         ProcessWindow procwin;  
  18.         procwin.dwProcessId = pi.dwProcessId;  
  19.         procwin.hwndWindow = NULL;  
  20.   
  21.         // 等待新进程初始化完毕  
  22.         WaitForInputIdle(pi.hProcess, 5000);  
  23.   
  24.         // 查找主窗口  
  25.         EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);  
  26.           
  27.         return procwin.hwndWindow  
  28.     }  
  29. }  
   

 

    上面代码中用到了一个自定义的结构ProcessWindow。该结构只含有两个成员,当做参数来传入进程ID和传出主窗口句柄。

 

 

[cpp] view plain copy
  1. struct ProcessWindow  
  2. {  
  3.     DWORD dwProcessId;  
  4.     HWND hwndWindow;  
  5. };  

 

    其实,查找指定进程的主窗口的功能是由下面这个回调函数来实现的。

[cpp] view plain copy
  1. // 查找进程主窗口的回调函数  
  2. BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)  
  3. {  
  4.     ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;  
  5.   
  6.     DWORD dwProcessId;  
  7.     GetWindowThreadProcessId(hWnd, &dwProcessId);  
  8.   
  9.     // 判断是否是指定进程的主窗口  
  10.     if (pProcessWindow->dwProcessId == dwProcessId && IsWindowVisible(hWnd) && GetParent(hWnd) == NULL)  
  11.     {  
  12.         pProcessWindow->hwndWindow = hWnd;  
  13.   
  14.         return FALSE;  
  15.     }  
  16.   
  17.     return TRUE;  
  18. }  
  

原文地址:https://www.cnblogs.com/nafio/p/9137224.html