Filtering/Parsing 从 C++ 中的 EnumWindows 生成的列表
Filtering/Parsing list produced from EnumWindows in C++
我正在使用以下代码在我的机器上获取 windows 运行 的列表
#include <iostream>
#include <windows.h>
using namespace std;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR buffer[512];
SendMessage(hwnd, WM_GETTEXT, 512, (LPARAM)(void*)buffer);
wcout << buffer << endl;
return TRUE;
}
int main()
{
EnumWindows(EnumWindowsProc, NULL);
return 0;
}
我想获得通常称为 Window 的列表 - 我这样说是因为当 运行 上述代码时,我得到大约 40 个条目的列表,其中大部分不是我所说的 windows.
这是我机器上 运行 上述脚本生成的输出的摘录,在 5 个条目中只有 Microsoft Visual Studio 是 Window
...
Task Switching
Microsoft Visual Studio
CiceroUIWndFrame
Battery Meter
Network Flyout
...
我该如何处理 filtering/parsing 这些数据,因为没有任何东西可以用作标识符。
我会在枚举过程中使用 EnumDesktopWindows
to enumerate all top-level windows in your desktop; you may even use the IsWindowsVisible
API 来过滤掉 non-visible windows。
这个可编译的 C++ 代码对我来说工作正常(请注意,这里我展示了如何将一些附加信息传递给枚举过程,在本例中使用指向 vector<wstring>
的指针,其中 window 存储标题供以后处理):
#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
using std::vector;
using std::wcout;
using std::wstring;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
if (!IsWindowVisible(hwnd))
{
return TRUE;
}
wchar_t titleBuf[512];
if (GetWindowText(hwnd, titleBuf, _countof(titleBuf)) > 0)
{
auto pTitles = reinterpret_cast<vector<wstring>*>(lParam);
pTitles->push_back(titleBuf);
}
return TRUE;
}
int main()
{
vector<wstring> titles;
EnumDesktopWindows(nullptr, EnumWindowsProc, reinterpret_cast<LPARAM>(&titles));
for (const auto& s : titles)
{
wcout << s << L'\n';
}
}
定义您所说的 Window 并查询 windows 句柄以获得正确的属性。使用 GetWindowLong() 和例如 GWL_HWNDPARENT 来测试是否没有父 window 或者父 window 是否是桌面 window。可能需要额外的测试,例如您可以使用(扩展的)window 样式。另请参阅 here,了解有关可用测试的其他想法。
我正在使用以下代码在我的机器上获取 windows 运行 的列表
#include <iostream>
#include <windows.h>
using namespace std;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR buffer[512];
SendMessage(hwnd, WM_GETTEXT, 512, (LPARAM)(void*)buffer);
wcout << buffer << endl;
return TRUE;
}
int main()
{
EnumWindows(EnumWindowsProc, NULL);
return 0;
}
我想获得通常称为 Window 的列表 - 我这样说是因为当 运行 上述代码时,我得到大约 40 个条目的列表,其中大部分不是我所说的 windows.
这是我机器上 运行 上述脚本生成的输出的摘录,在 5 个条目中只有 Microsoft Visual Studio 是 Window
...
Task Switching
Microsoft Visual Studio
CiceroUIWndFrame
Battery Meter
Network Flyout
...
我该如何处理 filtering/parsing 这些数据,因为没有任何东西可以用作标识符。
我会在枚举过程中使用 EnumDesktopWindows
to enumerate all top-level windows in your desktop; you may even use the IsWindowsVisible
API 来过滤掉 non-visible windows。
这个可编译的 C++ 代码对我来说工作正常(请注意,这里我展示了如何将一些附加信息传递给枚举过程,在本例中使用指向 vector<wstring>
的指针,其中 window 存储标题供以后处理):
#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
using std::vector;
using std::wcout;
using std::wstring;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
if (!IsWindowVisible(hwnd))
{
return TRUE;
}
wchar_t titleBuf[512];
if (GetWindowText(hwnd, titleBuf, _countof(titleBuf)) > 0)
{
auto pTitles = reinterpret_cast<vector<wstring>*>(lParam);
pTitles->push_back(titleBuf);
}
return TRUE;
}
int main()
{
vector<wstring> titles;
EnumDesktopWindows(nullptr, EnumWindowsProc, reinterpret_cast<LPARAM>(&titles));
for (const auto& s : titles)
{
wcout << s << L'\n';
}
}
定义您所说的 Window 并查询 windows 句柄以获得正确的属性。使用 GetWindowLong() 和例如 GWL_HWNDPARENT 来测试是否没有父 window 或者父 window 是否是桌面 window。可能需要额外的测试,例如您可以使用(扩展的)window 样式。另请参阅 here,了解有关可用测试的其他想法。