使用WinAPI在托盘图标上单击窗口可见性

时间:2014-10-03 00:32:12

标签: winapi trayicon

如果没有窗口,如何将窗口置于顶部,如果使用Windows API单击托盘图标,则关闭窗口?也就是说,与任务栏图标的作用非常相似。通过提到顶部,我的意思是用户完全可见。

我找不到判断窗口是否在顶部的方法,因为当单击托盘图标时,任务栏始终位于顶部。我试过检查窗口的Z顺序,但看起来不一致。例如,当应用程序窗口位于顶部并且单击托盘图标时,我希望将任意数量的任务栏/托盘窗口置于顶部,紧随其后的窗口是 的窗口>在上面。但事实并非如此。

我大多可以实现它,问题是切换不关心窗口是否打开并且对用户完全可见(在顶部)。单击托盘图标并且窗口当前关闭时,它将打开并正确显示。当窗口打开并位于顶部时,它也会正确关闭。但是,当窗口打开但不在顶部时,它将被关闭而不是被带到前台。

2 个答案:

答案 0 :(得分:1)

扩大汉斯帕斯特所说的话:

“在顶部”并不重要,因为有些窗户总是在顶部;是窗口是否是您关注的前景窗口。

使用GetForegroundWindow()查看您的窗口是否为前景窗口,如果不是,请SetForegroundWindow()来实现。{/ p>

答案 1 :(得分:0)

感谢Mike Gelfand解决了这个问题!以下函数将返回:

    窗口关闭时
  • -1
  • 当窗口完全可见时,
  • 0
  • 当窗口打开但不完全可见时,
  • 1或以上
int GetMyWindowLevel(HWND myWindow) {

    WINDOWINFO myWindowInfo;
    myWindowInfo.cbSize = sizeof(myWindowInfo);
    if (!GetWindowInfo(myWindow, &myWindowInfo))
        return -1;

    int myWindowLevel = -1;
    HWND currentWindow = GetTopWindow(NULL);

    for (; currentWindow != NULL;
        currentWindow = GetNextWindow(currentWindow, GW_HWNDNEXT)) {

        WINDOWINFO currentWindowInfo;
        currentWindowInfo.cbSize = sizeof(currentWindowInfo);
        if (!GetWindowInfo(currentWindow, &currentWindowInfo))
            continue;

        if ((currentWindowInfo.dwExStyle & WS_EX_TOPMOST) !=
            (myWindowInfo.dwExStyle & WS_EX_TOPMOST) ||
            (currentWindowInfo.dwStyle & WS_POPUP) != 0)
            continue;

        ++myWindowLevel;
        if (currentWindow == myWindow)
            break;
    }
    return currentWindow == myWindow ? myWindowLevel : -1;
}