MFC如何設置窗口最前


首先,放到最前

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表示窗口在鼠標點擊時不需要     獲得活動狀態,這樣就可以保證在鼠標點擊時窗口不會自動獲得焦點。     至於鼠標輸入的響應,本就與窗口是否獲得焦點無關,不會受到影響。

參考:

MSDN

SetForegroundWindow的正確用法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM