Как преобразовать дескриптор, полученный из свойства Handle формы/элемента управления, в IWin32Window^ ?
Преобразование дескриптора окна IntPtr в IWin32Window^
Ответы (3)
(Это дает вам объект Control, который реализует интерфейс IWin32Window.)
Eg.
IntPtr myWindowHandle = IntPtr(someVal);
IWin32Window^ w = Control::FromHandle(myWindowHandle);
Обратите внимание, что это зависит от того, что дескриптор «получен из свойства Handle формы/элемента управления». Вы не можете использовать эту технику с произвольным дескриптором окна Win32.
person
Community
schedule
20.03.2010
Джеймс, я отредактировал квалификацию в вашем ответе, потому что люди, приходящие сюда из более общего поиска по
IntPtr
и IWin32Window
, могут только прочитать заголовок вопроса и не оценить ограничение в деталях вопроса. Надеюсь, это нормально.
- person itowlson; 20.03.2010
Нет, это хорошая редакция. Возможно, вы спасли какого-нибудь незадачливого программиста из будущего от часов головоломок, задающихся вопросом, почему он не может волшебным образом создать объект 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
Вы также можете просто использовать статический
NativeWindow.FromHandle(ptrWindowHandle);
- person Matt Smith; 24.01.2013
@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