2010-03-20 4 views

ответ

23

Control.FromHandle

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

Ев.

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

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

+0

James, я отредактировал квалификацию в вашем ответе, потому что люди, приезжающие сюда из более общего поиска в 'IntPtr' и' IWin32Window', могут читать только заголовок вопроса и не оценивать ограничение в детали вопроса. Надеюсь, все в порядке. – itowlson

+0

Нет, это хорошая редакция. Вероятно, вы спасли какого-то несчастного будущего программиста с часами раскалывания головы, удивляясь, почему он не может магически создать объект Control/IWin32Window из необработанного HWND. :) – 2010-03-20 07:54:28

20

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

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

using System.Windows.Forms; 

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

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

+14

Вы также можете использовать статический 'NativeWindow.FromHandle (ptrWindowHandle);' –

+0

@MattSmith. Я обнаружил, что он должен быть назначен. FromHandle не работает для меня, если AssignHandle не был использован заранее. Например, это работает: NativeWindow nativeWindow = new NativeWindow(); nativeWindow.AssignHandle (GetConsoleWindow()); box.ShowDialog (NativeWindow.FromHandle (GetConsoleWindow())); '(или даже' box.ShowDialog (nativeWindow); ') ... но этот однострочный без назначения не имеет значения:' box.ShowDialog (NativeWindow. FromHandle (GetConsoleWindow())); ' – Jay

Смежные вопросы