下面這種方法是我見到的最理想的,還有一些其他的方法,像通過SetWindowsPos這個API設置窗口的Z-oder到最頂層,再設置回去。還有通過把當前窗口設置到底層,然后激活目標窗口等等方法。
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);
關鍵API的使用::AttachThreadInput,這個API是連接兩個線程的,使其共享輸入焦點,鍵盤狀態等等。
下面這段COPY自百度百科:
通常,系統內的每個線程都有自己的輸入隊列。本函數(既“連接線程輸入函數”)允許線程和進程共享輸入隊列。連接了線程后,輸入焦點、窗口激活、鼠標捕獲、鍵盤狀態以及輸入隊列狀態都會進入共享狀態 返回值 Long,非零表示成功,零表示失敗,會設置會GetLastError 參數表 參數 類型及說明 idAttach Long,欲連接線程的標識符(ID) idAttachTo Long,與idAttach線程連接的另一個線程的標識符 fAttach Long,TRUE(非零)連接,FALSE撤消連接。
調用這個函數時,會重設鍵盤狀態。參數類型前的IN表示這個參數是輸入參數,可以當它沒有。