英語で読む

次の方法で共有


NativeWindow クラス

定義

ウィンドウ ハンドルとウィンドウ プロシージャの下位のカプセル化を提供します。

public class NativeWindow : MarshalByRefObject
public class NativeWindow : MarshalByRefObject, System.Windows.Forms.IWin32Window
継承
NativeWindow
実装

次のコード例では、ウィンドウ プロシージャでオペレーティング システム ウィンドウ メッセージをインターセプトし、特定のオペレーティング システム ウィンドウ クラス名を持つウィンドウを作成する方法を示します。 この例では、これを実現する を NativeWindow 継承する 2 つのクラスを作成します。

クラスは MyNativeWindowListener 、コンストラクターに渡されたフォームのウィンドウ プロシージャにフックし、 メソッドを WndProc オーバーライドしてウィンドウ メッセージを WM_ACTIVATEAPP インターセプトします。 クラスは、 メソッドと ReleaseHandle メソッドを使用して、 がAssignHandle使用するウィンドウ ハンドルを識別する方法をNativeWindow示します。 ハンドルは、 イベントと Control.HandleDestroyed イベントにControl.HandleCreated基づいて割り当てられます。 ウィンドウ メッセージを WM_ACTIVATEAPP 受信すると、 クラスは メソッドを form1.ApplicationActivated 呼び出します。

クラスはMyNativeWindow、 を に設定して新しいウィンドウをClassNameBUTTON作成します。 クラスでは、 メソッドを使用し、 CreateHandle メソッドをオーバーライドして WndProc 、受信したウィンドウ メッセージをインターセプトする方法を示します。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace NativeWindowApplication
{
    // Summary description for Form1.
    public class Form1 : System.Windows.Forms.Form
    {
        private MyNativeWindowListener nwl;
        private MyNativeWindow nw;

        internal void ApplicationActivated(bool ApplicationActivated)
        {
            // The application has been activated or deactivated
            System.Diagnostics.Debug.WriteLine("Application Active = " + ApplicationActivated.ToString());
        }

        private Form1()
        {
            this.Size = new System.Drawing.Size(300, 300);
            this.Text = "Form1";

            nwl = new MyNativeWindowListener(this);
            nw = new MyNativeWindow(this);
        }

        // The main entry point for the application.
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
    }

    // NativeWindow class to listen to operating system messages.
    internal class MyNativeWindowListener : NativeWindow
    {
        // Constant value was found in the "windows.h" header file.
        private const int WM_ACTIVATEAPP = 0x001C;

        private Form1 parent;

        public MyNativeWindowListener(Form1 parent)
        {

            parent.HandleCreated += new EventHandler(this.OnHandleCreated);
            parent.HandleDestroyed += new EventHandler(this.OnHandleDestroyed);
            this.parent = parent;
        }

        // Listen for the control's window creation and then hook into it.
        internal void OnHandleCreated(object sender, EventArgs e)
        {
            // Window is now created, assign handle to NativeWindow.
            AssignHandle(((Form1)sender).Handle);
        }
        internal void OnHandleDestroyed(object sender, EventArgs e)
        {
            // Window was destroyed, release hook.
            ReleaseHandle();
        }

        protected override void WndProc(ref Message m)
        {
            // Listen for operating system messages

            switch (m.Msg)
            {
                case WM_ACTIVATEAPP:

                    // Notify the form that this message was received.
                    // Application is activated or deactivated, 
                    // based upon the WParam parameter.
                    parent.ApplicationActivated(((int)m.WParam != 0));

                    break;
            }
            base.WndProc(ref m);
        }
    }

    // MyNativeWindow class to create a window given a class name.
    internal class MyNativeWindow : NativeWindow
    {

        // Constant values were found in the "windows.h" header file.
        private const int WS_CHILD = 0x40000000,
                          WS_VISIBLE = 0x10000000,
                          WM_ACTIVATEAPP = 0x001C;

        private int windowHandle;

        public MyNativeWindow(Form parent)
        {

            CreateParams cp = new CreateParams();

            // Fill in the CreateParams details.
            cp.Caption = "Click here";
            cp.ClassName = "Button";

            // Set the position on the form
            cp.X = 100;
            cp.Y = 100;
            cp.Height = 100;
            cp.Width = 100;

            // Specify the form as the parent.
            cp.Parent = parent.Handle;

            // Create as a child of the specified parent
            cp.Style = WS_CHILD | WS_VISIBLE;

            // Create the actual window
            this.CreateHandle(cp);
        }

        // Listen to when the handle changes to keep the variable in sync
        protected override void OnHandleChange()
        {
            windowHandle = (int)this.Handle;
        }

        protected override void WndProc(ref Message m)
        {
            // Listen for messages that are sent to the button window. Some messages are sent
            // to the parent window instead of the button's window.

            switch (m.Msg)
            {
                case WM_ACTIVATEAPP:
                    // Do something here in response to messages
                    break;
            }
            base.WndProc(ref m);
        }
    }
}

