首先,放到最前
this->SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//使窗口總是在最前面
this->SetWindowPos(&wndNoTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//使窗口可以被其他窗口覆蓋
2、改變系統環境參數
這些定義winuser.h里都有的
#define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000 #define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001 #define SPIF_UPDATEINIFILE 0x0001 #define SPIF_SENDWININICHANGE 0x0002
先設置環境變量
DWORD lockTime = 0;
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &lockTime, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0,
SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);
退出程序時還原環境變量
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, lockTime, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);
3、AllowSetForegroundWindow
HMODULE hModule = NULL; ASFW_PTR pProcAddress = NULL; hModule = GetModuleHandle("User32");
if (hModule != NULL) pProcAddress = (ASFW_PTR)GetProcAddress(hModule, "AllowSetForegroundWindow");
if (pProcAddress != NULL) { nResult = (*pProcAddress)(-1);
if (nResult == FALSE ) MessageBox(NULL, "Could not set foreground permission", NULL, MB_OK | MB_ICONERROR); } 獲得焦點: void CBillValidatorDlg::SetActive(HWND m_hWnd) { DWORD dwForeID; DWORD dwCurID; HWND hForeWnd = ::GetForegroundWindow(); dwCurID = ::GetCurrentThreadId(); dwForeID = ::GetWindowThreadProcessId( hForeWnd, NULL ); ::AttachThreadInput( dwCurID, dwForeID, TRUE); //獲取輸入焦點 ::SetWindowPos( m_hWnd, HWND_TOPMOST, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE ); //設置Z-Order ::SetWindowPos( m_hWnd, HWND_NOTOPMOST, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE ); //還原Z-Order ::SetForegroundWindow( m_hWnd ); ::AttachThreadInput( dwCurID, dwForeID, FALSE); }
1、不同線程的處理方法
如何在2K/xp下使窗口獲取焦點 在2K/XP下我們可以用 AttachThreadInput 和SetForegroundWindow來有效的獲取焦點。
//捕捉並設置當前焦點窗口為我們的窗口 AttachThreadInput( GetWindowThreadProcessId( ::GetForegroundWindow(),NULL), GetCurrentThreadId(),TRUE); //置我們的為焦點窗口 SetForegroundWindow(); SetFocus(); //釋放thread AttachThreadInput( GetWindowThreadProcessId( ::GetForegroundWindow(),NULL), GetCurrentThreadId(),FALSE);
2、同線程下的窗口無焦點彈出的方法
在windows的窗口系統中,popup窗口的焦點是與它的活動狀態密切相關的。只要使 popup窗口不獲得活動狀態,popup窗口就不會自動獲得焦點。具體方法如下: 1. 在創建popup窗口時不要有WS_VISIBLE風格,然后調用SetWindowPos函數顯示 創建的窗口,參數uFlag取值SWP_SHOWWINDOW and SWP_NOACTIVATE,這樣就可以保證 窗口在創建是不會得到活動狀態,也就不會獲得焦點。 2. 響應WM_MOUSEACTIVATE消息,返回MA_NOACTIVATE表示窗口在鼠標點擊時不需要 獲得活動狀態,這樣就可以保證在鼠標點擊時窗口不會自動獲得焦點。 至於鼠標輸入的響應,本就與窗口是否獲得焦點無關,不會受到影響。
參考:
