Что происходит, когда ShowWindow
вызывается с SW_MINIMIZE
как 'nCmdShow', так это то, что оконный менеджер минимизирует окно.
Система будет отправлять различные уведомления, некоторые более важные для выполнения минимизации, и приложение может действовать, например 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;
У меня нет четкого представления о том, как вы можете решить, минимизация является неожиданной или нет, но, похоже, вы это делаете. Инициированные пользователем действия могут привести к отправке WM_SYSCOMMAND
, но я не знаю, делают ли это некоторые функции ОС, и вы сможете различить, свернет ли ОС окно или агрессивное приложение.