AttachThreadInput函数将一个线程的输入处理机制附加到另一个线程的输入处理机制。
BOOL AttachThreadInput(
DWORD 【idAttach】, | //线程附加 |
DWORD 【idAttachTo】, | //线程附加到 |
BOOL 【fAttach】 | //附加或分离 |
); |
参数
【idAttach】
指定要附加到另一个线程的线程的标识符。要连接的线程不能是系统线程。
【idAttachTo】
指定要附加到的线程的标识符。这个线程不能是系统线程。
线程不能附加到自身。因此,【idAttachTo】不能等于【idAttach】.
【fAttach】
指定是否附加或分离线程。如果此参数为TRUE,则会连接两个线程。如果参数为FALSE,则线程将被分离。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。没有可用的扩展错误信息。
备注
在不同线程中创建的Windows通常会彼此独立地进行输入。也就是说,它们具有自己的输入状态(焦点,活动,捕获窗口,键状态,队列状态等),并且它们与其他线程的输入处理不同步。通过使用AttachThreadInput函数,一个线程可以将其输入处理附加到另一个线程。这也允许线程共享其输入状态,因此他们可以调用SetFocus函数将键盘焦点设置为不同线程的窗口。这也允许线程获取密钥状态信息。这些功能通常是不可能的。
如果任一指??定的线程没有消息队列,AttachThreadInput函数将失败。当线程首次调用Win32 USER或GDI函数之一时,系统会创建线程的消息队列。如果安装了日记记录挂钩,AttachThreadInput功能也将失败。日志记录钩子将所有输入队列连接在一起。
请注意,通过调用GetKeyState或GetKeyboardState函数可以确定的密钥状态在调用AttachThreadInput后将重置。
Windows NT:您不能将线程附加到另一台桌面上的线程。
也可以看看
GetCurrentThreadId, GetKeyState, GetKeyboardState, GetWindowThreadProcessId, SetFocus