【问题标题】:Enum HWND properties c++枚举 HWND 属性 c++
【发布时间】:2018-02-04 19:43:15
【问题描述】:

我正在尝试从HWND 获取属性。我使用了来自Using Window Properties 的信息,但下面的示例不适用于我。编译代码时出现错误。

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

这是我的回调函数

BOOL CALLBACK PropEnumProcEx(HWND hwndSubclass, LPCSTR lpszString, HANDLE hData) {
    return TRUE;
}

这就是我使用它的方式

EnumPropsEx(hwnd, PropEnumProcEx, NULL);

有人对如何解决这个问题有任何建议吗?

【问题讨论】:

  • 错误信息再清楚不过了。你明白吗?

标签: c++ winapi hwnd


【解决方案1】:

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

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

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

BOOL CALLBACK
PropEnumProcEx(HWND hwndSubclass, LPTSTR lpszString, HANDLE hData, ULONG_PTR dwData)
{
    return TRUE;
}

【讨论】:

  • −1LPCSTR lpszString 应该是 LPTSTR lpszString” 是非常不好的建议。 T 宏出现在 1995 年到 2000 年之间。在 2000 年,我们得到了 Unicode 层,使宏过时了。今天,我们的工具甚至无法为宏所针对的系统(Windows 9x)生成可执行文件。继续将它们用于非遗留代码是愚蠢的。
  • @Cheersandhth.-Alf 如果此代码也应该以 ANSI 变体构建,这是可以接受的。我的回答包含更喜欢使用 API 调用的 Unicode 变体的建议。
  • @VTT:不建议构建为 ANSI。有些读者可能会认真对待你。然后你就给他们制造麻烦。承认错误。修正答案。
  • @Cheersandhth.-Alf 我不建议在任何地方构建为 ANSI。
  • @Cheersandhth.-Alf: EnumPropsEx 是一个基于TCHAR 的宏,因此在回调中使用TCHAR 进行匹配是完全正确和合理的。如果您不想支持 ANSI,请首先不要使用TCHAR API。在这种情况下,直接使用EnumPropsExW,在回调中使用LPWSTR
猜你喜欢
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多