阻止其他程序最小化我的Win32应用程序

时间:2011-07-14 14:10:31

标签: delphi win32gui

我有一个Delphi应用程序运行在一个环境中,它被另一个试图完全占据屏幕的攻击性应用程序(它的POS东西)最小化。当第二个应用程序启动时,它可以通过枚举窗口并使用“ShowWindow(handle,SW_MINIMIZE)”命中它们来获取窗口并最小化它们。

在我看来,要做的就是拿起这些命令并阻止调整大小/最小化到窗口的消息。我已经尝试过几个处理程序来试图捕获这种行为,但SW_MINIMIZE仍会隐藏它。并且Winsight除了通知消息之外没有向我展示什么正在调整大小等等。我已经为WMSysCommand消息添加了消息处理程序,但这似乎只是停止了点击最小化按钮之类的操作。我已经尝试重写WndProc函数来过滤消息,但这并没有削减它。

如果有人能够了解在应用程序上执行ShowWindow(句柄,SW_MINIMIZE)调用时会发生什么,我将非常感激!

由于 特里

2 个答案:

答案 0 :(得分:4)

使用ShowWindow作为'nCmdShow'调用SW_MINIMIZE时,窗口管理器最小化窗口会发生什么。

系统会发送各种通知消息,一些更重要的是能够执行最小化并且应用程序可以采取行动,例如WM_WINDOWPOSCHANGINGWM_GETMINMAXINFOWM_NCCALCSIZE或某些只是为了通知,例如WM_WINDOWPOSCHANGEDWM_MOVEWM_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