Встроенное единство 3d не отображается в WindowsHostControl - PullRequest
0 голосов
/ 01 апреля 2020

Я пытался встроить проект 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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...