2

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

在我看来,要做的事情是获取这些命令并阻止调整窗口大小/最小化消息。我已经尝试破解一些处理程序来尝试捕获这种行为,但 SW_MINIMIZE 仍然会隐藏它。除了通知消息正在调整大小等之外,Winsight 没有向我显示太多。我已经为 WMSysCommand 消息放入了消息处理程序,但这似乎只会停止诸如单击最小化按钮之类的操作。我已经尝试覆盖 WndProc 函数来过滤消息,但这也没有削减它。

如果有人能阐明在应用程序上调用 ShowWindow(handle,SW_MINIMIZE) 时会发生什么,我将不胜感激!

谢谢特里

4

2 回答 2

4

ShowWindow使用“nCmdShow”调用时会发生什么情况是SW_MINIMIZE窗口管理器最小化窗口。

系统将发送各种通知消息,一些更重要的是能够执行最小化并且应用程序可以对其进行操作,例如WM_WINDOWPOSCHANGING, WM_GETMINMAXINFO, WM_NCCALCSIZE,或者一些只是通知,例如WM_WINDOWPOSCHANGED, WM_MOVE, WM_SIZE,但通常这些都不是为了阻止手术。

我认为,如果您可以确定最小化是意外的,最简洁的方法WM_SIZE是在 'wParam' 为 时响应消息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;

我对您如何决定最小化是否意外,但似乎您没有任何明确的想法。用户启动的操作会导致 aWM_SYSCOMMAND被发送,但我不知道某些操作系统功能是否也这样做,您将能够区分操作系统是最小化窗口还是激进的应用程序。

于 2011-07-14T16:17:12.407 回答
0

窗口收到 WM_COMMAND 消息而不是 WM_SYSCOMMAND

于 2011-07-14T15:09:50.470 回答