掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Form2のみ、常に、他のソフトの上にするには? (ID:36150)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
お早うございます.Mr.XRAYです. >これをForm2のみにしたいのですが・・・。 Form2が該当アプリのメインフォームでない場合は難しいですね. 以下は,表示するForm2のWindowProcのサブクラス化でやる方法です. ただし,他のアプリが同じことをやっていると,動作は保障できまません. >いろいろ手はありますが・・・ ということなので,方法,考え方の1つです. 同じDelphi6(Windows XP SP3)でテストしてみました. Vistaでは正常動作しない場合もあります(アプリの構成による). なお, >Form2が常にアクティブになるために、Form1の操作が不能になりました。 ----- メインフォーム(ここではForm1)からForm2を呼出すコード ----- procedure TForm1.Button1Click(Sender: TObject); begin Form2.Show; end; ---- Form2のコード ----- unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private 宣言 } public { Public 宣言 } OriginalProc:TWndMethod; procedure SubClassProc(var Message:TMessage); end; var Form2: TForm2; implementation {$R *.dfm} //============================================================================= // 元のWindowsProcを退避して新しいWindowProcを定義 //============================================================================= procedure TForm2.FormCreate(Sender: TObject); begin OriginalProc := Self.WindowProc; Self.WindowProc := SubClassProc; end; //============================================================================= // アプリのメインフォームではないのでWindowsProcを元に戻しておく // Form2を表示開始時にCreateする場合は不要 //============================================================================= procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Self.WindowProc := OriginalProc; end; //============================================================================= // WindowProcのサブクラス //============================================================================= procedure TForm2.SubClassProc(var Message: TMessage); //Targetが最前面かを判定する関数 function IsTopMost(Target: HWND): boolean; begin Result := ((GetWindowLong(Target, GWL_EXSTYLE) and WS_EX_TOPMOST) <> 0); end; //--------------------------------------------------------------------------- begin OriginalProc(Message); //このフォームが最前面でなければ最前面にする if IsTopMost(Self.Handle)=False then begin SetWindowPos(Self.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_NOOWNERZORDER); end; end; end. サブクラス化の参考ページ http://mrxray.on.coocan.jp/Halbow/Notes/N004.html
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.