1

我正在使用以下代码来获取最顶层窗口的句柄:

HWND hwnd;
hwnd = GetForegroundWindow();

这样做的问题是它返回最顶层的系统范围。有什么方法可以仅从我自己的应用程序中获得最高值吗?

我只想获得我的应用程序的最顶层窗口。这意味着,我需要一个 API 来获取我自己的应用程序最顶层窗口,而不是像 GetForegroundWindow() 那样的系统范围最顶层窗口。谢谢!

编辑:

好的,让我在这里说清楚。我的问题是我能够为不属于我的应用程序的窗口获取 HWND。我想要得到的只是我的应用程序的TOPMOST。如果 HWND 属于另一个应用程序,那么我不应该获取信息。

4

3 回答 3

4

这是一个可以与 EnumWindows() 一起使用的回调:

BOOL CALLBACK FindTopmostWnd(HWND hwnd, LPARAM lParam)
{
    HWND* pHwnd = (HWND*)lParam;

    HWND myParent = hwnd;
    do
    {
        myParent = GetParent(myParent);
    }
    while (myParent && (myParent != *pHwnd));

    if (myParent != 0)
    {
        // If the window is a menu_worker window then use it's parent
        TCHAR szClassName[7];
        while (0 != GetClassName(hwnd, szClassName, 7)
            && 0 != _tcsncmp(szClassName, TEXT("Dialog"), 6)
            && 0 != _tcsncmp(szClassName, TEXT("Afx"), 3)
            )
        {
            // find the worker's parent
            hwnd = GetParent(hwnd);
        }

        *pHwnd = hwnd;

        return FALSE;
    }

    return TRUE;
}

正如亚当指出的那样,传递给 EnumWindows() 的 LPARAM 应该是指向 HWND 的指针。所以你可能想做这样的事情:

HWND hTopmostWnd = hWnd;
EnumWindows(FindTopmostWnd, (LPARAM)&hTopmostWnd);
于 2009-07-13T14:26:28.433 回答
1

使用GetTopWindow 函数,如下所示:

HWND hwnd;
hwnd = GetTopWindow(NULL);
于 2009-07-13T13:56:44.077 回答
0

我不知道有一个函数可以做到这一点,但你可能自己写一个。如果您的应用程序窗口都有一个特定的窗口类,那么您可以使用 FindWindow 或 FindWindowEx。

或者,您可以使用 GetForegroundWindow 从所有应用程序中获取前景窗口,然后使用 GetWindowLong 检查 HINSTANCE。如果它不是来自您的应用程序,则继续按 Z 顺序枚举窗口(使用 GetWindow),直到您从应用程序中找到第一个窗口。

于 2009-07-13T13:56:47.867 回答