Číst v angličtině

Sdílet prostřednictvím


NativeWindow Třída

Definice

Poskytuje zapouzdření úchytu okna na nízké úrovni a proceduru okna.

C#
public class NativeWindow : MarshalByRefObject
C#
public class NativeWindow : MarshalByRefObject, System.Windows.Forms.IWin32Window
Dědičnost
NativeWindow
Implementuje

Příklady

Následující příklad kódu ukazuje zachycení zpráv okna operačního systému v proceduře okna a vytvoření okna s konkrétním názvem třídy okna operačního systému. Příklad vytvoří dvě třídy, které dědí z NativeWindow toho.

Třída se MyNativeWindowListener připojí k proceduře okna formuláře předaného do konstruktoru a přepíše metodu WndProc pro zachycení zprávy okna WM_ACTIVATEAPP . Třída demonstruje použití AssignHandle metod a ReleaseHandle k identifikaci popisovače okna, který NativeWindow bude používat. Popisovač se přiřadí na základě událostí Control.HandleCreated a Control.HandleDestroyed . Při přijetí WM_ACTIVATEAPP zprávy okna třída volá metodu form1.ApplicationActivated .

Třída MyNativeWindow vytvoří nové okno s nastavenou ClassName na BUTTON. Třída ukazuje použití CreateHandle metody a přepsání WndProc metody k zachycení přijatých zpráv okna.

C#
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);
        }
    }
}

Poznámky

Tato třída automaticky spravuje vytváření a registraci třídy okna.

Okno nemá nárok na uvolňování paměti, pokud je přidružené k úchytu okna. Aby se zajistilo správné uvolňování paměti, musí být popisovače zničeny ručně pomocí DestroyHandle nebo uvolněny pomocí ReleaseHandle.

Poznámka

Metoda ReleaseHandle je volána při zpracování zprávy WM_NCDESTROY. To znamená, že existují případy, kdy nemusíte volat ReleaseHandleručně, ale je vhodné to udělat.

Třída NativeWindow poskytuje následující vlastnosti a metody pro správu popisovačů: Handle, CreateHandle, AssignHandle, DestroyHandlea ReleaseHandle.

Konstruktory

NativeWindow()

Inicializuje instanci třídy NativeWindow.

Vlastnosti

Handle

Získá popisovač pro toto okno.

Metody

AssignHandle(IntPtr)

Přiřadí tomuto oknu popisovač.

CreateHandle(CreateParams)

Vytvoří okno a jeho popisovač se zadanými parametry vytváření.

CreateObjRef(Type)

Vytvoří objekt, který obsahuje všechny relevantní informace potřebné k vygenerování proxy používaného ke komunikaci se vzdáleným objektem.

(Zděděno od MarshalByRefObject)
DefWndProc(Message)

Vyvolá výchozí proceduru okna přidruženou k tomuto okně.

DestroyHandle()

Zničí okno a jeho úchyt.

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
Finalize()

Uvolní prostředky přidružené k tomuto okně.

FromHandle(IntPtr)

Načte okno přidružené k zadanému popisovači.

GetHashCode()

Slouží jako výchozí hashovací funkce.

(Zděděno od Object)
GetLifetimeService()
Zastaralé.

Načte objekt služby aktuální životnosti, který řídí zásady životnosti pro tuto instanci.

(Zděděno od MarshalByRefObject)
GetType()

Získá aktuální Type instanci.

(Zděděno od Object)
InitializeLifetimeService()
Zastaralé.

Získá objekt služby životnosti, který řídí zásady životnosti pro tuto instanci.

(Zděděno od MarshalByRefObject)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
MemberwiseClone(Boolean)

Vytvoří mělkou kopii aktuálního MarshalByRefObject objektu.

(Zděděno od MarshalByRefObject)
OnHandleChange()

Určuje metodu oznámení, která je volána při změně popisovače pro okno.

OnThreadException(Exception)

Při přepsání v odvozené třídě spravuje neošetřenou výjimku vlákna.

ReleaseHandle()

Uvolní popisovač přidružený k tomuto oknu.

ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)
WmDpiChangedAfterParent(Message)

Poskytuje zapouzdření úchytu okna na nízké úrovni a proceduru okna.

WmDpiChangedBeforeParent(Message)

Poskytuje zapouzdření úchytu okna na nízké úrovni a proceduru okna.

WndProc(Message)

Vyvolá výchozí proceduru okna přidruženou k tomuto okně.

Platí pro

Produkt Verze
.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

Viz také