我有一个Delphi应用程序运行在一个环境中,它被另一个试图完全占据屏幕的攻击性应用程序(它的POS东西)最小化。当第二个应用程序启动时,它可以通过枚举窗口并使用“ShowWindow(handle,SW_MINIMIZE)”命中它们来获取窗口并最小化它们。
在我看来,要做的就是拿起这些命令并阻止调整大小/最小化到窗口的消息。我已经尝试过几个处理程序来试图捕获这种行为,但SW_MINIMIZE仍会隐藏它。并且Winsight除了通知消息之外没有向我展示什么正在调整大小等等。我已经为WMSysCommand消息添加了消息处理程序,但这似乎只是停止了点击最小化按钮之类的操作。我已经尝试重写WndProc函数来过滤消息,但这并没有削减它。
如果有人能够了解在应用程序上执行ShowWindow(句柄,SW_MINIMIZE)调用时会发生什么,我将非常感激!
由于 特里
答案 0 :(得分:4)
使用ShowWindow
作为'nCmdShow'调用SW_MINIMIZE
时,窗口管理器最小化窗口会发生什么。
系统会发送各种通知消息,一些更重要的是能够执行最小化并且应用程序可以采取行动,例如WM_WINDOWPOSCHANGING
,WM_GETMINMAXINFO
,WM_NCCALCSIZE
或某些只是为了通知,例如WM_WINDOWPOSCHANGED
,WM_MOVE
,WM_SIZE
,但通常情况下,这些都不会阻止操作。
我认为,最简洁的方法是,如果您可以确定最小化是意外的,则在'wParam'为WM_SIZE
时响应SIZE_MINIMIZED
消息,并相应地恢复您的窗口。然后您的表单将从任务栏反弹回来:
type
TForm1 = class(TForm)
...
private
procedure WmSize(var Msg: TWMSize); message WM_SIZE;
end;
procedure TForm1.WmSize(var Msg: TWMSize);
begin
inherited;
if (Msg.SizeType = SIZE_MINIMIZED) and IsUnexpectedMinimize then
PostMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
end;
我对你如何决定最小化是否出乎意料没有任何明确的想法,但看起来你会这么做。用户启动的操作将导致WM_SYSCOMMAND
被发送,但我不知道某些操作系统功能是否也会这样做,并且您将能够区分操作系统是否最小化窗口或激进的应用程序。 / p>
答案 1 :(得分:0)
窗口收到WM_COMMAND消息而不是WM_SYSCOMMAND