创建进程并获取它的窗口句柄【详细说明】

FreeEIM 相信大家都听过,本文说明一下如何创建进程后得到该进程的主窗口句柄。


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

HWND CreateMyProcess()   
{   
    // 进程启动信息   
    STARTUPINFO si;   
    memset(&si, 0, sizeof(STARTUPINFO));   
    si.cb = sizeof(STARTUPINFO);   
    si.dwFlags = STARTF_USESHOWWINDOW;   
    si.wShowWindow = SW_SHOW;   
  
    // 进程信息   
    PROCESS_INFORMATION pi;   
       
    // 创建进程   
    // 第二个参数是要启动的应用程序路径名,比如:C:\Test.exe   
    if (CreateProcess(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);   
           
        return procwin.hwndWindow   
    }   
}  
HWND CreateMyProcess()
{
 // 进程启动信息
 STARTUPINFO si;
 memset(&si, 0, sizeof(STARTUPINFO));
 si.cb = sizeof(STARTUPINFO);
 si.dwFlags = STARTF_USESHOWWINDOW;
 si.wShowWindow = SW_SHOW;


 // 进程信息
 PROCESS_INFORMATION pi;
 
 // 创建进程
 // 第二个参数是要启动的应用程序路径名,比如:C:\Test.exe
 if (CreateProcess(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);
  
  return procwin.hwndWindow
 }
}   




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


 struct ProcessWindow  
{  
    DWORD dwProcessId;  
    HWND hwndWindow;  
}; 
struct ProcessWindow
{
 DWORD dwProcessId;
 HWND hwndWindow;
};


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


 

// 查找进程主窗口的回调函数   
BOOL CALLBACK EnumWindowCallBack(HWND hWnd, LPARAM lParam)   
{   
    ProcessWindow *pProcessWindow = (ProcessWindow *)lParam;   
  
    DWORD dwProcessId;   
    GetWindowThreadProcessId(hWnd, &dwProcessId);   
  
    // 判断是否是指定进程的主窗口   
    if (pProcessWindow->dwProcessId == dwProcessId && IsWindowVisible(hWnd) && GetParent(hWnd) == NULL)   
    {   
        pProcessWindow->hwndWindow = hWnd;   
  
        return FALSE;   
    }   
  
    return TRUE;   
}  


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,可以使用QProcess进行子进程创建和管理。然而,QProcess本身并不提供获取窗口句柄的功能。要获取进程窗口句柄,可以借助一些底层操作系统的API。 首先,在Qt中启动子进程之后,可以使用QProcess的pid()函数获取进程进程ID。然后,可以使用操作系统相关的API来获取进程窗口句柄。以下以Windows操作系统为例,介绍如何实现: 1. 使用QProcess启动子进程。 ``` QProcess process; process.start("your_executable_file"); ``` 2. 获取进程进程ID。 ``` qint64 pid = process.pid(); ``` 3. 使用Windows API函数EnumWindows()遍历所有顶级窗口,并查找与子进程进程ID对应的窗口。 ```cpp #include <windows.h> HWND childWindow = nullptr; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { DWORD pid; GetWindowThreadProcessId(hwnd, &pid); if (pid == static_cast<DWORD>(lParam)) { childWindow = hwnd; return FALSE; // 找到目标窗口后,终止遍历 } return TRUE; } EnumWindows(EnumWindowsProc, static_cast<LPARAM>(pid)); ``` 4. 最后,可以使用获取到的窗口句柄进行后续操作,例如设置窗口属性、发送消息等。 ```cpp // 设置窗口标题 QString title = "New Window Title"; SetWindowText(childWindow, title.toStdWString().c_str()); // 发送消息到子进程窗口 std::wstring message = L"Hello from Parent"; SendMessage(childWindow, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(message.c_str())); ``` 需要注意的是,获取窗口句柄是操作系统相关的操作,不同平台可能有不同的实现方式。因此,上述代码只适用于Windows平台。在其他平台上,可能需要使用不同的API函数或方法来获取窗口句柄

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值