gpt4 book ai didi

c++ - Windows 类型不允许我的回调访问局部变量,有什么解决方法吗?

转载 作者:可可西里 更新时间:2023-11-01 09:47:04 27 4
gpt4 key购买 nike

我正在尝试使用 EnumWindows函数,它需要一个 WNDENUMPROC作为带有 lambda 的回调以访问局部变量。不幸的是,如果我尝试使用 [&],编译器会告诉我类型不匹配。我在尝试什么:

HWND get_wallpaper_window()
{
HWND progman = FindWindow(L"ProgMan", NULL);
SendMessageTimeout(progman, 0x052C, 0, 0, SMTO_NORMAL, 1000, nullptr);

HWND wallpaper_hwnd;
EnumWindows(
// Error here
[&](HWND hwnd, LPARAM lParam) -> BOOL CALLBACK
{
HWND p = FindWindowEx(hwnd, NULL, L"SHELLDLL_DefView", NULL);
if (p) { wallpaper_hwnd = FindWindowEx(NULL, hwnd, L"WorkerW", NULL); }
}
, NULL);
return wallpaper_hwnd;
}

我能想出的唯一解决方案是将 wallpaper_hwnd 设为全局并使用 [] 定义 lambda,但由于它仅在从该函数返回时才需要,而不是全局需要,所以我宁愿避免这样做.

我比人们建议的更喜欢使用全局变量,但我只在全局变量与整个程序交互时才这样做,而事实并非如此。

还有什么更好的解决方案吗?

最佳答案

捕获外部变量的 Lambda 函数不能用作 Win32 回调。它们不能转换为原始函数指针。

针对您的情况,解决方案是传递一个指向某物的指针作为 EnumWindows() 的 LPARAM 参数,该参数传递给回调。

class A {...};
A a;
EnumWindows([](HWND hwnd,LPARAM lParam) -> BOOL {
A* a = (A*)lParam;
...
},(LPARAM)&a);

大多数需要回调的 Windows 函数都支持传递用户定义的值,该值可以是指向结构的指针。编译器足够智能,可以自动将非捕获 lambda 转换为 CALLBACK (=_stdcall) 调用约定。

关于c++ - Windows 类型不允许我的回调访问局部变量,有什么解决方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com