【发布时间】:2012-03-09 09:43:44
【问题描述】:
现在每个为 Windows 编写的人都可能知道应用程序不能(正式)从前台进程中窃取焦点,why。但是我只是无意中设法转移了注意力,并且不明白这怎么可能。
我有一个 Delphi 应用程序,用户使用热键(或通过鼠标单击或 Alt+Tab)调出,选择一段文本并按 Enter。然后我的应用程序最小化(甚至隐藏到托盘),并将刚刚选择的文本用户粘贴到活动窗口中。这里没有什么新鲜事,有很多类似的项目——剪贴板扩展器、词汇表、宏程序等。
让我感到困惑的是,在完成上述所有操作然后休眠 1500 毫秒后,我恢复了我的主窗体,它重新获得了焦点!它成为前景窗口,即使它不是 1500 毫秒前(测试;Windows 7 32 位。)。
事实上,我根本不想要这个,所以在恢复我的主窗体之前,我记录了哪个窗口有前景,并在它被给我之后将它还给那个窗口。我只是好奇为什么我的应用程序在规则上不应该出现在前台。也许我没有像我想象的那样完全理解规则?
【问题讨论】:
-
这与你的程序睡眠 1500 毫秒没有任何关系,这取决于用户睡眠的时间。如果用户没有生成任何输入事件,应用程序可以窃取前台。
-
睡眠只是为了给所有的窗口时间来整理他们的东西。主窗体的最小化和隐藏应该将焦点从我身上移开(他们确实这样做了;GetForegroundWindow 返回一个不是我自己的窗口)。所以有一点我确定我的窗口没有焦点,但它又回到了恢复。我不知道对输入事件的依赖 - 如果您将其发布为一个答案,这听起来像是一个答案。你能说更多吗?在用户一段时间没有触摸键盘或鼠标后,任何进程都可以使自己成为前台吗?
标签: winapi focus foreground