От HWND до контроля

Я использую метод FindWindow из user32.dll, чтобы найти окно и получить дескриптор, но можно ли получить элемент управления формы из дескриптора? и использовать его как обычную форму? Пример:

int myhwnd = FindWindow(null, "MyWindow");
form myform = SomeMagic.GetFormFromHandle(myhwnd);
myform.Visible = false;

или мне нужно продолжать использовать методы в user32.dll для отправки сообщения в окно?

Ответ 1

Если это управляемое окно (вы создали его с помощью System.Windows.Forms и унаследовали его от System.Windows.Forms.Control), вы можете получить ссылку на объект Control с помощью

Control.FromHandle(myIntPtr);

Затем вы получите родительский элемент элемента управления, пока не получите форму.

Если нет, вы не можете получить объект Control, то вы можете сделать это, чтобы создать NativeWindow и назначить дескриптор IntPtr для объекта с помощью AssignHandle. Это, по крайней мере, даст вам некоторый доступ к WndProc и тому подобное, но что оно.

Ответ 2

Вы пробовали Control.FromHandle()? Формы являются (наследуются от) элементов управления. Если вы нажмете вложенный элемент управления, вам придется искать его родителей до тех пор, пока вы не нажмете на свою форму.

Это предполагает, что на самом деле есть Form где-то, и вы только что использовали методы user32, чтобы найти его HWND.

Ответ 3

Очень сложно обернуть класс Form вокруг дескриптора окна Win32. Microsoft не имеет полноценной реализации. Таким образом, вы должны использовать собственные функции только для связи с данным дескриптором.

Ответ 4

Если окно принадлежит вашему приложению, вы можете использовать Control.FromHandle Method. В противном случае вам придется продолжать использовать win api. Например, чтобы скрыть окно, вам необходимо вызвать Функция ShowWindow.