EnumWindows 奇怪的行为

Posted

技术标签:

【中文标题】EnumWindows 奇怪的行为【英文标题】:EnumWindows strange behaviour 【发布时间】:2012-10-18 15:08:52 【问题描述】:

我正在尝试在 Windows 8 上将 MFC 与 Visual Studio 2012 一起使用。 我有以下代码:

BOOL CALLBACK EWP(HWND hwnd, LPARAM lParam)

    int txtlen = GetWindowTextLengthW(hwnd);
    std::wstring s;
    s.reserve(txtlen + 1);
    GetWindowText(hwnd, const_cast<wchar_t*>(s.c_str()), txtlen);

    return TRUE;


EnumWindows(EWP, 0);

发生的情况是,第一个字符串以“Task Switchin”的形式出现,其余的以“”形式出现。我得到了大约 330 个这样的字符串。我也试过不使用那种奇怪的字符串方法,只用 char buff[300],同样的故事。

谁能告诉我这是怎么回事?

【问题讨论】:

【参考方案1】:

您对 GetWindowText() 的最后一个参数是不正确的。来自该论点的 MSDN 文章描述:

指定要复制到缓冲区的最大字符数,包括 NULL 字符。如果文本超出此限制,则会被截断。

传递txtlen+1 进行修复。

【讨论】:

谢谢,好像是这样,但是我的问题没有解决。我仍然收到 330 个空字符串。 实际上我现在正在获取窗口名称,但是在 330 个空字符串之后,不知道为什么我得到这么多空字符串。谢谢,现在解决了。 很多窗口没有文字。 EnumWindows 是一个消防水带,你可以看到一切,包括隐藏的窗口。 @user1040769:附带说明,由于您明确使用GetWindowTextLengthW() 而不是一般的GetWindowTextLength(),因此您应该明确使用GetWindowTextW() 而不是一般的GetWindowText() 来匹配。

以上是关于EnumWindows 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

查找窗口是不是显示

使用 EnumWindows 找到满足你要求的窗口

为啥 EnumWindows 不能在服务中工作?

具有 enumwindows 接口和进程的程序列表

Windows API 编程----EnumWindows()函数的用法

获取任务栏中的窗口(EnumWindows函数)