Windows的"安全删除硬件"对话框如何获得"前景爱"?

Meh*_*dad 10 windows winapi hotkeys foreground visual-c++

Raymond在博客中写一篇关于程序如何通过使用来获取/窃取"前景爱"的博客RegisterHotkey,当被调用时,它会将前景转移到你的应用程序中.

尝试手动执行此惨遭失败(例如,使用SetForegroundWindow,SwitchToWindow等等),因为应用程序必须不能够从用户偷焦点(使按键不要去错了地方).

麻烦的是,今天我发现了一些奇怪的东西:

  1. 我尝试安全地删除外部驱动器.

  2. 暂停约7秒钟.

  3. 在暂停期间,我正在窗户内大力打字.

  4. 突然,一个消息框从我的应用程序中窃取了前景,我的输入进入了消息框.

显然,这不是使用热键机制 - 然而,Windows能够从我的应用程序中窃取焦点.

我真的怀疑有什么像"后门"只是用于这个特定的目的(虽然如果我错了请纠正我),所以,假设情况并非如此,必须有一种方法来正确地做到这一点, 使用热键机制.

所以问题是,这是如何实现的?

注意:

汉斯指出,"后门"是AttachInputThread的,但我真的不相信这就是这里发生的情况-尤其是因为雷蒙德说,方法可能会导致挂起.想法?

Rom*_* R. 0

正如已经提到的,不同线程的窗口的输入是独立处理的。 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)

另请参阅:源代码片段二进制文件