仅识别来自 EnumDesktopWindows 的应用程序 windows
Identify only application windows from EnumDesktopWindows
这是我的第一个 C++ 应用程序。我完全没有 C++ 或 Windows 应用程序编程方面的经验,所以任何 feedback/help 都表示赞赏。如果我在代码中犯了任何错误或没有遵循最佳实践,请告诉我。
我正在尝试编写一个 C++ 程序来复制 WIN + D 的行为
键盘快捷键,但仅影响使用鼠标在显示器上的 windows。
尽管检查了 IsWindowVisible()
和 IsIconic()
,但仍有一些系统 windows 被最小化和最大化,导致出现奇怪的故障,例如:
- 桌面上的所有图标都最小化,并出现灰色条
- 一个空白的 Microsoft Edge 实例打开
- Windows 设置应用突然出现
代码最小化 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 Pro,Visual Studio 19 预览。
GetWindowLong 可以通过 GWL_STYLE 获取 window 标志。检查 WS_CAPTION 和 WS_MINIMIZEBOX。我还会再次检查 WS_VISIBLE 以获得良好的衡量标准。
这是我的第一个 C++ 应用程序。我完全没有 C++ 或 Windows 应用程序编程方面的经验,所以任何 feedback/help 都表示赞赏。如果我在代码中犯了任何错误或没有遵循最佳实践,请告诉我。
我正在尝试编写一个 C++ 程序来复制 WIN + D 的行为 键盘快捷键,但仅影响使用鼠标在显示器上的 windows。
尽管检查了 IsWindowVisible()
和 IsIconic()
,但仍有一些系统 windows 被最小化和最大化,导致出现奇怪的故障,例如:
- 桌面上的所有图标都最小化,并出现灰色条
- 一个空白的 Microsoft Edge 实例打开
- Windows 设置应用突然出现
代码最小化 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 Pro,Visual Studio 19 预览。
GetWindowLong 可以通过 GWL_STYLE 获取 window 标志。检查 WS_CAPTION 和 WS_MINIMIZEBOX。我还会再次检查 WS_VISIBLE 以获得良好的衡量标准。