VC获取其它程序窗口焦点方法 AttachThreadInput的用法
1、不同线程的处理方法
如何在2K/xp下使窗口获取焦点
//捕捉并设置当前焦点窗口为我们的窗口
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表示窗口在鼠标点击时不需要
获得活动状态,这样就可以保证在鼠标点击时窗口不会自动获得焦点。
至于鼠标输入的响应,本就与窗口是否获得焦点无关,不会受到影响。
///
其他方法:
1.
::ShowWindow(m_hWnd, SW_SHOWNORMAL);
::SetForegroundWindow(m_hWnd);
曾经成功,但后来又不行,不知道为什么
2.SwitchToThisWindow
失败
3.
SetWindowPos(htop,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE¦SWP_NOSIZE);
ShowWindow(m_hWnd,SW_SHOW);
SetForegroundWindow(m_hWnd);
SetActiveWindow(m_hWnd);
SetFocus(m_hWnd);
获取不到焦点
在2K/XP下我们可以用 AttachThreadInput 和SetForegroundWindow来有效的获取焦点。
转自:http://blog.sina.com.cn/s/blog_4ed1e0e40100g8ag.html
今天碰到一个问题:如何在程序A中模拟Tab按键消息发送给前台窗口(foreground window)?
正常情况在对话框程序中,用户敲击Tab键后,窗体会收到WM_KEYDOWN消息,wParam为VK_TAB,而MSG结构中的hwnd则为上一个拥有键盘焦点的控件的窗口句柄。
在程序A中获取前台窗口是件容易的事,GetForegroundWindow就OK了。如何获得前台窗口上当前拥有键盘焦点的控件的窗口句柄呢?
获取拥有键盘焦点的窗口的句柄,可以用GetFocus。但是,看看MSDN中关于GetFocus的说明,有这么一句:TheGetFocus function retrieves the handle to the window that has the keyboard focus, if the window is attached to the calling thread's message queue. 前半句好理解,正是我们想要的。可是,后面有个“但是”——如果窗口贴附到(attached to)调用线程的消息队列。
这个“但是”很要命,因为前台窗口显然没有贴附到程序A的调用线程的消息队列中。怎么办?
幸好Windows为我们提供了AttachThreadInput,它可以将一个线程的输入处理机制贴附到另一个线程。这样我们就有了下面的代码:
// 获取创建前台窗口的线程
DWORD dwThread = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
// 将前台窗口线程贴附到当前线程(也就是程序A中的调用线程)
AttachThreadInput(dwThread, GetCurrentThreadId(), TRUE);
// 获取焦点窗口句柄
HWND hFocus = GetFocus();
// 解除贴附
AttachThreadInput(dwThread, GetCurrentThreadId(), FALSE);
// 发送消息
PostMessage(hFocus, WM_KEYDOWN, VK_TAB, 0);
......
VC获取其它程序窗口焦点方法 AttachThreadInput的用法相关推荐
- VC中设置程序窗口的排列层级
1. topmost窗口和non-topmost窗口 Windows中的应用程序窗口,可以按照显示效果分为topmost和non-topmost两类.top-most类型的窗口,显示时位于non-to ...
- VC++ 隐藏控制台程序窗口
转自:http://hi.baidu.com/sicceer/blog/item/d9c35a810d15c4c8bc3e1ec8.html 设置 #pragma comment( linker, & ...
- VC 获取任务栏窗口的句柄
本文将介绍一个未公开的Win32 API函数:GetTaskmanWindow,利用它对Windows的任务栏进行操作.这个函数返回拥有任务栏按钮的窗口句柄.在微软的MSDN文档中,对任务栏是这 ...
- c# 打开的窗口显示在最前面_了解各种切换程序窗口的方法,提高工作效率
一般的是直接点击程序窗口,不用多解释了.(注意不要误点中不该点的功能) 直接点程序窗口切换 当窗口太多,而且被完全遮挡时,通常会点任务栏上的程序按钮 点任务栏按钮切换(启用Aero效果) 点任务栏按钮 ...
- c#获取应用程序路径的方法
string str1 =Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名. string str2=Environm ...
- 【音视频】获取桌面程序窗口列表以及桌面、窗口的缩略图(4-4)
采集桌面.窗口,必然需要获取其列表以及缩略图.获取桌面显示器列表在<[音视频]获取视频设备-MMDeviceAPI&MONITORINFOEX(2-3)>已经讲过.本篇主要记录一下 ...
- VC++获取不同Windows版本的方法
直接来干货,说到获取Windows版本,在XP和windows7时代,通常使用的做法如下: OSVERSIONINFOEX os; os.dwOSVersionInfoSize=sizeof(OSVE ...
- VC++ 获取Windows系统标准字体方法
获取系统字体常用方法如下: LOGFONT lf = { 0 }; ::GetObject(::GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), & ...
- 隐藏基于对话框的MFC应用程序窗口的方法
(推荐这个方法,非常好用) 很多人可能会将窗口创建出来,然后用一个 ShowWindow(SW_HIDE) 的方法去隐藏窗口,当然这是可以做到隐藏的功能,但是有一点不足的地方就是窗口在隐藏之前会有一下 ...
最新文章
- 代码片段--批量生产库以及可执行文件的依赖关系
- centos部署Redis和Java开发(Jedis)
- b^3 - a^3 = c
- ./configure: error: the HTTP gzip module requires the zlib library.
- super在python3和python2_Python扩展与 – 使用super()python 3 vs python 2
- php中上传图片怎么显示出来,PHP上传图片类显示缩略图功能
- 下载 | 李宏毅:1 天搞懂深度学习,我总结了 300 页 PPT
- jenkins+k8s实现持续集成
- 关于怎么获取jsp的web站点的目录问题
- AVB2 avbtool.py脚本常用命令
- 申请美国大学计算机专业,申请美国大学计算机CS专业的4个要点
- 语音信号处理及特征提取
- 第十六章 python Pygame的使用
- HTML5的文档声明
- 蓝桥杯 历年试题 矩阵翻硬币
- 我的申请已经通过审核,你想成为阿里云 MVP 吗?
- vite安装失败问题Emitted ‘error‘ event on ChildProcess instance at:-4058esbuild.exe
- EasyRecovery15Mac全面好用的苹果电脑数据恢复app
- BlockQueue
- Oracle 中文转为拼音