查找窗口是不是显示

Posted

技术标签:

【中文标题】查找窗口是不是显示【英文标题】:Find if window is displayed or not查找窗口是否显示 【发布时间】: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 除外,我认为它是操作系统的核心进程)

有没有办法从我的结果中排除这些?

【问题讨论】:

[编辑:没关系,我倒着读了这个问题。] 这可能很有趣:***.com/q/32149880/898348 旁白:检查返回值是否有错误,当GetWindowText 已经返回长度时不要调用GetWindowTextLength @Jabberwocky 说得对。检查 CLOAKED 属性。 虽然您已经得到了问题的答案,但我还要指出您对 GetWindowText 的调用不正确 - 您将 wchar_t 缓冲区的大小(以字节为单位)作为参数传递3,但它需要字符大小。 【参考方案1】:

我在使用EnumWindows 枚举 Windows 10 上的窗口时遇到了同样的问题:有时,Metro/Modern 应用程序会被列为正在运行,即使它们不是。解决方案?检查窗口是否具有 DWM 隐藏属性

这是我的EnumProcLPARAM 是一个 32 位指针,指向用于写入标题的已打开文件句柄;根据应用程序的需要进行调整):

#include <Windows.h>
#include <strsafe.h>
#include <dwmapi.h>
#pragma comment(lib, "dwmapi.lib")

#define MAX_TITLE_LEN 100

BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam)

    LONG lStyle = GetWindowLongPtrW(hWnd, GWL_STYLE);

    if ((lStyle & WS_VISIBLE) && (lStyle & WS_SYSMENU))
    
        CONST CHAR CRLF[2] =  '\r', '\n' ;
        HANDLE hFile = *(HANDLE *)lParam;
        DWORD dwWritten;
        CHAR szTitle[MAX_TITLE_LEN];
        HRESULT hr;
        UINT uLen;
        INT nCloaked;

        // On Windows 10, ApplicationFrameWindow may run in the background and
        // WS_VISIBLE will be true even if the window isn't actually visible,
        // for various UWP apps. I don't know of any method for predicting when 
        // this will happen, and for which app(s).
        // 
        // The only way to test if a window is actually *visible* in this case
        // is to test for the DWM CLOAKED attribute.
        DwmGetWindowAttribute(hWnd, DWMWA_CLOAKED, &nCloaked, sizeof(INT));
        if (nCloaked)
            return TRUE;

        GetWindowTextA(hWnd, szTitle, MAX_TITLE_LEN);
        hr = StringCbLengthA(szTitle, MAX_TITLE_LEN, &uLen);
        if (SUCCEEDED(hr) && uLen > 0)
        
            SetFilePointer(hFile, 0, NULL, FILE_END);
            WriteFile(hFile, szTitle, uLen, &dwWritten, NULL);
            WriteFile(hFile, CRLF, 2, &dwWritten, NULL);
        
    
    return TRUE;

【讨论】:

【参考方案2】:

我认为您列出了系统中的所有窗口,但其中一些窗口可能不在您当前的桌面中。这里解释了: Filtering/Parsing list produced from EnumWindows in C++

不可见窗口的另一种情况是当它在屏幕坐标之外时,您可以将窗口和屏幕矩形相交。

【讨论】:

以上是关于查找窗口是不是显示的主要内容,如果未能解决你的问题,请参考以下文章

查找 VS 输出窗口中显示的异常源 [重复]

vs查找功能不显示查找结果

VC++处理窗口的常用API函数及窗口处理经验总结(附源码)

idea显示类中都有哪些方法快捷键

是否可以在 Eclipse 中停靠“查找/替换”窗口?

sublime text 3全局搜索的结果,怎么能在新文件中显示??