【发布时间】:2018-11-15 14:44:39
【问题描述】:
我正在进行的部分项目涉及查找显示的每个窗口。我使用EnumWindows() 函数遍历每个窗口并过滤掉在IsWindowVisible() 上不返回true 的窗口。但即便如此,我还是得到了一些奇怪的结果,其中包括没有任何可见窗口的进程。这是代码:
int main()
{
EnumWindows(callback, NULL);
cin.get();
return 0;
}
BOOL CALLBACK callback(HWND hWnd, LPARAM lParam)
{
wchar_t windowTitle[256];
GetWindowText(hWnd, windowTitle, sizeof(windowTitle));
int length = ::GetWindowTextLength(hWnd);
wstring title(&windowTitle[0]);
if (!IsWindowVisible(hWnd) || length == 0) return TRUE;
WINDOWPLACEMENT wp;
GetWindowPlacement(hWnd, &wp);
cout << string(title.begin(), title.end()) << endl;
return TRUE;
}
结果如下:
C:\Users\qjohh\Documents\Visual Studio 2017\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe
ConsoleApplication1 (Running) - Microsoft Visual Studio
Settings
Settings
Movies & TV
Movies & TV
Calculator
Calculator
Microsoft Edge
Microsoft Edge
Netflix
Netflix
Microsoft Store
Microsoft Store
Program Manager
下面列出的属于 Visual Studio 的所有进程都没有打开窗口,自从我的计算机启动以来,我什至没有启动它们。我做了一些挖掘,结果发现这些被任务管理器视为后台进程(Program Manager 除外,我认为它是操作系统的核心进程)
有没有办法从我的结果中排除这些?
【问题讨论】:
-
[编辑:没关系,我倒着读了这个问题。]
-
旁白:检查返回值是否有错误,当
GetWindowText已经返回长度时不要调用GetWindowTextLength。 -
@Jabberwocky 说得对。检查 CLOAKED 属性。
-
虽然您已经得到了问题的答案,但我还要指出您对
GetWindowText的调用不正确 - 您将wchar_t缓冲区的大小(以字节为单位)作为参数传递3,但它需要字符大小。