【发布时间】:2013-03-27 03:33:11
【问题描述】:
我正在构建一个需要根据活动窗口/程序加载不同设置的应用程序(例如,如果您使用的是 chrome,则加载与 Chrome 关联的设置,当您切换到 MS Word 时,MS Word设置已加载)。
现在我正在研究一个类,该类在每次活动窗口更改时从数据库中获取正确的设置。此类还将有一个“LookUp”方法,该方法根据上次获取的设置返回一个值。
描述我试图用伪代码实现的内容:
class RecipeBook{
public:
RecipeBook();
HWINEVENTEVENTHOOK hEvent;
string currentProgram;
static VOID CALLBACK WindowCallback(HWINEVENTHOOK hWinEventHook,
DWORD dwEvent,
HWND hwnd, LONG idObject,
LONG idChild,
DWORD dwEventThread,
DWORD dwmsEventTime); //Actual callback
void messageCheck(void*);
}
RecipeBook::RecipeBook(){
this->hEvent = SetWinEventHook(EVENT_SYSTEM_FOREGROUND,
EVENT_SYSTEM_FOREGROUND,
NULL,&WinEventProcCallback,
0, 0,
WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
Start messageCheck(void*) in separate thread
}
void messageCheck(void*){
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
VOID CALLBACK WindowCallback(HWINEVENTHOOK hWinEventHook,
DWORD dwEvent,
HWND hwnd, LONG idObject,
LONG idChild,
DWORD dwEventThread,
DWORD dwmsEventTime){
Get the name of the active program from the HWND handle //This is working
Update RecipeBook->CurrentProgram
}
我遇到的问题:
1) 无法让消息检查在单独的线程中运行。如果我按顺序运行代码,它工作正常。当我尝试在线程中生成 messageCheck 时(使用
AfxBeginThread(&messageCheck, ¤tProgram, THREAD_PRIORITY_NORMAL, 0, 0,NULL)
)
似乎没有创建另一个线程。
2) 我不知道如何通过回调修改 RecipeBook 中的值。我曾想过从回调中返回名称,但我还没有设法让它发挥作用。如果我可以从回调中编辑字符串,那就太好了。
3) 我想在调用 LookUp 方法时只询问当前的活动程序,但我只能找到获取调用进程 ID 的方法,而不是活动的 Windows 进程 ID。
这是一个大问题,但我们将不胜感激任何建议!
谢谢!
【问题讨论】:
-
我的第一个想法是 AfxBeginThread 需要线程函数来匹配特定的签名: UINT __cdecl MyControllingFunction( LPVOID pParam );您应该能够检查 AfxBeginThread 调用的返回值,看看是否有参数错误。
标签: c++ windows visual-studio events callback