EnumWindows 不工作
EnumWindows not working
我正在创建一个 dll 文件。
我的代码:
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
void test() {
EnumWindows(EnumWindowsProc, NULL);
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
char class_name[80];
char title[80];
GetClassName(hwnd, (LPWSTR) class_name, sizeof(class_name));
GetWindowText(hwnd, (LPWSTR) title,sizeof(title));
std::string titlas(title);
std::string classas(class_name);
Loggerc(titlas);
Loggerc("Gooing");
return TRUE;
}
那我直接打电话给test()
.
在日志中,titlas
为空,代码停止。
当我在带有 CodeBlock 的 Win32 应用程序中尝试此代码时,一切正常,显示所有标题。但是在dll中,它不起作用。
问题出在哪里?
char class_name[80];
char title[80];
GetClassName(hwnd, (LPWSTR) class_name, sizeof(class_name));
GetWindowText(hwnd, (LPWSTR) title,sizeof(title));
std::string titlas(title);
std::string classas(class_name);
考虑到自 VS2005 以来,默认情况下一直在 Unicode 模式下构建(而不是 ANSI/MBCS)并且您有那些(丑陋的 C 风格)(LPWSTR)
转换,我假设您将基于字符的字符串缓冲区传递给 GetClassName() 和 GetWindowText() 等 API 时出现编译时错误,您尝试使用强制转换修复这些错误。
那是错误的。编译器实际上是在帮助您解决这些错误,因此请遵循其建议,而不是将编译器错误排除在外。
假设 Unicode 构建,您可能想要使用 wchar_t
和 std::wstring
而不是 char
和 std::string
,以及 _countof()
而不是 sizeof()
以获取 wchar_t
s,不是字节(char
s)。
例如:
// Note: wchar_t used instead of char
wchar_t class_name[80];
wchar_t title[80];
// Note: no need to cast to LPWSTR (i.e. wchar_t*)
GetClassName(hwnd, class_name, _countof(class_name));
GetWindowText(hwnd, title, _countof(title));
// Note: std::wstring used instead of std::string
std::wstring titlas(title);
std::wstring classas(class_name);
如果代码的其他部分确实使用了 std::string
,您可能希望将存储在 std::wstring
中的 UTF-16 编码文本(由 Windows API 返回)转换为 UTF -8 编码文本并将其存储在 std::string
个实例中。
我正在创建一个 dll 文件。
我的代码:
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
void test() {
EnumWindows(EnumWindowsProc, NULL);
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
char class_name[80];
char title[80];
GetClassName(hwnd, (LPWSTR) class_name, sizeof(class_name));
GetWindowText(hwnd, (LPWSTR) title,sizeof(title));
std::string titlas(title);
std::string classas(class_name);
Loggerc(titlas);
Loggerc("Gooing");
return TRUE;
}
那我直接打电话给test()
.
在日志中,titlas
为空,代码停止。
当我在带有 CodeBlock 的 Win32 应用程序中尝试此代码时,一切正常,显示所有标题。但是在dll中,它不起作用。
问题出在哪里?
char class_name[80]; char title[80]; GetClassName(hwnd, (LPWSTR) class_name, sizeof(class_name)); GetWindowText(hwnd, (LPWSTR) title,sizeof(title)); std::string titlas(title); std::string classas(class_name);
考虑到自 VS2005 以来,默认情况下一直在 Unicode 模式下构建(而不是 ANSI/MBCS)并且您有那些(丑陋的 C 风格)(LPWSTR)
转换,我假设您将基于字符的字符串缓冲区传递给 GetClassName() 和 GetWindowText() 等 API 时出现编译时错误,您尝试使用强制转换修复这些错误。
那是错误的。编译器实际上是在帮助您解决这些错误,因此请遵循其建议,而不是将编译器错误排除在外。
假设 Unicode 构建,您可能想要使用 wchar_t
和 std::wstring
而不是 char
和 std::string
,以及 _countof()
而不是 sizeof()
以获取 wchar_t
s,不是字节(char
s)。
例如:
// Note: wchar_t used instead of char
wchar_t class_name[80];
wchar_t title[80];
// Note: no need to cast to LPWSTR (i.e. wchar_t*)
GetClassName(hwnd, class_name, _countof(class_name));
GetWindowText(hwnd, title, _countof(title));
// Note: std::wstring used instead of std::string
std::wstring titlas(title);
std::wstring classas(class_name);
如果代码的其他部分确实使用了 std::string
,您可能希望将存储在 std::wstring
中的 UTF-16 编码文本(由 Windows API 返回)转换为 UTF -8 编码文本并将其存储在 std::string
个实例中。