Я пытался встроить проект unity3D в мое приложение WPF, но при назначении моему элементу управления windows он не отображается. Я вижу, что он запускает процесс, но без отображения.
Мой проект основан на следующих ответах: Вставить приложение Unity3D в WPF * без *, когда оно занимает все окно
Встроить приложение Unity3D в приложение WPF
Мой xaml:
<Window x:Class="Test3DinWindow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Test3DinWindow"
mc:Ignorable="d"
Title="MainWindow" Height="800" Width="1054" Loaded="Window_Loaded">
<Grid Margin="0,0,2,0">
<WindowsFormsHost x:Name="testHost" HorizontalAlignment="Left" Height="284" Margin="675,382,0,0" VerticalAlignment="Top" Width="350"/>
<Button Content="Button" HorizontalAlignment="Left" Margin="1055,430,-84,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
</Grid>
</Window>
Мой c#:
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
process = new Process();
process.StartInfo.FileName = "Test run.exe";
//process.StartInfo.FileName = "New Text Document.txt";
process.StartInfo.Arguments = "-parentHWND " + testHost.Handle.ToInt32() + " " + Environment.CommandLine;
process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
process.StartInfo.UseShellExecute = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForInputIdle();
EnumChildWindows(testHost.Handle, WindowEnum, IntPtr.Zero);
Console.WriteLine("testHost HWND: 0x" + testHost.Handle.ToString("X8"));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ".\nCheck if Container.exe is placed next to UnityGame.exe.");
}
}
private int WindowEnum(IntPtr hwnd, IntPtr lparam)
{
unityHWND = hwnd;
ActivateUnityWindow();
return 0;
}
private void ActivateUnityWindow()
{
SendMessage(unityHWND, WM_ACTIVATE, WA_ACTIVE, IntPtr.Zero);
}
Если Я получаю ручку так, как она показывает, но в главном окне. Я предполагаю, что он получает дескриптор моего главного окна, а не элемент управления.
HwndSource source = (HwndSource)HwndSource.FromVisual(testHost);
IntPtr hWnd = source.Handle;
Console.WriteLine("TestHost Handle: " + hWnd.ToString("X8"));