禁止窗口调用 SetForegroundWindow

Disable window from calling SetForegroundWindow

提问人:Cesar 提问时间:6/13/2022 最后编辑:Jeremy FriesnerCesar 更新时间:6/14/2022 访问量:331

问:

我的工作机器上有一个严重的问题,派对软件窗口窃取了键盘焦点,使用监视工具,我检测到每当窗口窃取焦点时,它都会首先调用 SetForegroundWindowthirdwinapi

在搜索时,我找到了LockSetForegroundWindow,哇,我以为我已经解决了这个问题,但是,阻止我激活任何其他窗口。winapiLockSetForegroundWindow

我还发现可以使用 “阻止 ”窗口调用,但我对挂钩一无所知,想问一下我是否可以尝试其他方法。SetForegroundWindowhook

C++ WinAPI 失焦 集前景窗口

评论

0赞 Remy Lebeau 6/13/2022
根据文档,其他程序可以“窃取”焦点的唯一方法是它已经获得了这样做的许可。如果您一开始就不是授予权限的人,则无法取消该权限。SetForegroundWindow()
1赞 Daniel Sęk 6/13/2022
^ 除非应用程序使用 UIAutomation、热键、SwitchToThisWindow、SW_MINIMIZE/SW_RESTORE 或其他技巧强制自己进入前台。
3赞 David Heffernan 6/13/2022
删除第三方软件

答:

1赞 xMRi 6/13/2022 #1

通常打电话还不错。从 Windows XP 开始,有一个锁,即没有允许这样做的程序不会这样做。阅读文档:https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setforegroundwindowSetForegroundWindow()

以下是例外情况:

  • 该过程是前台过程。
  • 该进程由前台进程启动。
  • 进程接收到最后一个输入事件。
  • 没有前台进程。
  • 正在调试进程。
  • 前台进程不是新式应用程序或“开始”屏幕。
  • 前台未锁定(请参阅 LockSetForegroundWindow)。
  • 前台锁定超时已过期(请参阅 SystemParametersInfo 中的SPI_GETFOREGROUNDLOCKTIMEOUT)。
  • 没有菜单处于活动状态。

但是当第三方工具使用 时,它会绕过所有这些检查。AttachThreadInput()

只需删除此“坏”软件即可。请与开发人员联系。

评论

0赞 IInspectable 6/13/2022
例外清单是错误的,而且已经持续了十多年。调用不再允许非前台进程从前台线程窃取前台激活权限,从某些版本的 Windows 10(我猜是 19 岁左右?AttachThreadInput
0赞 IInspectable 6/13/2022
此外,这从来都不是安全问题。安全性通过 UIPI(和访问控制)进行处理。
0赞 xMRi 6/13/2022
该列表取自当前文档。是的,这不是安全问题,我更改了文本。
0赞 xMRi 6/13/2022
据我所知(也在我的代码中)。AttachThreadInput 到当前窗口,即地面窗口,而不是使用 SetForegroundWindow 仍然有效。
0赞 IInspectable 6/13/2022
是的,“当前文档”是错误的,而且已经存在了很长时间。