Meh*_*dad 10 windows winapi hotkeys foreground visual-c++
Raymond在博客中写了一篇关于程序如何通过使用来获取/窃取"前景爱"的博客RegisterHotkey,当被调用时,它会将前景转移到你的应用程序中.
尝试手动执行此惨遭失败(例如,使用SetForegroundWindow,SwitchToWindow等等),因为应用程序必须不能够从用户偷焦点(使按键不要去错了地方).
麻烦的是,今天我发现了一些奇怪的东西:
我尝试安全地删除外部驱动器.
暂停约7秒钟.
在暂停期间,我正在窗户内大力打字.
突然,一个消息框从我的应用程序中窃取了前景,我的输入进入了消息框.
显然,这不是使用热键机制 - 然而,Windows能够从我的应用程序中窃取焦点.
我真的怀疑有什么像"后门"只是用于这个特定的目的(虽然如果我错了请纠正我),所以,假设情况并非如此,必须有一种方法来正确地做到这一点,不 使用热键机制.
所以问题是,这是如何实现的?
汉斯指出,"后门"是AttachInputThread的,但我真的不相信这就是这里发生的情况-尤其是因为雷蒙德说,方法可能会导致挂起.想法?
正如已经提到的,不同线程的窗口的输入是独立处理的。 AttachThreadInputAPI 允许共享线程状态,特别是:
通过使用 AttachThreadInput 函数,线程可以将其输入处理机制附加到另一个线程。[...]这还允许线程共享其输入状态,因此它们可以调用 SetFocus 函数将键盘焦点设置到不同线程的窗口。
现在,当您看到当前在前台的窗口时,如果您与前台窗口线程共享您的线程状态,您SetFocus将从那里窃取焦点。
CWindow Window = GetForegroundWindow();
if(Window)
{
const DWORD nWindowThreadIdentifier = Window.GetWindowThreadID();
const DWORD nThreadIdentifier = GetCurrentThreadId();
AttachThreadInput(nThreadIdentifier, nWindowThreadIdentifier, TRUE);
GetDlgItem(IDC_EDIT).SetFocus(); // This succeeds now as we are sharing thread state with foreground window
AttachThreadInput(nThreadIdentifier, nWindowThreadIdentifier, FALSE);
m_sAction = _T("Done");
} else
m_sAction = _T("Nothing to do");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
406 次 |
| 最近记录: |