c++ - 仅从 EnumDesktopWindows 识别应用程序窗口

标签 c++ visual-c++ keyboard-shortcuts hotkeys

这是我的第一个 C++ 应用程序。我完全没有 C++ 或 Windows 应用程序编程经验,因此感谢任何反馈/帮助。如果我在代码中犯了任何错误或未遵循最佳实践,请告诉我。

我正在尝试编写一个 C++ 程序来复制 WIN + D 的行为 键盘快捷键,但仅影响使用鼠标的显示器上的窗口。

尽管检查了 IsWindowVisible()IsIconic(),但仍有一些系统窗口被最小化和最大化,从而导致奇怪的故障,例如:

  • 桌面上的所有图标都会最小化,并出现一个灰色条
  • 打开 Microsoft Edge 的空白实例
  • Windows 设置应用突然出现

最小化窗口的代码:

static std::stack<HWND> minimizedWindowPointers;
Monitors monitors;
RECT activeMonitorRect;

static BOOL CALLBACK windowEnumerator(HWND w, LPARAM l){
    if(!IsWindowVisible(w) || IsIconic(w) || getWindowTitle(w).size() == 0) return true;

    RECT r;
    GetWindowRect(w, &r);
    if(doRectsIntersect(r, activeMonitorRect)){
        SendMessage(w, WM_SYSCOMMAND, SC_MINIMIZE, 0);
        minimizedWindowPointers.push(w);
    }

    return true;
}
void minimizeWindowsOnActiveMoniter(){
    if(monitors.getRectOfMonitorWithPointer(&activeMonitorRect)) return;

    EnumDesktopWindows(NULL, windowEnumerator, NULL);

    areWindowsMinimized = true;
}
void maximizeWindowsOnActiveMoniter(){
    HWND w;
    for(int i = minimizedWindowPointers.size(); i > 0; i--){
        w = minimizedWindowPointers.top();
        minimizedWindowPointers.pop();
        if(IsIconic(w)){
            SendMessage(w, WM_SYSCOMMAND, SC_RESTORE, 0);
            std::wcout << "MAXIMIZING: " << getWindowTitle(w) << std::endl;
        }
    }

    areWindowsMinimized = false;
}

我运行的是 Windows 10 专业版和 Visual Studio 19 Preview。

最佳答案

GetWindowLong 可以获取带有 GWL_STYLE 的窗口标志。检查 WS_CAPTION 和 WS_MINIMIZEBOX。我还会再次检查 WS_VISIBLE 以进行良好的测量。

关于c++ - 仅从 EnumDesktopWindows 识别应用程序窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55309259/

相关文章:

c++ - OpenGL 中粒子发射器的简单 3D 烟雾算法

c++ - 编译cpp-netlib v0.9时 Unresolved external symbol 错误

vim - 如何*直接*增加光标下的数字?

search - 使用不带 "instant search"功能的键盘快捷键导航 Google 搜索结果

javascript - 如何在 MacOS 上的 Firefox 中不触发 Ctrl+LeftMouseClick 鼠标右键单击?

c++ - 如何在目录遍历中获取文件大小?

c++ - 我无法为二维数组赋值

c++ - 在 C++17 中,是否未定义使用无锁原子保护从信号处理程序传递的数据?

c - 如何在内联汇编中声明字符缓冲区?

c++ - 不需要删除 vector<StructA*> 中的结构内存吗?