我可以使用成员函数作为EnumWindows的第一个参数

时间:2013-12-11 14:00:15

标签: c++ windows winapi

我可以使用成员函数作为EnumWindows的第一个参数吗?在这种情况下,即使使用boost::bind,我也看不到任何解决方法。

2 个答案:

答案 0 :(得分:5)

鉴于此正常回调函数:

BOOL CALLBACK EnumWindowsProc(HWND wnd, LPARAM lParam);

您可以使用EnumWindows调用lParam向其传递指向您班级的指针:

EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(this));

EnumWindowsProc中,您只需调用成员函数(将lParam强制转换为您的类类型)。像这样:

BOOL CALLBACK EnumWindowsProc(HWND wnd, LPARAM lParam)
{
    return reinterpret_cast<MyClass*>(lParam)->EnumWindows(wnd);
}

如果您不想公开您的课程方法,您可以:

  • 打包一个结构,以包含类实例和指向成员的指针。
  • 使用代理的库。
  • 使用提升std:bind(在这种情况下,它会很好用,因为你是在自己的班级成员上做的,但不一定是__stdcall)。

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

答案 1 :(得分:3)

EnumWindows采用类似于此的回调

BOOL CALLBACK 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;

}

你会像这样使用它

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