C++ 我可以使用成员函数作为枚举窗口的第一个参数吗

C++ 我可以使用成员函数作为枚举窗口的第一个参数吗,c++,windows,winapi,C++,Windows,Winapi,我可以使用成员函数作为EnumWindows的第一个参数吗?在这种情况下,即使使用boost::bind给定此正常回调函数,我也看不到任何解决方法: BOOL CALLBACK EnumWindowsProc(HWND wnd, LPARAM lParam); 您可以使用lParam调用EnumWindows,向其传递指向您的类的指针: EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(this)); 如果不想公开类方法,

我可以使用成员函数作为
EnumWindows
的第一个参数吗?在这种情况下,即使使用
boost::bind

给定此正常回调函数,我也看不到任何解决方法:

BOOL CALLBACK EnumWindowsProc(HWND wnd, LPARAM lParam);
您可以使用
lParam
调用
EnumWindows
,向其传递指向您的类的指针:

EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(this));
如果不想公开类方法,可以:

  • 打包结构以同时包含类实例和指向成员的指针
  • 使用代理库
  • 使用boost
    std:bind
    (在这种情况下,它会很好地工作,因为您可以在自己的类成员上执行它,而不必是
    \uu stdcall

无论您将使用什么,您都可以在此处找到更多详细信息。

EnumWindows接受如下回调

auto f = std::make_shared<func_type>(std::bind(&mymemberfunction,this));
EnumWindows(MyEnumProc,reinterpret_cast<LPARAM>(f.get()));

//Make sure to keep the shared_ptr around until you are done enumerating
BOOL回调EnumWindowsProc(HWND-HWND,LPARAM-LPARAM)

不能使用具有捕获的成员函数或lambda。你可以这样做

typedef std::function<bool(HWND hwnd)> func_type;
BOOL CALLBACK MyEnumProc(HWND hwnd, LPARAM lparam)
{
    auto& func = *reinterpret_cast<func_type*>(lparam);
    if(func(hwnd))return TRUE;
    else return FALSE;

}
typedef std::function func_type;
BOOL回调MyEnumProc(HWND-HWND,LPARAM-LPARAM)
{
auto&func=*重新解释强制转换(lparam);
if(func(hwnd))返回TRUE;
否则返回FALSE;
}
你会像这样使用它吗

auto f = std::make_shared<func_type>(std::bind(&mymemberfunction,this));
EnumWindows(MyEnumProc,reinterpret_cast<LPARAM>(f.get()));

//Make sure to keep the shared_ptr around until you are done enumerating
auto f=std::make_shared(std::bind(&mymemberfunction,this));
枚举窗口(MyEnumProc,reinterpret_cast(f.get());
//在完成枚举之前,请确保保留共享的\u ptr

或者,您可以使用
lParam
创建自己的
bind
函数(使用右调用约定),向其传递指向成员函数的指针…@hmjd Visual Studio2013@FrozenHeart,您应该能够使用lambda(我目前没有访问VS编译器的权限).@hmjd捕获lambdas无法转换为自由函数。@hmjd捕获lambdas显然无法转换为自由函数,因为它怎么知道从何处获取捕获的变量?你是对的,我收回我所说的。你的编译器允许将“this”的静态_转换为LPARAM?@manuell非常正确,修正了…这里写的未编译代码片段的价格@Adriano我真的很想看看std::bind案例的代码(奖金,在OP问题中)@manuell只要看看John的答案(或者我的答案中的链接到另一个SO帖子)。它有点太罗嗦了,但或多或少就是这样。