Aracılığıyla paylaş


Pencere tutamacını alma (HWND)

Bu konu başlığında, bir masaüstü uygulamasında bir pencerenin pencere tutamacını nasıl alacağınız gösterilmektedir. Kapsam WinUI 3, Windows Presentation Foundation (WPF) ve Windows Forms (WinForms) uygulamalarını kapsar; kod örnekleri C# ve C++/WinRT'de sunulur.

Yukarıda listelenen geliştirme ve kullanıcı arabirimi çerçeveleri Win32 API'sinde oluşturulmuş (arka planda). Win32'de bir pencere nesnesi, pencere tutamacı olarak bilinen bir değerle tanımlanır. Pencere tutamacının türü de bir HWND'dir (C# dilinde IntPtr olarak ortaya çıksa da). Her durumda, pencere tutamacı için kısaltma olarak kullanılan HWND terimini duyarsınız.

WinUI 3, WPF veya WinForms masaüstü uygulamanızdaki bir pencere için HWND'yi almak için birkaç neden vardır. Bir örnek, kullanıcı arabirimi (UI) görüntülemek için CoreWindow'a bağımlı olan belirli Windows Çalışma Zamanı (WinRT) nesneleriyle birlikte çalışabilmek için HWND'yi kullanmaktır. Daha fazla bilgi için bkz. CoreWindow'a bağlı WinRT UI nesnelerini görüntüleme.

C ile WinUI 3#

Aşağıdaki C# kodu, WinUI 3 Window nesnesi için pencere tutamacını (HWND) nasıl alacağını gösterir. Bu örnekte WinRT.Interop.WindowNative C# birlikte çalışma sınıfında GetWindowHandle yöntemi çağrılır. C# birlikte çalışma sınıfları hakkında daha fazla bilgi için bkz. .NET uygulamasından birlikte çalışma API'lerini çağırma.

// MainWindow.xaml.cs
private async void myButton_Click(object sender, RoutedEventArgs e)
{
    // Retrieve the window handle (HWND) of the current WinUI 3 window.
    var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
}

C++ ile WinUI 3

Aşağıdaki C++/WinRT kodu, Bir WinUI 3 Window nesnesi için pencere tutamacını (HWND) nasıl alacağınız gösterir. Bu örnekte IWindowNative::get_WindowHandle yöntemi çağrılır.

// pch.h
...
#include <microsoft.ui.xaml.window.h>

// MainWindow.xaml.cpp
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
    // Retrieve the window handle (HWND) of the current WinUI 3 window.
    auto windowNative{ this->m_inner.as<::IWindowNative>() };
    HWND hWnd{ 0 };
    windowNative->get_WindowHandle(&hWnd);
}

C ile WPF#

Aşağıdaki C# kodu bir WPF pencere nesnesi için pencere tutamacını (HWND) almayı gösterir. Bu örnekte WindowInteropHelper sınıfı kullanılır.

// MainWindow.xaml.cs
private void Button_Click(object sender, RoutedEventArgs e)
{
    var wih = new System.Windows.Interop.WindowInteropHelper(this);
    var hWnd = wih.Handle;
}

C ile WinForms#

Aşağıdaki C# kodu, WinForms form nesnesi için pencere tutamacını (HWND) almayı gösterir. Bu örnekte NativeWindow.Handle özelliği kullanılır.

// Form1.cs
private void button1_Click(object sender, EventArgs e)
{
    var hWnd = this.Handle;
}

Görsel öğe barındıran pencereyi belirleme

Bir görsel öğesinden UIElement.XamlRoot'a erişebilirsiniz; ardından XamlRoot.ContentIslandEnvironment; ardından ContentIslandEnvironment.AppWindowId özelliği en üst düzey Win32 HWND kimliğini içerir.