通过比较GetCurrentProcessId()获得正确的HWND;

时间:2018-08-18 16:48:32

标签: c++ winapi callback pid hwnd

我想知道如何从注入DLL的过程中获取正确的HWND。我自己编写了代码,并想知道如何以及是否可以对其进行改进,因此它的思路与我使用像FindWindow(0,L“ calculator”)这样的FindWindow函数一样。我这样做是因为我不想使用FindWindow函数与名称进行比较,因为我想学习。

HWND CorrectHWND = NULL;
BOOL CALLBACK HWND_Callback(HWND hwnd, LPARAM lParam)
{
    if (CorrectHWND == NULL)
    {
        DWORD HWND_Process_ID;
        GetWindowThreadProcessId(hwnd, &HWND_Process_ID);
        if (GetCurrentProcessId() == HWND_Process_ID)
        {
            CorrectHWND = hwnd;
            return false;
        }
    }
    else
    {
        return false;
    }
    return true;
}

HWND Get_HWND()
{
    EnumWindows(HWND_Callback, 0);
    return CorrectHWND;
}

1 个答案:

答案 0 :(得分:1)

在评论中总结讨论。

您的代码似乎是正确的。但是FindWindow和您在做什么是不同的事情。这个问题不清楚您的目标,因为可能有多个与进程和线程相关联的窗口,也不清楚您要哪个。这可能就是为什么有时会出现“错误”窗口的原因:有多个窗口符合您的条件(相同的进程ID),但未定义枚举顺序(实际上是随机的)。您可以将所有窗口枚举到例如std::vector中,然后手动检查(例如,使用Spy ++)所需的窗口。这项分析可以帮助您确定其他条件(例如,窗口样式)来挑选所需的窗口。

请注意,如果可能,应避免使用全局变量。 EnumWindows接受第二个参数,然后将其传递到回调函数中。确保此参数的大小足以容纳一个指针。因此,我们可以声明一个局部变量并将其地址传递给回调函数。

BOOL CALLBACK HWND_Callback(HWND hwnd, LPARAM lParam)
{
    HWND& CorrectHWND = *reinterpret_cast<HWND*>(lParam);
    // exactly the same code
} 

HWND Get_HWND()
{
    HWND CorrectHWND = NULL;
    EnumWindows(HWND_Callback, reinterpret_cast<LPARAM>(&CorrectHWND)));
    return CorrectHWND;
}