获取我自己的应用程序的最顶层窗口 - 在C中

时间:2009-07-13 13:40:13

标签: c windows winapi foreground

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

HWND hwnd;
hwnd = GetForegroundWindow();

这个问题是它返回了系统范围内最顶层的。 有没有什么方法可以从我自己的应用程序中获得最高的权限?

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

修改

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

3 个答案:

答案 0 :(得分: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;
}

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

HWND hTopmostWnd = hWnd;
EnumWindows(FindTopmostWnd, (LPARAM)&hTopmostWnd);

答案 1 :(得分:1)

使用GetTopWindow Function, 像这样:

HWND hwnd;
hwnd = GetTopWindow(NULL);

答案 2 :(得分:0)

我不知道有一个功能正是如此,但你可能自己写一个。如果您的应用程序窗口都有特定的窗口类,那么您可以使用FindWindow或FindWindowEx。

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