相关文章推荐
从容的路灯  ·  Delphi ControlBar ...·  2 周前    · 
无聊的杨桃  ·  SpringCloud Gateway ...·  1 年前    · 
爱吹牛的海龟  ·  SpringBoot之spring-boot ...·  1 年前    · 


最近抽空用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. PROCESS_INFORMATION pi;

  11. // 创建进程
  12. // 第二个参数是要启动的应用程序路径名,比如:C:/Test.exe
  13. if (CreateProcess(NULL, "应用程序路径名", NULL, NULL, false, 0, NULL, NULL, &si, &pi))
  14. {
  15. ProcessWindow procwin;
  16. procwin.dwProcessId = pi.dwProcessId;
  17. procwin.hwndWindow = NULL;

  18. // 等待新进程初始化完毕
  19. WaitForInputIdle(pi.hProcess, 5000);

  20. // 查找主窗口
  21. EnumWindows(EnumWindowCallBack, (LPARAM)&procwin);

  22. return procwin.hwndWindow
  23. }
  24. }



上面代码中用到了一个自定义的结构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. DWORD dwProcessId;
  6. GetWindowThreadProcessId(hWnd, &dwProcessId);

  7. // 判断是否是指定进程的主窗口
  8. if (pProcessWindow->dwProcessId == dwProcessId && IsWindowVisible(hWnd) && GetParent(hWnd) == NULL)
  9. {
  10. pProcessWindow->hwndWindow = hWnd;

  11. return FALSE;
  12. }

  13. return TRUE;
  14. }