Ағылшын тілінде оқу

Бөлісу құралы:


NativeWindow Класс

Определение

Обеспечивает низкоуровневую инкапсуляцию дескриптора окна и процедуры окна.

public class NativeWindow : MarshalByRefObject
public class NativeWindow : MarshalByRefObject, System.Windows.Forms.IWin32Window
Наследование
NativeWindow
Реализации

Примеры

В следующем примере кода демонстрируется перехват сообщений окна операционной системы в процедуре окна и создание окна с именем определенного класса окна операционной системы. В примере создаются два класса, которые наследуются от NativeWindow , которые выполняют эту задачу.

Класс MyNativeWindowListener перехватывает процедуру окна формы, переданной в конструктор, и переопределяет WndProc метод для перехвата WM_ACTIVATEAPP сообщения окна. Класс демонстрирует использование методов и ReleaseHandle для идентификации AssignHandle дескриптора NativeWindow окна, который будет использовать . Дескриптор назначается на Control.HandleCreated основе событий и Control.HandleDestroyed . 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, но это рекомендуется сделать.

Класс NativeWindow предоставляет следующие свойства и методы для управления дескриптором: Handle, CreateHandle, AssignHandle, DestroyHandleи ReleaseHandle.

Конструкторы

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

См. также раздел