注釈

このクラスは、ウィンドウ クラスの作成と登録を自動的に管理します。

ウィンドウ ハンドルに関連付けられている場合、ウィンドウはガベージ コレクションの対象になりません。 適切なガベージ コレクションを確保するには、 を使用してハンドルを手動で破棄するか、 を使用 DestroyHandle して ReleaseHandle解放する必要があります。

注意

メソッドは ReleaseHandle 、WM_NCDESTROY メッセージが処理されるときに呼び出されます。 これは、手動で を呼び出 ReleaseHandleす必要がない場合がありますが、これを行うことをお勧めします。

クラスには、ハンドルHandleを管理するためのプロパティとメソッド (、、CreateHandleAssignHandleDestroyHandle、および ) が用意されていますReleaseHandleNativeWindow

コンストラクター

NativeWindow()

NativeWindow クラスのインスタンスを初期化します。

プロパティ

Handle

ウィンドウのハンドルを取得します。

メソッド

AssignHandle(IntPtr)

ウィンドウにハンドルを割り当てます。

CreateHandle(CreateParams)

作成パラメーターを指定してウィンドウとそのハンドルを作成します。

CreateObjRef(Type)

リモート オブジェクトとの通信に使用するプロキシの生成に必要な情報をすべて格納しているオブジェクトを作成します。

(継承元 MarshalByRefObject)
DefWndProc(Message)

ウィンドウに関連付けられている既定のウィンドウ プロシージャを呼び出します。

DestroyHandle()

ウィンドウとそのハンドルを破棄します。

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
Finalize()

ウィンドウに関連付けられているリソースを解放します。

FromHandle(IntPtr)

指定したハンドルに関連付けられているウィンドウを取得します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetLifetimeService()
古い.

対象のインスタンスの有効期間ポリシーを制御する、現在の有効期間サービス オブジェクトを取得します。

(継承元 MarshalByRefObject)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
InitializeLifetimeService()
古い.

このインスタンスの有効期間ポリシーを制御する有効期間サービス オブジェクトを取得します。

(継承元 MarshalByRefObject)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
MemberwiseClone(Boolean)

現在の MarshalByRefObject オブジェクトの簡易コピーを作成します。

(継承元 MarshalByRefObject)
OnHandleChange()

ウィンドウのハンドルが変更されたときに呼び出される通知メソッドを指定します。

OnThreadException(Exception)

派生クラスでオーバーライドされた場合、未処理のスレッド例外を管理します。

ReleaseHandle()

ウィンドウに関連付けられているハンドルを解放します。

ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)
WmDpiChangedAfterParent(Message)

ウィンドウ ハンドルとウィンドウ プロシージャの下位のカプセル化を提供します。

WmDpiChangedBeforeParent(Message)

ウィンドウ ハンドルとウィンドウ プロシージャの下位のカプセル化を提供します。

WndProc(Message)

ウィンドウに関連付けられている既定のウィンドウ プロシージャを呼び出します。

適用対象

製品 バージョン
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Windows Desktop 3.0, 3.1, 5, 6, 7, 8, 9, 10

こちらもご覧ください