我正在使用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()
中给出错误。
答案 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
类的工作原理。