如何在WPF面板中显示虚拟工作室的视图



我有启动外部dll文件引擎的代码,并显示在此dll文件中创建的虚拟工作室的视图。该代码在Windows窗体中运行良好。现在,当我尝试在WPF中使用相同的代码时,它会抱怨显示输出的最后一行,而这一行涉及窗口处理。我对下面的代码不太熟悉,对委托和处理也不太了解,但有人能帮我在WPF中运行吗?

namespace MSShowTestGUI
    {
    public delegate void CallbackDelegate();
    public delegate void NotificationsCallbackDelegate(CinectorNotification message);
public partial class Form1 : Form
{
    MSShowAPI.API instance = new API();
    //List<AudioDevice> audioDevices = new List<AudioDevice>();
    //List<CameraDevice> cameraDevices = new List<CameraDevice>();
    CallbackDelegate clickIntoDeleg;
    IntPtr clickIntoPointer;
    NotificationsCallbackDelegate notificationsCallbackDeleg;
    IntPtr notificationsCallbackPointer;
    bool engineRunning = false;
    public Form1()
    {   
        InitializeComponent();
        if (checkBox_autostart.Checked)
        {
            InitializeEngine2();
        }
        Application.Idle += Update;
        clickIntoDeleg = ClickIntoCallback;
        clickIntoPointer = Marshal.GetFunctionPointerForDelegate(clickIntoDeleg);
        instance.SetClickIntoCallback(clickIntoPointer);
        notificationsCallbackDeleg = NotificationsCallback;
        notificationsCallbackPointer = Marshal.GetFunctionPointerForDelegate(notificationsCallbackDeleg);
        instance.SetNotificationsCallback(notificationsCallbackPointer);

        //instance.SetNotificationsCallback()
    }   
    #region initialization
    private void InitializeEngine2()
    {
        UpdateControls();
        if (!engineRunning)
        {
            CallbackDelegate handler = ReadyCallback;
            IntPtr delegPointer = Marshal.GetFunctionPointerForDelegate(handler);
            instance.InitializeEngine(CinectorWindow.Handle, new Resolution(1920, 1080), 1000, delegPointer); //this line shows the view of the studio in a panel but in WPF there is no "CinectorWindow.Handle"          
        }        
    }
    protected void ReadyCallback()
    {
        engineRunning = true;
        instance.SetActiveStudio(0);
        UpdateControls();
        // called only first run?
        /*engineRunning = true;
        UpdateControls();*/
    }
    private void button_initEngine_Click(object sender, EventArgs e)
    {
        InitializeEngine2();
    }
    private void UpdateControls()
    {
        button_initEngine.Enabled = !engineRunning;
        button_killEngine.Enabled = engineRunning;
    }
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        ShutdownEngine();
    }
    private void ShutdownEngine()
    {
        if (engineRunning)
        {
            instance.ShutdownEngine();
            engineRunning = false;
        }
        UpdateControls();
    }
    private void button_killEngine_Click(object sender, EventArgs e)
    {
        ShutdownEngine();
    }
    #endregion
    private void ClickIntoCallback()
    {
        //code
    }
    private void NotificationsCallback(CinectorNotification notif)
    {
        notificationBox.AppendText("[" + notif.timestamp + "] " + notif.type + ": " +  notif.message + Environment.NewLine);
    }
    void Update(object sender, EventArgs e)
    {
        instance.Update();
    }

    private void CinectorWindow_Paint(object sender, PaintEventArgs e)
    {
    }
    }
    }

EDIT:事实证明,不仅Windows有句柄。

有一个名为WindowsFormsHost的控件,用于在WPF视图中承载WinForms元素,并且该控件有自己的Handle属性。

因此,您只需要更改CinectorWindow,使其类型为WindowsFormsHost,而不是StackPanel,并像您在问题中已经做的那样使用其Handle。

--原始答案——

在WPF中,只有Windows具有Handles,并且没有Handle属性。

要获得你的窗口的句柄,你需要做:

// "this" being the current Window
WindowInteropHelper windowHwnd = new WindowInteropHelper(this);  
IntPtr hWnd = windowHwnd.Handle;

最新更新