Как получить окно WPF "из" HwndSource, который я создаю напрямую?
Если я создам HwndSource
непосредственно я тогда также создал WPF Window
что я теперь могу получить доступ из кода? Если так, как я могу получить к нему доступ?
Или мне сейчас нужно как-то "добавить" в WPF Window
к этому HwndSource
? Если да, то как мне это сделать?
Я изучал HwndSource
документация полностью, и эта часть не объяснена хорошо вообще. Я понимаю, что могу получить HwndSource
из существующего окна WPF, но это не помогает мне. Мне нужно перехватить создание Window
так что я могу заставить его WS_CHILD
стиль и установить его родителя напрямую; и в документах говорится, что вы должны создать HwndSource напрямую, если вы хотите принудительно установить его родитель.
Редактировать: я изучал каждый вопрос, который я могу найти с HwndSource
в этом; похоже, что вы "добавляете" объект WPF к HwndSource
объект путем установки RootVisual
собственность HwndSource
объект к объекту WPF, который вы хотите отобразить; или, возможно, позвонив HwndSource
AddSource
метод? Буду изучать те, кто рядом. Надеюсь, что это полезно для других спрашивающих.
1 ответ
Как я и подозревал, решение состоит в том, чтобы добавить ваш объект WPF в объект HwndSource.RootVisual. В приведенном ниже примере NativeMethods - мой класс для PInvoke из Win32 API. Используйте SetLastError и GetLastError для проверки ошибок Windows.
Обратите внимание, что в этом случае вы должны использовать пользовательский элемент управления или страницу или тому подобное; Вы НЕ можете установить HwndSource.RootVisual как существующее или "новое" окно WPF, так как в Windows WPF уже есть родительский элемент, и он не будет принимать объект с родительским элементом.
private void ShowPreview(IntPtr hWnd)
{
if (NativeMethods.IsWindow(hWnd))
{
// Get the rect of the desired parent.
int error = 0;
System.Drawing.Rectangle ParentRect = new System.Drawing.Rectangle();
NativeMethods.SetLastErrorEx(0, 0);
bool fSuccess = NativeMethods.GetClientRect(hWnd, ref ParentRect);
error = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
// Create the HwndSource which will host our Preview user control
HwndSourceParameters parameters = new HwndSourceParameters();
parameters.WindowStyle = NativeMethods.WindowStyles.WS_CHILD | NativeMethods.WindowStyles.WS_VISIBLE;
parameters.SetPosition(0, 0);
parameters.SetSize(ParentRect.Width, ParentRect.Height);
parameters.ParentWindow = hWnd;
HwndSource src = new HwndSource(parameters);
// Create the user control and attach it
PreviewControl Preview = new PreviewControl();
src.RootVisual = Preview;
Preview.Visibility = Visibility.Visible;
}
}