gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:21:24 25 4
gpt4 key购买 nike

我正在使用 SetWinEventHook() 函数,就像 MSDN 的例子:https://msdn.microsoft.com/en-us/library/windows/desktop/dd373640(v=vs.85).aspx .
如上例所示,我使用 CALLBACK 函数HandleWinEvent() 来处理事件。

我对使用这种类型的函数还很陌生:什么我的理解是这个函数叫做
异步和参数自动传递。
现在我想访问函数内部的列表。
我在我的类中声明了这个函数:

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() 中给出了一个错误。

最佳答案

按照@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);
};

(我没有尝试使用 intExample2 类的列表有效)。

关于c++ - 访问 CALLBACK 函数中的对象字段 (WINAPI - C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40171698/

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