- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个 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
中的缓冲区大小,不是 以字节 (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
实例中。
关于c++ - EnumWindows 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39274583/
我有一个非常基本的问题:EnumWindows 线程安全吗? http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497(v=vs
我有一个非常基本的问题:EnumWindows 线程安全吗? http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497(v=vs
我在尝试 EnumWindows 到类中的函数时遇到了一个奇怪的错误。这是我的代码 EnumWindows(&ConsoleDetector::EnumWindowsProc, NULL); BOOL
我正在创建一个 dll 文件。 我的代码: BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam); void test() { Enu
我正在尝试创建一个功能类似于任务管理器以及许多其他功能的程序。目前,我无法使用当前的枚举函数找到所有顶级窗口。出于某种原因,它会正确枚举并填写某些应用程序的 HWND(例如 Google Chrome
从几个初步测试看来 EnumWindows总是以相反的实例化顺序返回窗口,即最近实例化的窗口最先。这是一个有效的观察吗?如果是这样,是否适用于所有版本的 Windows?这是一个可靠的假设吗,即该行为
在 Win7 64 位上使用 Delphi XE2 update 3 或 update 4。 调用 enumwindows 的工作方式与以前在 Delphi 6 中的工作方式不同。 在 Delphi
我在使用嵌套类中的回调函数的 EnumWindows 函数时遇到一些问题: TProcessWatch = class(TObject) private ... type TProce
我只是想枚举系统中的所有顶级窗口。当我在 exe 中使用 EnumWindows 函数时,它会枚举所有窗口。相反,我在服务中使用了我不能使用的服务。它只枚举 C:\Windows\System32\s
我需要打电话吗 CloseHandle()在 EnumWindows() 返回的句柄上? 最佳答案 您只能在 kernel32 中的函数返回的句柄上使用 CloseHandle()。它们是引用计数的,
这个问题在这里已经有了答案: how to pass a non static-member function as a callback? (8 个答案) 关闭 8 年前。 我可以使用成员函数作为
如何知道 EnumWindows 何时完成其窗口列表?因为 EnumWindows 接收一个回调函数作为参数,它会一直调用它,直到没有更多的窗口被列出。 最佳答案 EnumWindows() 在进行枚
我假设,我问的实际上应该是默认的,但我遇到了一些我不理解的行为。 #include "stdafx.h" using namespace std; BOOL CALLBACK enumWindowsP
在 VC++ 中,我使用 EnumWindows(...)、GetWindow(...) 和 GetWindowLong() 来获取窗口列表并检查窗口是否是顶部窗口(没有其他窗口作为所有者),并且窗口
C# 的 GetForegroundWindow() 为多个窗口返回相同的结果,EnumWindows 根本不返回那个窗口。每个进程实际上都有自己的层。 我还检查了两个 GetWindowThread
我刚刚开始使用 pywin32,所以我对它应该如何工作有点粗略,但是当我从回调中返回 False 时 win32gui.EnumWindows 不喜欢它,我不是确定为什么。例如,以下崩溃 from w
我目前正在构建在某些硬件设备上执行一些无人值守的自动化测试的应用程序。它执行一堆 .msi 安装程序,然后对它们执行测试。 这里是执行环境:- Windows 7 标准嵌入式- UAC 打开 - HK
代码一直有效。我设法让 Visual C++ Express 没有在最终返回语句中遇到断点,它似乎永远运行。 在下面的示例代码中,EnumWindows 无限枚举。枚举完所有窗口后,如何让它停止。 #
我有一个应用程序可以列出当前 session 打开的窗口。它使用 user32.dll 中的 EnumWindows 方法。 我想从 Windows 服务运行此代码,但由于该服务未附加到用户 sess
使用这段代码: internal static List EnumerateWindows() { var shellWindow = GetShellWindow(); var wi
我是一名优秀的程序员,十分优秀!