我建設,需要根據活動窗口/程序(例如加載不同設置的應用程序。如果您使用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