下面這種方法是我見到的最理想的,還有一些其他的方法,像通過SetWindowsPos這個API設(shè)置窗口的Z-oder到最頂層,再設(shè)置回去。還有通過把當(dāng)前窗口設(shè)置到底層,然后激活目標(biāo)窗口等等方法。
HWND hCurWnd = NULL;
DWORD dwMyID;
DWORD dwCurID;
hCurWnd = ::GetForegroundWindow();
dwMyID = ::GetCurrentThreadId();
dwCurID = ::GetWindowThreadProcessId(hCurWnd, NULL);
::AttachThreadInput(dwCurID, dwMyID, TRUE);
::SetForegroundWindow(m_hWnd);
::AttachThreadInput(dwCurID, dwMyID, FALSE);
關(guān)鍵API的使用::AttachThreadInput,這個API是連接兩個線程的,使其共享輸入焦點,鍵盤狀態(tài)等等。
下面這段COPY自百度百科:
通常,系統(tǒng)內(nèi)的每個線程都有自己的輸入隊列。本函數(shù)(既“連接線程輸入函數(shù)”)允許線程和進(jìn)程共享輸入隊列。連接了線程后,輸入焦點、窗口激活、鼠標(biāo)捕獲、鍵盤狀態(tài)以及輸入隊列狀態(tài)都會進(jìn)入共享狀態(tài) 返回值 Long,非零表示成功,零表示失敗,會設(shè)置會GetLastError 參數(shù)表 參數(shù) 類型及說明 idAttach Long,欲連接線程的標(biāo)識符(ID) idAttachTo Long,與idAttach線程連接的另一個線程的標(biāo)識符 fAttach Long,TRUE(非零)連接,F(xiàn)ALSE撤消連接。
調(diào)用這個函數(shù)時,會重設(shè)鍵盤狀態(tài)。參數(shù)類型前的IN表示這個參數(shù)是輸入?yún)?shù),可以當(dāng)它沒有。