【.NET】アクティブなウィンドウ(フォーム)の設定・取得
VB.NETや、C#でのアクティブウィンドウ(フォーム)の取得や、設定の方法や非アクティブでウィンドウを表示させる方法をまとめました。
アプリケーションでアクティブなフォームを取得
VB.NETやC#で、現在アクティブなフォームを取得する場合は、Formの静的プロパティであるForm.ActiveFormを使用します。
ほかのアプリケーションがアクティブになっている場合は、VBではNothingが、C#ではnullが返ります。
'VB.NETのサンプル Dim f As Form = Form.ActiveForm If Not f Is Nothing Then 'アクティブフォームのTextを表示 MessageBox.Show(f.Text) End If
//C#のサンプル Form f = Form.ActiveForm; if (f != null) { //アクティブフォームのTextを表示 MessageBox.Show(f.Text); }
アクティブなMDI子フォームを取得
MDIのアクティブな子ウィンドウを取得したい場合は、MDIの親フォームのActiveMdiChildプロパティを使用します。
アクティブな子フォームが存在しない場合は、VBではNothingが、C#ではnullが返ります。
'VB.NETのサンプル Dim f As Form = Me.ActiveMdiChild 'MeはMDI親フォーム If Not f Is Nothing Then 'アクティブフォームのTextを表示 MessageBox.Show(f.Text) End If
//C#のサンプル Form f = this.ActiveMdiChild; //thisはMDI親フォーム if (f != null) { //アクティブフォームのTextを表示 MessageBox.Show(f.Text); }
フォームをアクティブにする
任意のフォームをアクティブ化するには、FormのActivate()メソッドを使います。
'VB.NETのサンプル 'Meがアクティブにしたいフォームの場合 Me.Activate()
//C#のサンプル //thisがアクティブにしたいフォームの場合 this.Activate();
アクティブにしないでフォームを表示させる
FormのShowWithoutActivationプロパティでtrueを返すようにすると、そのフォームを表示させてもアクティブになりません。 ShowWithoutActivationは、読み取り専用のメンバであるため、オーバーライドして戻り値を書き換える必要があります。
(この方法は.NET Framework 2.0以降でしか使えません。 1.1以前の場合は、この下のWin32 APIを使った方法をご覧ください)
'VB.NETのサンプル Public Class Form1 'フォームのコード(Formを継承したクラス)内で以下のように書きます。 Protected Overrides ReadOnly Property ShowWithoutActivation() As Boolean Get Return True '↓削除 'Return MyBase.ShowWithoutActivation End Get End Property End Class 'このフォームを 'Dim f As New From1 'f.Show() 'というように表示させてもアクティブになりません。
//C#のサンプル public partial class Form1 : Form { //フォームのコード(Formを継承したクラス)内で以下のように書きます。 protected override bool ShowWithoutActivation { get { return true; //↓削除 //return base.ShowWithoutActivation; } } } //このフォームを //From1 f = new Form1(); //f.Show(); //というように表示させてもアクティブになりません。
.NET Framework 1.1以前では、このプロパティはありません。Win32 APIのSetWindowPos関数を第7引数にSWP_NOACTIVATEというフラグを指定してウィンドウを表示させることで同様のことを実現できます。
'VB.NETのサンプル Public Class Form1 Inherits System.Windows.Forms.Form '以下をフォーム内に記述します 'WIN32 APIの宣言 <System.Runtime.InteropServices.DllImport("user32.dll")> _ Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, _ ByVal hWndInsertAfter As IntPtr, ByVal x As Integer, ByVal y As Integer, _ ByVal width As Integer, ByVal height As Integer, _ ByVal flags As Integer) As UInt32 End Function 'このメソッドでフォームを表示します Public Sub ShowWithoutActive() Const SWP_NOSIZE As Integer = &H1 Const SWP_NOMOVE As Integer = &H2 Const SWP_NOACTIVATE As Integer = &H10 Const SWP_SHOWWINDOW As Integer = &H40 SetWindowPos(Me.Handle, IntPtr.Zero, 0, 0, 0, 0, _ SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW) End Sub End Class 'ほかの場所から 'Dim f As New Form1 'f.ShowWithoutActive() 'と呼びます
//C#のサンプル public class Form1 : System.Windows.Forms.Form { //(デザイナの自動生成部分は省略) //以下をフォーム内に記述します //WIN32 APIの宣言 [System.Runtime.InteropServices.DllImport( "user32.dll")] private static extern UInt32 SetWindowPos( IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int width, int height, int flags); //このメソッドでフォームを表示します public void ShowWithoutActive() { const int SWP_NOSIZE = 0x0001; const int SWP_NOMOVE = 0x0002; const int SWP_NOACTIVATE = 0x0010; const int SWP_SHOWWINDOW = 0x0040; SetWindowPos(this.Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW ); } } //ほかの場所から //Form1 f = new Form1(); //f.ShowWithoutActive(); //と呼びます
関連図書
TrackBack URL :
Comments (1)
今日中にアクティブなフォームを取得し、別のフォームをアクティブにし処理終了後、
そのフォフォーム閉じて、元のフォームをアクティブにする処理を作成しなければならず、
助かりました。どうもありがとうございます。
コメント by 小野澤道雄 — 2009/7/11 土曜日 @ 16:33:34