【问题标题】:Get Correct HWND With Comparing GetCurrentProcessId();通过比较 GetCurrentProcessId(); 获得正确的 HWND;
【发布时间】: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


【解决方案1】:

总结一下cmets中的讨论。

您的代码似乎是正确的。但是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;
}

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 2018-06-26
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2016-06-20
    • 2011-08-14
    相关资源
    最近更新 更多