システム開発・Webサイト構築 プラスラス

2009/2/24 火曜日

【.NET】アクティブなウィンドウ(フォーム)の設定・取得

このエントリーを含むはてなブックマーク Yahoo!ブックマークに登録 Google ブックマーク del.icio.us

VB.NETや、C#でのアクティブウィンドウ(フォーム)の取得や、設定の方法や非アクティブでウィンドウを表示させる方法をまとめました。

Formに関するTips


アプリケーションでアクティブなフォームを取得

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();
//と呼びます

関連図書

Filed under: C#,Programming,VB.NET — Nakai @ 20:26:24

1件のコメント »

  1. 今日中にアクティブなフォームを取得し、別のフォームをアクティブにし処理終了後、
    そのフォフォーム閉じて、元のフォームをアクティブにする処理を作成しなければならず、
    助かりました。どうもありがとうございます。

    コメント by 小野澤道雄 — 2009/7/11 土曜日 @ 16:33:34

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.871 sec. Powered by WordPress