AttachThreadInput

本文介绍了如何利用Win32API的AttachThreadInput函数实现不同窗口之间的输入焦点切换,以及如何通过该函数发送特定消息(如Tab按键)到前台窗口。包括实例演示如何在程序中模拟Tab按键发送给当前活动窗口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

函数原型:

BOOL WINAPI AttachThreadInput(
  __in  DWORD idAttach,
  __in  DWORD idAttachTo,
  __in  BOOL fAttach

);

 

用法示例:

AttachThreadInput(
         ::GetWindowThreadProcessId(::GetForegroundWindow(),NULL),  //当前焦点窗口的线程ID
         ::GetCurrentThreadId(),  //自己的线程ID
         TRUE);



其他例子:如何在程序A中模拟Tab按键消息发送给前台窗口(foreground window)?
// 获取创建前台窗口的线程
DWORD dwThread = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
// 将前台窗口线程贴附到当前线程(也就是程序A中的调用线程)
AttachThreadInput(dwThread, GetCurrentThreadId(), TRUE);
// 获取焦点窗口句柄
HWND hFocus = GetFocus(); 
// 解除贴附
AttachThreadInput(dwThread, GetCurrentThreadId(), FALSE);
// 发送消息
PostMessage(hFocus, WM_KEYDOWN, VK_TAB, 0);
......

 

其他参考示例:

// 下面的代码将当前窗口带到带到最顶层,并设置为活动窗口

HWND hForegdWnd = ::GetForegroundWindow();
DWORD dwCurID = ::GetCurrentThreadId();
DWORD dwForeID = ::GetWindowThreadProcessId(hForegdWnd, NULL);
::AttachThreadInput(dwCurID, dwForeID, TRUE);
::SetForegroundWindow(GetSafeHwnd());
::AttachThreadInput(dwCurID, dwForeID, FALSE);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值