【问题标题】:Get the topmost window of my own application ONLY - in C仅获取我自己的应用程序的最顶层窗口 - 在 C 中
【发布时间】:2010-11-10 07:24:59
【问题描述】:

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

HWND hwnd;
hwnd = GetForegroundWindow();

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

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

编辑:

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

【问题讨论】:

  • 我知道这是一个相当老的问题,但我觉得有必要添加对blogs.msdn.com/b/oldnewthing/archive/2008/10/06/8969399.aspx的引用
  • 但是,请注意GetActiveWindow() 的“活动”部分。例如,如果用户激活了另一个应用程序,GetActiveWindow() 将返回 null。与GetWindow(main_hwnd, GW_ENABLEDPOPUP) 和GetGUIThreadInfo(thread_id, &info) -> info.hwndActive 相同。

标签: c windows winapi foreground


【解决方案1】:

这是一个可以与 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);

【讨论】:

  • 您还应该提到传递给EnumWindows() 的LPARAM 应该是指向HWND 的指针。
  • 你从哪里得到 hWnd?
  • 我没有。我的原始代码返回我需要的 hwnd。好的,这超出了我的需要,我的意思是我发布了 2 行代码,现在我需要开始查找 Windows 标题以获取 hwnd 以传递给回调函数以查看 hwnd 是否是最顶层的。虽然我非常感谢您的帮助,但必须有一种简单快捷的方法来做到这一点。
  • 对不起,我不是故意的。只是为了这么琐碎的事情要写这么长的代码是没有意义的。
  • 好的,我写了整个代码,但它仍然没有解决我的问题。我仍然可以获得不在我的应用程序上的窗口的窗口记录。
【解决方案2】:

使用GetTopWindow Function, 像这样:

HWND hwnd;
hwnd = GetTopWindow(NULL);

【讨论】:

  • "GetTopWindow 函数检查与指定父窗口关联的子窗口的 Z 顺序,并检索 Z 顺序顶部的子窗口句柄。"如果我的应用程序的主窗口位于最顶层怎么办?
  • 使用NULL 作为参数,您将获得最顶部的窗口,即使它是主窗口。你的意思是你不想要主窗口?
  • GetTopWindow() 给了我任务栏中项目的句柄,而不是窗口的句柄。当试图让窗口矩形时,我只得到任务栏按钮的测量值
  • 我确实想要主窗口,我在问这个函数是否只接受子窗口。无论如何,它的行为很奇怪
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2016-05-20
    • 2011-03-23
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多