我建设,需要根据活动窗口/程序(例如加载不同设置的应用程序。如果您使用Chrome,Chrome浏览器的设置同伙被加载,当您切换到MS Word,MS Word设置被加载)。更新类属性通过回调
现在我正在从数据库中每一次获取正确的设置活动窗口的变化的一类。这个类还将有一个“LookUp”方法,它返回一个基于上次获取的设置的值。
来形容我试图在伪代码来实现:
1)不能得到的消息检查,以在运行:
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
}
我与这个有问题的单独的线程。如果我按顺序运行代码,它工作正常。当我尝试产卵messageCheck在一个线程(使用
AfxBeginThread(&messageCheck, ¤tProgram, THREAD_PRIORITY_NORMAL, 0, 0,NULL)
)
它只是似乎并不像创建其他线程。
2)我不知道如何从回调中修改RecipeBook中的值。我已经想过从回调中返回名字,但我没有设法让它起作用。如果我可以在回调中编辑字符串,那将会很好。
3)我想的只是要求当前活动程序时的查找方法被调用,但我才能够找到获取调用进程的ID,而不是活动窗口的进程ID的方法。
这是一个很大的问题,但任何建议将不胜感激!
谢谢!
我的第一个想法是,AfxBeginThread需要线程函数来匹配特定的签名: UINT __cdecl MyControllingFunction(LPVOID pParam); 您应该能够检查AfxBeginThread调用的返回值以查看是否存在参数错误。 – Derek 2013-03-27 04:24:28