首先,放到最前

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

MFC如何设置窗口最前的更多相关文章

  1. 【MFC】设置窗口焦点

    BOOL CTMSDlg::OnInitDialog() { ...... ...... //设置窗口焦点,注意return TRUE 改成 return FALSE GetDlgItem(IDC_E ...

  2. swt shell设置窗口位于屏幕中间

    /**     * 设置窗口位于屏幕中间     * @param shell 要调整位置的窗口对象     */    public static void center(Shell shell)  ...

  3. Windows 7个性化配置,关闭Win7动画效果,设置窗口背景为“ 豆绿色”

    减少眼睛疲劳配色(豆绿色): RGB:, , ,颜色名称:#C7EDCC 1.任务栏设置 2.关闭Win7动画效果 控制面板 -> 轻松访问 -> 优化视频显示 3.去掉窗口阴影 右键单击 ...

  4. Qt 之 设置窗口边框的圆角(使用QSS和PaintEvent两种方法)

    Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口.下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this- ...

  5. VC、MFC中设置控件的背景色、标题、字体颜色、字体要注意的地方[转]

    在MFC中设置控件的背景色.字体.字体颜色.标题等属性主要是利用OnCtlColor函数来实现. 如: HBRUSH CAlarm::OnCtlColor(CDC* pDC, CWnd* pWnd, ...

  6. plsql设置窗口默认格式

    一:plsql设置窗口默认格式 窗口视图设置完毕后,选择“窗口”菜单——点击“保存”版面. 等到下次重启后,就会呈现保存的版面. OK,设置完毕!

  7. Qt 技巧:去除对话框边框 + 设置窗口可移动和透明

    1.去除对话框标题栏和边框 在构造函数里设置:    this->setWindowFlags(Qt::FramelessWindowHint); Qt::Dialog     (按照对话框的形 ...

  8. C# 跨进程 设置窗口owner

    窗口间跨进程通信 1. 发送方 public const int WM_InsertChart_Completed = 0x00AA; //查找窗口 [DllImport("User32.d ...

  9. pyqt pyside 设置窗口关闭时删除自身

    pyqt pyside 设置窗口关闭时删除自身 self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

随机推荐

  1. mongodb 关闭服务 mongod -f /root/mongodb/bin/xx.conf --shutdown

    /root/mongodb/bin/mongod -f /root/mongodb/bin/xx.conf --shutdown

  2. Tyvj:1729 文艺平衡树(saply练习)

    您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 Input 第一 ...

  3. [HEOI 2012] 采花

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2743 [算法] 首先预处理nxt[]数组 , 其中 , nxt[i]表示下一个和i号 ...

  4. CF 757 E Bash Plays with Functions —— 积性函数与质因数分解

    题目:http://codeforces.com/contest/757/problem/E 首先,f0(n)=2m,其中 m 是 n 的质因数的种类数: 而且 因为这个函数和1卷积,所以是一个积性函 ...

  5. bzoj2002 [Hnoi2010]Bounce 弹飞绵羊——分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 第一次用分块,感觉超方便啊: 如果记录每个点的弹力系数,那么是O(1)修改O(n)查询 ...

  6. sizeof注意

    1.sizeof用于获取非托管类型的大小(以字节为单位). 非托管类型包括下表列出的内置类型以及以下类型: 枚举类型 指针类型 用户定义的结构,不包含任何属于引用类型的字段或属性     struct ...

  7. hdu5335(搜索)

    Walk Out Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  8. js方式的页面跳转

    window.location.href="login.html";   (直接function里面执行 跳转)

  9. jstree获取半选中节点的方法

    $('#jstree1').jstree().get_undetermined();返回一个数组,getPara();方法无法获取数组 get_undetermined ([full])  get a ...

  10. ASP.NET Core MVC 打造一个简单的图书馆管理系统 (修正版)(一) 基本模型以及数据库的建立

    前言: 本系列文章主要为我之前所学知识的一次微小的实践,以我学校图书馆管理系统为雏形所作. 本系列文章主要参考资料: 微软文档:https://docs.microsoft.com/zh-cn/asp ...