2016-10-12 19 views
4

我々はのDelphi 2007アプリケーションを持っており、最近Windows Aeroのサポートを強化するためにMainFormOnTaskBarを有効にしました。しかし、クリックするとメインフォームがすべての子フォームの一番上に来ることはないので、次のコードを追加しました。このDelphiアプリケーションのメインフォームは、前面に一時的にフリックする

procedure TBaseForm.CreateParams(var Params: TCreateParams); 
begin 
    inherited CreateParams(Params); 

    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; 
    Params.WndParent := 0; 
end; 

1つの副作用は、再び戻って、フロントにその特定のホットキーメインフォームフリックを処理していない子フォームにAltキー + キーホットキーを押したときにということです。ホットキーが処理されると、ホットキーが飲み込まれた可能性が高いため、この動作は発生しません。

誰かがこの現象を経験しており、回避策をアドバイスできますか?別のフォームがアクティブになっている場合でも、あなたは、メインフォームのメニューからメニュー項目を選択することができるように

おかげ

+0

'MainFormOnTaskbar'が真のときに' CreateParams() 'をオーバーライドする必要はありません。基本実装では、すでに同じ値が設定されています。 'MainForm'をクリックすると、クリックされたときに上部に移動します。これは通常のウィンドウの動作です。 –

+1

@Remy - MainFormOnTaskbarがtrueの場合、すべてのセカンダリフォームはメインフォームによって所有されます。これにより、メインフォームがセカンダリフォームの前に入らなくなります。 –

+0

あなたはおそらく他の問題にもぶつかるでしょう。回避策セクションの[こちら](http://qc.embarcadero.com/wc/qcmain.aspx?d=49410)を参照してください。おそらく他の人もそうです... –

答えて

5

観察された行動は、メインフォーム上の可能なメインメニューのVCLの加速器のサポートの結果です。

場合、コマンドタイプ「アプリケーション」が「WinControl」(第二形態)のWM_SYSCOMMANDハンドラから送信されるCM_APPSYSCOMMANDメッセージを処理している間に、メインフォームの活性化は、主フォームのハンドル上SetFocus呼び出しにより行われますSC_KEYMENU(ウィンドウメニューのアクティブ化 - Altキー)です。

この動作は、MainFormOnTaskBarを使用し、CreateParamsを上書きして前面に表示できるという副作用ではありません。同じ動作は、MainFormOnTaskBarの設定に関係なく発生します。唯一の違いは、起動されたメインフォームがセカンダリフォームの前に来ることはできませんが、メインフォームはすべて同じになっていることです。

セカンダリフォームのWM_SYSKEYDOWNハンドラやセカンダリフォームのOnKeyDownなど、さまざまな場所で動作を変更して変更できます。意味的により正確なオーバーライドIMOは、二次フォームのIsShortCutで実行する必要があります。あなたが知っているように、セカンダリフォームがキーの組み合わせを処理するとき、システムキーの処理は終了します。あなたは、その後、フォームにキーを必要とするというVCLを伝えることができます:もちろん

type 
    TSecondaryForm = class(TForm) 
    .. 
    public 
    function IsShortCut(var Message: TWMKey): Boolean; override; 

... 

function TSecondaryForm.IsShortCut(var Message: TWMKey): Boolean; 
begin 
    Result := True; 
end; 

を使用すると、条件付きパラメータに応じて、trueを返すために微調整することができます。

関連する問題