Преобразование дескриптора окна IntPtr в IWin32Window^

Как преобразовать дескриптор, полученный из свойства Handle формы/элемента управления, в IWin32Window^ ?


person shadeMe    schedule 20.03.2010    source источник


Ответы (3)


Control.FromHandle

(Это дает вам объект Control, который реализует интерфейс IWin32Window.)

Eg.

IntPtr myWindowHandle = IntPtr(someVal);
IWin32Window^ w = Control::FromHandle(myWindowHandle);

Обратите внимание, что это зависит от того, что дескриптор «получен из свойства Handle формы/элемента управления». Вы не можете использовать эту технику с произвольным дескриптором окна Win32.

person Community    schedule 20.03.2010
comment
Джеймс, я отредактировал квалификацию в вашем ответе, потому что люди, приходящие сюда из более общего поиска по IntPtr и IWin32Window, могут только прочитать заголовок вопроса и не оценить ограничение в деталях вопроса. Надеюсь, это нормально. - person itowlson; 20.03.2010
comment
Нет, это хорошая редакция. Возможно, вы спасли какого-нибудь незадачливого программиста из будущего от часов головоломок, задающихся вопросом, почему он не может волшебным образом создать объект Control/IWin32Window из необработанного HWND. :) - person ; 20.03.2010

Существует более простой метод, который поддерживается непосредственно платформой .NET без необходимости создания собственного пользовательского класса. Вы можете использовать это с любым произвольным дескриптором окна.

Учитывая ptrWindowHandle типа IntPtr:

using System.Windows.Forms;

NativeWindow nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(ptrWindowHandle);

System.Windows.Forms.NativeWindow реализует интерфейс IWin32Window.

person Jim Gomes    schedule 08.06.2012
comment
Вы также можете просто использовать статический NativeWindow.FromHandle(ptrWindowHandle); - person Matt Smith; 24.01.2013
comment
@MattSmith Я обнаружил, что его нужно назначить. FromHandle не работает для меня, если AssignHandle не использовался заранее. Например, это работает: NativeWindow nativeWindow = new NativeWindow(); nativeWindow.AssignHandle(GetConsoleWindow()); box.ShowDialog(NativeWindow.FromHandle(GetConsoleWindow())); (или даже box.ShowDialog(nativeWindow);) ... но этот однострочник без присваивания не работает: box.ShowDialog(NativeWindow.FromHandle(GetConsoleWindow())); - person Jay; 14.12.2017

Похоже, это именно то, о чем вы просите. Я никогда не делал этого сам, но это кажется относительно простым:

Создание IWin32Window из дескриптора Win32

Удачи!

person Morinar    schedule 20.03.2010