【发布时间】:2018-08-18 16:48:31
【问题描述】:
我想知道如何从注入 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;
}
【问题讨论】:
-
顺便说一句,您可以将其地址传递给
EnumWindows,然后通过*((HWND*)lParam)访问它,而不是使用全局变量。 -
lParam应该是指向CorrectHWND的指针,而不是它的值。 -
目前尚不清楚,您要完成什么。我们无法在不知道代码的用途的情况下帮助您改进代码。您必须更新您的问题以包含该信息。
-
一个进程和一个线程可以有多个窗口。你应该决定你需要哪一个。
-
没有“主窗口”这样的概念。任何进程都可以有 1 个或多个线程,任何线程都可以有 0 个或多个顶级窗口。您必须决定您需要哪个窗口。一旦您编写了正式的规范,实现谓词的代码将非常容易编写。但我们无法为您提供帮助,因为我们不知道您需要什么。
标签: c++ winapi callback pid hwnd