现在,每个为 Windows 编写代码的人可能都知道应用程序无法(正式)从前台进程窃取焦点,并且 why 。但我只是无意中转移了注意力,而且不明白这怎么可能。
我有一个 Delphi 应用程序,用户可以使用热键(或通过单击鼠标,或通过 Alt+Tab)调出该应用程序,选择一段文本并按 Enter 键。然后,我的应用程序最小化(甚至隐藏到托盘),并将用户刚刚选择的文本粘贴到事件窗口中。这里没什么新东西,有很多类似的项目 - 剪贴板扩展程序、术语表、宏程序等。
令我困惑的是,在完成上述所有操作并休眠 1500 毫秒后,我恢复了主形态,并且它重新获得了焦点!它成为前台窗口,即使它不是 1500 毫秒前(已测试;Windows 7 32 位)。
事实上,我根本不想要这个,所以在恢复我的主窗体之前,我记录了哪个窗口有前景,并在将其交给我后将其返回给该窗口。我只是好奇为什么我的应用程序会出现在前台,而按照规则它不应该出现在前台。也许我并不像我想象的那样完全理解规则?
最佳答案
如果您查看 SetForegroundWindow 的文档您会看到调用成功的条件列表,其中之一是“进程收到最后一个输入事件”。因此,如果用户在您的应用程序中按 Enter 键后没有执行任何操作,您仍然有权窃取焦点。我不知道当窗口恢复时 Delphi 是否为您调用 SetForegroundWindow,但这可能值得研究。
我不知道如何恢复窗口,但将 SW_SHOWNOACTIVATE
与 ShowWindow
结合使用可能会有所帮助...
关于winapi - 为什么我的 Windows 应用程序按照规则不应获得焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9337611/