2

画面を完全に占有しようとしている別の積極的なアプリによって最小化される環境で実行されている Delphi アプリがあります (これは POS のものです)。2 番目のアプリケーションが開始されると、おそらくウィンドウを列挙し、'ShowWindow(handle,SW_MINIMIZE)' でヒットすることによって、ウィンドウを探し出して最小化します。

やるべきことは、これらのコマンドを選択して、ウィンドウへのサイズ変更/最小化メッセージをブロックすることだと私には思えます。この動作をキャプチャするためにいくつかのハンドラーをハッキングしてみましたが、それでも SW_MINIMIZE はそれを隠します。Winsight は、何かがサイズ変更されているなどの通知メッセージ以外はあまり表示されません。また、メッセージをフィルタリングするために WndProc 関数をオーバーライドしようとしましたが、それでもうまくいきません。

ShowWindow(handle,SW_MINIMIZE) 呼び出しがアプリケーションに与えられたときに何が起こるかについて誰かが光を当てることができれば、私は非常に感謝しています!

ありがとうテリー

4

2 に答える 2

4

がas 'nCmdShow'ShowWindowで呼び出されるとSW_MINIMIZE、ウィンドウ マネージャーがウィンドウを最小化します。

システムはさまざまな通知メッセージを送信します。いくつかは最小化を実行できるようにするために重要であり、アプリケーションはWM_WINDOWPOSCHANGINGWM_GETMINMAXINFO、、または 、 のようにWM_NCCALCSIZE通知するためだけにアクションを実行できますが、通常、これらのいずれもブロックするためのものではありません。手術。WM_WINDOWPOSCHANGEDWM_MOVEWM_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により送信が行われますが、OS の機能の一部がそれを行うかどうかはわかりません。OS がウィンドウを最小化するか、アグレッシブなアプリケーションを最小化するかを区別できます。

于 2011-07-14T16:17:12.407 に答える
0

ウィンドウは、WM_SYSCOMMANDではなくWM_COMMANDメッセージを受信します

于 2011-07-14T15:09:50.470 に答える