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表示窗口在鼠标点击时不需要
获得活动状态,这样就可以保证在鼠标点击时窗口不会自动获得焦点。
至于鼠标输入的响应,本就与窗口是否获得焦点无关,不会受到影响。
参考:
最新文章
- WPF - 属性系统 (4 of 4)
- MySQL 权限与安全
- [Asp.net 5] DependencyInjection项目代码分析2-Autofac
- phpStydy配置memcache扩展
- linux svn
- React Native 中组件的生命周期
- ORACLE 學習筆記
- redis客户端--jedis
- 使用nginx lua实现网站统计中的数据收集
- 分拆素数和[HDU2098]
- GTX 770 (GK 104)
- codeforce The Art of Dealing with ATM
- iphone 6 设置自定义铃声(未越狱)
- Hibernate、Mybatis 通过数据库表反向生成java类和配置
- (一)Memcached初学教程之安装服务篇(Windows下)
- jQuery UI Widget(1.8.1)工作原理--转载
- Mac下安装MySQL-python
- 奔五的人,准备学习iOS开发
- textContent和innerHtml
- java程序连接MongoDB副本集测试
热门文章
- 并不对劲的bzoj5341:loj2553:uoj400:p4565:[Ctsc2018]暴力写挂
- CSYZDay2模拟题解
- UI:数据的解析
- 关于XAMPP Apache无法启动问题解决方案
- Thinkpad x230i安装Ubuntu10.04发生no network devices available
- bzoj 2115: [Wc2011] Xor【线性基+dfs】
- hdu 1071 The area【定积分】
- A+B Problem——经典中的经典
- 设置mysql 定时备份任务
- 安装11g 数据库