CALLBACK函数中的访问对象字段(WINAPI - C ++)

时间:2016-10-21 08:22:06

标签: c++ class winapi callback

我正在使用SetWinEventHook()函数,如MSDN的示例:https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640(v=vs.85).aspx
与上面的例子一样,为了处理事件,我使用了CALLBACK函数HandleWinEvent()

我在使用这种函数时非常新:我&#39我们理解的是这个功能被称为
异步并自动传递参数。
现在我想访问函数内的列表。我在班上宣布了这个功能:

Class Example
{
private: std::list <int> events;
void CALLBACK HandleWinEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd, 
                             LONG idObject, LONG idChild, 
                             DWORD dwEventThread, DWORD dwmsEventTime) 
{
events.add((int)event);
};

void Initialize_Hook()
{
    cout << "Initialization Thread messages..........." << endl;
    CoInitialize(NULL);
    g_hook = SetWinEventHook(
        EVENT_SYSTEM_FOREGROUND, EVENT_OBJECT_FOCUS,  // Range of events (4 to 5).
        NULL,                                          // Handle to DLL.
        HandleWinEvent,                                // The callback.
        0, 0,              // Process and thread IDs of interest (0 = all)
        WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); // Flags.
}
}

我只是想将事件的标识符添加到我的列表中,但它不会识别events。有一种方法可以让函数知道列表是什么吗?

更具体地说,我在.cpp文件中声明了CALLBACK函数,但我必须将它声明为void CALLBACK HandleWinEvent(...)而不是像往常一样void CALLBACK Example::HandleWinEvent(...),因为第二个选择在SetWinEventHook()中给出错误。

1 个答案:

答案 0 :(得分:1)

根据@David Heffernan提供的提示,我决定将列表声明为static。然后我写了一个静态方法来获取列表。
这样,在CALLBACK函数中我可以获得对列表的引用:

private: static std::list <int> events;
std::list <int>& getList() {
return *events;
}
// the callback is now declared in Example.cpp file
void CALLBACK HandleWinEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd, 
                             LONG idObject, LONG idChild, 
                             DWORD dwEventThread, DWORD dwmsEventTime) 
{
Example::getList().add((int)event);
};

(我没有尝试使用int,并列出了Example2类的工作原理。