Получение HWND от объекта CoreWindow в UWP

В этой краткой документации MSDN говорится, что в CoreWindow есть ICoreWindowInterop, который получает дескриптор HWND для CoreWindow. Но я не могу найти ссылки о том, как его получить (C#). Помогите, пожалуйста.

https://msdn.microsoft.com/en-us/library/dn302119(v=vs.85).aspx

2 ответа

Этот интерфейс COM непосредственно доступен только для кода C++. В C# вы должны объявить его самостоятельно и сделать так, чтобы оно соответствовало объявлению интерфейса в C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\winrt\CoreWindow.idl. Как это:

using System.Runtime.InteropServices;
...
    [ComImport, Guid("45D64A29-A63E-4CB6-B498-5781D298CB4F")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface ICoreWindowInterop {
        IntPtr WindowHandle { get; }
        bool MessageHandled { set; }
    }

Для получения ссылки на интерфейс необходимо выполнить приведение, компилятор не позволит вам выполнить приведение непосредственно из объекта CoreWindow. Это проще всего сделать, позволив DLR выполнить свою работу, например так:

    dynamic corewin = Windows.UI.Core.CoreWindow.GetForCurrentThread();
    var interop = (ICoreWindowInterop)corewin;
    var handle = interop.WindowHandle;

Обратите внимание, что для UWP нет поддерживаемых API, которые принимают HWND. Любой API, который вы вызываете, не пройдет сертификацию Магазина Windows, и даже если вы избегаете Магазина Windows (например, выполняете боковую загрузку или проходите развертывание Enterprise), нет гарантии, что приложение будет работать в будущем.

нет поддерживаемых API для UWP, которые принимают HWND

Хотя, как правило, приложениям UWND никогда не следует рассуждать о HWND, существует множество WinRT API, которые поддерживают принятие HWND для поддержки использования из приложений Win32. Вот пример и еще один. Клиенты C# должны будут использовать методы взаимодействия, вот пример этого.

Другие вопросы по тегам