2013-03-27 82 views
0

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

它只是似乎並不像創建其他線程。

2)我不知道如何從回調中修改RecipeBook中的值。我已經想過從回調中返回名字,但我沒有設法讓它起作用。如果我可以在回調中編輯字符串,那將會很好。

3)我想的只是要求當前活動程序時的查找方法被調用,但我才能夠找到獲取調用進程的ID,而不是活動窗口的進程ID的方法。

這是一個很大的問題,但任何建議將不勝感激!

謝謝!

+0

我的第一個想法是,AfxBeginThread需要線程函數來匹配特定的簽名: UINT __cdecl MyControllingFunction(LPVOID pParam); 您應該能夠檢查AfxBeginThread調用的返回值以查看是否存在參數錯誤。 – Derek 2013-03-27 04:24:28

回答

0
GetForgroundWindow() 

這就是我一直在尋找的!

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633505(v=vs.85).aspx

出於某種原因,我試圖用GetActiveWindow(),每當我看到Forground窗口由於某種原因,我在想背景窗口。哎呀!

除非任何人都可以提供一個很好的解釋瞭如何執行多任務,回調的東西,我將只使用此功能,每當查找完成查詢當前窗口。不應該那麼頻繁,這個過程不會太長。

有興趣的人,你是如何從活動窗口獲得進程的名稱/使用的窗口句柄的PID,這是我怎麼一直在做:

DWORD processID; 
LPTSTR processName = new TCHAR[MAX_PATH]; 
DWORD nameSize = MAX_PATH; 
HWND activeWindowH = GetForegroundWindow(); 
DWORD threadID = GetWindowThreadProcessId(activeWindowH,&processID); 
HANDLE processHandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_QUERY_INFORMATION,FALSE,processID); 
BOOL nameSuccess = QueryFullProcessImageName(processHandle,0,processName,&nameSize); 

乾杯!