Is it possible to prevent an application from being activated (brought to front) without using DLL injection?
我需要编写应用程序A,该应用程序将WM_ACTIVATE消息拦截到应用程序B的窗口中,以防止B成为最顶层的应用程序。
是否可以在没有DLL注入的情况下做到这一点(在该消息上添加钩子,使用一系列WinAPI调用处理并"中和"它)?
- 好吧,如果可以接受,您可以破解它。用一些WM_USER替换WM_ACTIVATE值。
-
@ user1764961谢谢。我可以使用哪些功能进行更换?
-
这是某种形式的军备竞赛吗?是否将应用程序B更新为检测应用程序A并阻止其执行拦截?
-
实际上,您在这里不需要任何"功能"。分解代码,找到窗口proc并找到用于处理WM_ACTIVATE消息的代码。而不是WM_ACTIVATE(0x6)放一些WM_USER值(例如0x7400)。或者尝试修改内存位置或保存WM_ACTIVATE值的寄存器...这里不仅只有一种解决方案。这取决于代码。
-
您是说App B实际上在激活时设置为最高,还是只是在没有使其成为前台的情况下尝试激活它?通常将top-most设置为窗口本身的样式,通常在其变为活动状态时不应用,在大多数情况下有点多余,因为激活会导致窗口位于顶部。
-
@Damien_The_Unbeliever应用程序B是一个具有丑陋UI且没有自动化层的旧应用程序(即,我无法通过API访问其功能)。应用程序A是一个GUI应用程序,它允许用户通过统一的用户界面来操作应用程序B(以及其他几个应用程序)。首先,A启动B和所有其他集成应用程序。用户仅与A交互,并且B(以及其他集成应用程序)不可见。这在大多数情况下都有效,但是在一个应用程序中,某些操作(例如以编程方式在文本框中输入文本)会导致该应用程序可见(隐藏A)。
-
@JoelLucsy不,它不是最高的,但是它被覆盖在A上(B隐藏了As屏幕的大部分内容)。
-
如果B正确处理了showcmd,则可以编辑传递给createprocess的startupinfo结构的wShowWindow。
我想这就是你的追求:
LockSetForegroundWindow
http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms633532(v = vs.85).aspx
备注
如果用户按下ALT键或采取了某些措施使系统本身更改了前景窗口(例如,单击背景窗口),则系统会自动启用对SetForegroundWindow的调用。
提供此功能是为了使应用程序可以阻止其他应用程序进行前台更改,从而中断其与用户的交互。
别忘了解锁:)
编辑:
按此处所述尝试SetWinEventHook:
活动窗口上的Windows系统事件是否已更改?
然后,当不需要的窗口出现在前面时,您可以将其发送到后台。
- 我尝试了它,但不幸的是它不起作用(当我启动一个控制台应用程序X时,它调用LockSetForegroundWindow然后启动Windows Forms程序,后一个应用程序将获得最顶部的窗口)。
-
谢谢。如果我在调用LockSetForegroundWindow(1)之前执行AllowSetForegroundWindow,则您的第一个解决方案有效。