通过进程pid获取窗口句柄HWND,然后可以通过sendmessage进行交互通讯

这篇博客介绍了一种使用PID查找并获取对应进程窗口句柄的方法,通过递归遍历窗口及其线程,筛选出与给定进程ID匹配且可见的顶级窗口。
//通过pid获取窗口句柄
HWND GetHwndByPid(DWORD dwProcessID)
{
    HWND h = GetTopWindow(0);
    HWND retHwnd = NULL;
    while (h)
    {
        DWORD pid = 0;
        DWORD dwTheardId = GetWindowThreadProcessId(h, &pid);
        if (dwTheardId != 0)
        {
            if (pid == dwProcessID && GetParent(h) == NULL && ::IsWindowVisible(h))
            {
                retHwnd = h;    //会有多个相等值
                //    /*
                //char buf[MAX_PATH] = { 0 };
                //sprintf_s(buf, "%0x", h);
                //MessageBox(NULL, buf, "提示", MB_OK);
                //    */
            }
        }
        h = GetNextWindow(h, GW_HWNDNEXT);
    }
    return retHwnd;
}
通过进程ID获取窗口句柄可以使用Windows API中的EnumWindows函数结合GetWindowThreadProcessId函数来实现。 EnumWindows函数是用于枚举所有顶级窗口的函数,它会将每个窗口句柄传入一个回调函数中进行处理。而GetWindowThreadProcessId函数用于获取给定窗口进程ID。 首先,我们可以定义一个回调函数来处理EnumWindows函数传入的窗口句柄。在回调函数中,我们需要利用GetWindowThreadProcessId函数来获取每个窗口进程ID,并将其与我们想要获取的目标进程ID进行比较。当匹配到目标进程ID时,我们可以将该窗口句柄保存下来。 以下是一个简单的示例代码: ```c++ #include <iostream> #include <windows.h> DWORD targetProcessId; HWND targetWindowHandle = nullptr; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { DWORD currentProcessId; GetWindowThreadProcessId(hwnd, &currentProcessId); if (currentProcessId == targetProcessId) { targetWindowHandle = hwnd; return FALSE; // 返回FALSE以停止枚举 } return TRUE; // 返回TRUE以继续枚举 } HWND GetWindowHandleByProcessId(DWORD processId) { targetProcessId = processId; EnumWindows(EnumWindowsProc, 0); return targetWindowHandle; } int main() { DWORD processId = 1234; // 目标进程ID HWND windowHandle = GetWindowHandleByProcessId(processId); if (windowHandle != nullptr) { std::cout << "窗口句柄: " << windowHandle << std::endl; } else { std::cout << "未找到匹配的窗口句柄" << std::endl; } return 0; } ``` 在示例代码中,我们定义了一个名为`GetWindowHandleByProcessId`的函数来实现通过进程ID获取窗口句柄的功能。该函数接受一个参数`processId`,即目标进程的ID。在函数内部,我们首先将目标进程ID保存起来,然后调用`EnumWindows`函数来枚举所有顶级窗口。在回调函数`EnumWindowsProc`中,我们使用`GetWindowThreadProcessId`函数获取当前窗口进程ID并与目标进程ID进行比较。如果匹配成功,则将当前窗口句柄保存下来。最后,在`main`函数中,我们可以调用`GetWindowHandleByProcessId`函数来获取目标进程窗口句柄,并输出结果。 需要注意的是,以上示例代码仅演示了通过进程ID获取单个窗口句柄的方法。如果目标进程存在多个窗口,您可能需要进一步定义您的需求来确定具体需要获取哪个窗口句柄
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值