今天碰到一个问题:如何在程序A中模拟Tab按键消息发送给前台窗口(foreground window)?

正 常情况在对话框程序中,用户敲击Tab键后,窗体会收到WM_KEYDOWN消息,wParam为VK_TAB,而MSG结构中的hwnd则为上一个拥有键盘焦点的控件的窗口句柄。

在程序A中获取前台窗口是件容易的事,GetForegroundWindow就OK了。如何获得前台窗口上当前拥有键盘焦点的控件的窗口句柄呢?

获取拥有键盘焦点的窗口的句柄,可以用GetFocus。但是,看看MSDN中关于GetFocus的说明,有这么一句:The GetFocus  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);
       ......

AttachThreadInput的用法相关推荐

  1. VC获取其它程序窗口焦点方法 AttachThreadInput的用法

    1.不同线程的处理方法 如何在2K/xp下使窗口获取焦点 //捕捉并设置当前焦点窗口为我们的窗口 AttachThreadInput(     GetWindowThreadProcessId(    ...

  2. [转]无焦点显示窗口解决方法 [转]AttachThreadInput的用法

    tag: 激活无焦点窗口 转自:http://blog.csdn.net/abcpanpeng/archive/2009/12/29/5099580.aspx 1.不同线程的处理方法 如何在2K/xp ...

  3. 无焦点显示窗口解决方法 [转]AttachThreadInput的用法

    tag: 激活无焦点窗口 转自:http://blog.csdn.net/abcpanpeng/archive/2009/12/29/5099580.aspx 1.不同线程的处理方法 如何在2K/xp ...

  4. [Windows编程] 使用AttachThreadInput 来捕捉其它窗口的键盘输入

    在一些情况下(比如屏幕软键盘或者输入法程序),自己的窗口没有输入焦点但是想要当前焦点窗口的键盘输入消息,可以使用Win32 API函数AttachThreadInput()来解决这个问题.Attach ...

  5. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  6. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  7. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  8. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  9. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

最新文章

  1. 素数和_只愿与一人十指紧扣_新浪博客
  2. mac qt android开发环境搭建,Mac 下 PyQt5 的开发环境搭建
  3. Python 网络服务相关 杂记
  4. VA01销售订单增强MV45AFZZ注意点
  5. 小程序----使用Less
  6. AspNetCore在docker部署时遇到一个小坑
  7. 很遗憾,总对工作挑挑拣拣的家伙,一般结局都不会太好
  8. 【软件领域知识整理】贵金属交易的K线图解释(二)
  9. 【转载】100多个很有用的JavaScript函数以及基础写法大集合
  10. 移动平均滤波器 matlab,移动平均滤波的原理---matlab函数的实现smooth
  11. ffice 2016 文件运行excel的数据透视表中的数据切片器的时候自动关闭
  12. exchange功能在线测试
  13. linux下下载fnl数据,NCEP再分析资料FNL数据在windows平台用cygwin批量下载方法
  14. Tipard Mac Video Converter Ultimate如何在Mac上转换DVD 视频?
  15. 重构:从方法论到实践
  16. 前端复习笔记(一)——HTML
  17. 【JanusGraph入门】(第一天,下载项目)
  18. 固态硬盘坏块修复工具_坏道和坏块什么区别?硬盘高级修复教程来了
  19. micropython(esp8266)SG90舵机控制
  20. win10计算机控制面板在哪里,windows10系统控制面板在哪里?快速找到Win10控制面板的三种方法...

热门文章

  1. vscode在html预览看到图片的插件_PPT最好用的插件合集
  2. 智慧用电安全监控管理系统
  3. 不要作温水里的那只青蛙
  4. centos7查看mysql日志_centos7开启mysql日志
  5. OpenCV人脸识别代码
  6. git pull 和git push时候没有指定branch报错
  7. 基于Python机器视觉的远程害虫种类识别和数量检测系统 报告+项目源码及数据
  8. python 根据经纬度计算两点距离
  9. form表单的提交以及触发方式
  10. 钧测-房屋安全鉴定在什么时候需要做?