我想知道如何从注入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;
}
答案 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;
}