首先,放到最前

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

最新文章

  1. WPF - 属性系统 (4 of 4)
  2. MySQL 权限与安全
  3. [Asp.net 5] DependencyInjection项目代码分析2-Autofac
  4. phpStydy配置memcache扩展
  5. linux svn
  6. React Native 中组件的生命周期
  7. ORACLE 學習筆記
  8. redis客户端--jedis
  9. 使用nginx lua实现网站统计中的数据收集
  10. 分拆素数和[HDU2098]
  11. GTX 770 (GK 104)
  12. codeforce The Art of Dealing with ATM
  13. iphone 6 设置自定义铃声(未越狱)
  14. Hibernate、Mybatis 通过数据库表反向生成java类和配置
  15. (一)Memcached初学教程之安装服务篇(Windows下)
  16. jQuery UI Widget(1.8.1)工作原理--转载
  17. Mac下安装MySQL-python
  18. 奔五的人,准备学习iOS开发
  19. textContent和innerHtml
  20. java程序连接MongoDB副本集测试

热门文章

  1. 并不对劲的bzoj5341:loj2553:uoj400:p4565:[Ctsc2018]暴力写挂
  2. CSYZDay2模拟题解
  3. UI:数据的解析
  4. 关于XAMPP Apache无法启动问题解决方案
  5. Thinkpad x230i安装Ubuntu10.04发生no network devices available
  6. bzoj 2115: [Wc2011] Xor【线性基+dfs】
  7. hdu 1071 The area【定积分】
  8. A+B Problem——经典中的经典
  9. 设置mysql 定时备份任务
  10. 安装11g 数据库