c++ - 从 EnumDesktopWindows 中仅识别应用程序窗口
问题描述
这是我的第一个 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;
}
我正在运行带有 Visual Studio 19 Preview 的 Windows 10 Pro。
解决方案
GetWindowLong 可以通过 GWL_STYLE 获取窗口标志。检查 WS_CAPTION 和 WS_MINIMIZEBOX。我还会再次检查 WS_VISIBLE 以获得良好的测量结果。
推荐阅读
- python - pandas 批处理 API 请求
- ios - 在本机反应中,滚动视图不在 PanResonder 内滚动
- ruby-on-rails - Youtube Data Api:如何为来自 Youtube 趋势的每个视频添加重定向链接
- android - 在 Android 应用服务上使用 java.awt.robot
- c# - 从 asp.net web 服务 c# 调用 aspx.cs 方法
- colors - Sublime 的 UML 语法高亮显示
- swift - Swift BitConverter.DoubleToInt64Bits 等效
- selenium - 使用 selenium webdriver 自动化 Angular 登录页面
- javafx - 如何将工具提示添加到 JavaFX 画布的矩形区域
- postgresql - psql:致命:即使在设置密码后,用户“XXX”的对等身份验证也失败