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的正确用法

 

posted @ 2018-07-24 21:32  余生以学  阅读(3896)  评论(0编辑  收藏  举报