在C中为我自己的应用程序获取HWND

时间:2009-07-14 13:56:06

标签: c windows hwnd

因为我找不到this问题的答案,所以我进一步研究了MSDN,我找到了isChild()。它可能会给我另一个问题的答案。

现在,为了使用isChild(),我需要传递我要检查的父应用程序的HWND,在本例中是我自己的应用程序。 如何获得自己应用程序的HWND?

我不知道标题因为它经常变化所以我不能使用FindWindow()。

由于

编辑:

由于不清楚,我会添加更多信息: 我不是在创建一个窗口。我无权访问窗口的创建。我的代码是一段代码,它与其他程序员编写的任何应用程序一起编译,我无法访问窗口的创建方式,标题或任何其他信息。 那么,如何将HWND送到我正在运行的应用程序的“WINDOW”?

8 个答案:

答案 0 :(得分:9)

您的应用程序没有HWND。窗户确实如此。应用程序可能没有窗口,也可能有很多窗口,因此“获取应用程序的HWND”没有通用功能。

显而易见的解决方案就是在拿到手柄时握住手柄。创建窗口时,将返回HWND。存储它。

答案 1 :(得分:6)

使用GetTopWindow()和GetNextWindow()遍历windows z-order。

但是,不要认为有必要,但可以使用GetCurrentProcessId()和 GetWindowThreadProcessId(),可能会像以下内容对您有所帮助:

HWND FindMyTopMostWindow()
{
    DWORD dwProcID = GetCurrentProcessId();
    HWND hWnd = GetTopWindow(GetDesktopWindow());
    while(hWnd)
    {
        DWORD dwWndProcID = 0;
        GetWindowThreadProcessId(hWnd, &dwWndProcID);
        if(dwWndProcID == dwProcID)
            return hWnd;            
        hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
    }
    return NULL;
 }

答案 2 :(得分:1)

难道你不能抓住CreateWindow返回的句柄吗?如果没有,为什么不呢?

答案 3 :(得分:1)

正如其他人已经指出的那样

  • 通常,应用程序可以有零个或多个顶级窗口。
  • 如果你自己创建窗口,你可以记住某处的HWND。

但也许您的代码在DLL中,因此您实际上并没有自己创建顶级窗口。那该怎么办?

我建议如下:

  • 使用EnumWindows枚举所有顶级窗口。
  • 使用GetWindowLongPtr获取每个顶级窗口的HINSTANCE。将此与应用程序的HINSTANCE进行比较,您可以使用GetModuleHandle(NULL)获得该HINSTANCE。如果它们完全相同,那么您就找到了主窗口。

编辑:这是一些代码。事实证明你也必须使用IsWindowVisible,因为似乎有很多看不见的“辅助”窗口。

HWND hwndMain;

BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lParam)
{
    HINSTANCE hinst=(HINSTANCE)GetModuleHandle(NULL);

    if((HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE)==hinst &&
        IsWindowVisible(hwnd))
    {
        hwndMain=hwnd;
        return FALSE;
    }
    else
        return TRUE;
}

然后在你想找到窗口的地方:

hwndMain=NULL;
EnumWindows(EnumWindowProc, 0);

在此之后,hwndMain应该包含窗口的句柄,如果不存在,则NULL

使用EnumWindows有点麻烦,但建议在循环中调用GetWindow,因为,正如MSDN所说:“调用GetWindow执行此任务的应用程序可能会陷入无限循环或引用已被破坏的窗口的句柄。“

答案 4 :(得分:1)

可能你的代码被主应用程序代码调用,否则有什么用?在这种情况下,我不知道为什么你的代码的API不能包含一些通知你应用程序主窗口句柄的方法。

答案 5 :(得分:1)

您可以在呼吁user32.dll的线程中注入DLL http://msdn.microsoft.com/en-us/library/ms821625.aspx

答案 6 :(得分:0)

这对我来说很老,但是IIRC你应该在窗口proc中接收HWND作为参数。您可以在开头的某个地方将其保存在全局变量中。

答案 7 :(得分:0)

你的windows类名怎么样? 窗口创建总是不同的吗? 如果没有,你仍然可以FindWindow()。