枚举HWND属性c ++

Ілл*_*роз 6 c++ winapi hwnd

我正试图从一个获得属性HWND.我使用了" 使用窗口属性"中的信息,但下面的示例对我不起作用.我在编译代码时遇到错误.

类型"BOOL(__stdcall*)(HWND hwndSubclass,LPCSTR lpszString,HANDLE hData)"的参数与"PROPENUMPROCEXW"类型的参数不兼容

这是我的回调函数

BOOL CALLBACK PropEnumProcEx(HWND hwndSubclass, LPCSTR lpszString, HANDLE hData) {
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

这就是我如何使用它

EnumPropsEx(hwnd, PropEnumProcEx, NULL);
Run Code Online (Sandbox Code Playgroud)

有人有任何关于如何解决这个问题的建议吗?

use*_*670 4

LPCSTR lpszString应该LPTSTR lpszString。此参数应接受指向 ANSI 或 Unicode 以 null 结尾的字符串的指针。PROPENUMPROCEXW表示您正在构建 Unicode 应用程序,因此EnumPropsEx宏扩展为EnumPropsExW调用,因此您需要提供接受宽字符串作为参数的回调。通常,您应该始终显式调用 API 函数的 Unicode 变体。

您还缺少最后一个参数ULONG_PTR dwData

所以你的回调应该是这样的:

BOOL CALLBACK
PropEnumProcEx(HWND hwndSubclass, LPTSTR lpszString, HANDLE hData, ULONG_PTR dwData)
{
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

  • **−1** “`LPCSTR lpszString`应该是`LPTSTR lpszString`”是非常不好的建议。“T”宏在 1995 年到 2000 年之间出现过。2000 年,我们推出了 Layer for Unicode,使宏变得过时。如今,我们的工具甚至无法为宏所针对的系统 Windows 9x 生成可执行文件。继续将它们用于非遗留代码是愚蠢的。 (2认同)