HICON get_windows_HICON_critical(HWND hwnd)
{
// Get the window icon
HICON icon = reinterpret_cast<HICON>(::SendMessageW(hwnd, WM_GETICON, ICON_SMALL, 0));
if (icon == 0) {
// Alternative method. Get from the window class
icon = reinterpret_cast<HICON>(::GetClassLongPtrW(hwnd, GCLP_HICONSM));
}
// Alternative method: get the first icon from the main module (executable image of the process)
if (icon == 0) {
icon = ::LoadIcon(GetModuleHandleW(0), MAKEINTRESOURCE(0));
}
// // Alternative method. Use OS default icon
// if (icon == 0) {
// icon = ::LoadIcon(0, IDI_APPLICATION);
// }
if(icon == ::LoadIcon(0, IDI_APPLICATION)){
// Filter out those with default icons
icon = 0;
}
return icon;
}
static BOOL CALLBACK enumWindowCallback(HWND hWnd, LPARAM lparam) {
int length = GetWindowTextLength(hWnd);
char* buffer = new char[length + 1];
GetWindowText(hWnd, buffer, length + 1);
std::string windowTitle(buffer);
// List visible windows with a non-empty title
if (IsWindowVisible(hWnd) && length != 0) {
HICON icon = get_windows_HICON_critical(hWnd);
if(icon!=0){
std::cout << hWnd << ": " << windowTitle << std::endl;
}
}
return TRUE;
}
4条答案
按热度按时间k0pti3hp1#
Raymond在MSDN博客上的这篇文章中描述了在任务栏中(或类似地在Alt-Tab框中)仅列出窗口的方法:
Which windows appear in the Alt+Tab list?
这是一个超级函数,用于检查一个窗口是否显示在alt-tab中:
下面是源代码:
http://www.dfcd.net/projects/switcher/switcher.c
fslejnso2#
你所谈论的窗口,带有一个X按钮和一个标题栏等,并不是唯一的窗口。按钮,下拉菜单,标签,图标,文本框,任务栏,以及几乎所有其他的东西都是一个窗口。所以
EnumWindows
正在做它应该做的事情:枚举所有顶层窗口。1即使这是真的,
EnumWindows
也只枚举顶级窗口。这意味着it won't enumerate any child windows:EnumWindows函数不枚举子窗口,但系统拥有的少数具有WS_CHILD样式的顶级窗口除外。
然而,桌面上的许多东西也是窗口,而不仅仅是你所想的“窗口”。
2guxujil3#
@jondinham提供的answer确实非常适合我,所以我自己设计了一个解决方案。
1.我在以前的解决方案中遇到的问题
运行在Windows 10家庭版1909.上,我得到了两个额外的意想不到的Windows“计算器”和“设置”。
此外,无法检测Tencent QQ的窗口,因为以下操作失败:
不过,我想这个bug可能是腾讯QQ的特殊性造成的,我甚至不能用DeferWindowPos把它的“窗口TOPMOST”。
也许有人能帮我弄清楚为什么会发生这种情况,并帮助改进@jondinham之前的解决方案。
2.我的解决方案
我试着检查窗口的图标,并过滤掉没有自己的图标或使用与系统默认相同的图标的窗口。我使用answer和answer的代码片段并做了一些修改。这个解决方案对我来说非常好用。
3.我的解决方案存在的问题
根据this question,我的解决方案无法处理Windows Store应用程序。
zpqajqem4#
对于所有希望从列表中删除“设置”或Microsoft Store等“不可见”窗口的用户:
这些窗口被遮盖,这意味着它们仍然具有dwStyle
WS_VISIBLE
,但用户看不到它们。您可以使用函数DwmGetWindowAttribute来侦测这个问题。您要取得的
dwAttribute
是DWMWA_CLOAKED
(枚举常数14)。只有在方法呼叫之后,pvAttribute
中的值是0
时, windows 才不会被遮盖。