winapi - 为什么我的 Windows 应用程序按照规则不应获得焦点?

标签 winapi focus foreground

现在,每个为 Windows 编写代码的人可能都知道应用程序无法(正式)从前台进程窃取焦点,并且 why 。但我只是无意中转移了注意力,而且不明白这怎么可能。

我有一个 Delphi 应用程序,用户可以使用热键(或通过单击鼠标,或通过 Alt+Tab)调出该应用程序,选择一段文本并按 Enter 键。然后,我的应用程序最小化(甚至隐藏到托盘),并将用户刚刚选择的文本粘贴到事件窗口中。这里没什么新东西,有很多类似的项目 - 剪贴板扩展程序、术语表、宏程序等。

令我困惑的是,在完成上述所有操作并休眠 1500 毫秒后,我恢复了主形态,并且它重新获得了焦点!它成为前台窗口,即使它不是 1500 毫秒前(已测试;Windows 7 32 位)。

事实上,我根本不想要这个,所以在恢复我的主窗体之前,我记录了哪个窗口有前景,并在将其交给我后将其返回给该窗口。我只是好奇为什么我的应用程序会出现在前台,而按照规则它不应该出现在前台。也许我并不像我想象的那样完全理解规则?

最佳答案

如果您查看 SetForegroundWindow 的文档您会看到调用成功的条件列表,其中之一是“进程收到最后一个输入事件”。因此,如果用户在您的应用程序中按 Enter 键后没有执行任何操作,您仍然有权窃取焦点。我不知道当窗口恢复时 Delphi 是否为您调用 SetForegroundWindow,但这可能值得研究。

我不知道如何恢复窗口,但将 SW_SHOWNOACTIVATEShowWindow 结合使用可能会有所帮助...

关于winapi - 为什么我的 Windows 应用程序按照规则不应获得焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9337611/

相关文章:

在内存中创建位图并使用它

windows - 了解 MAKEINTRESOURCEW 定义

winapi - 是否有相当于 `openat` 的 Windows?

Jquery - 将焦点设置到窗口

objective-c - 我可以使用 wcsession 让父 iOS 应用程序转到前台吗

c++ - 是否可以将 Windows 控制台应用程序与 Windows GUI 应用程序一起运行?

javascript - CSS :focus selector doesn't work when element is focused with . 焦点()

javascript - Ace-editor focus/blur 方法显然不能与 termlib.js 集成

opencv - 从提取的前景中删除阴影

c# - 如何创建一个保持在应用程序前台的 C# Windows 窗体