C# 如何在WPF面板中显示虚拟工作室的视图?
我有启动外部dll文件引擎的代码,并显示在此dll文件中创建的虚拟工作室的视图。该代码在Windows窗体中运行良好。现在,当我尝试在WPF中使用相同的代码时,它会抱怨显示输出的最后一行,这一行涉及窗口处理。我对下面的代码不太熟悉,也不太了解委托和处理,但有人能帮我在WPF中运行吗C# 如何在WPF面板中显示虚拟工作室的视图?,c#,wpf,C#,Wpf,我有启动外部dll文件引擎的代码,并显示在此dll文件中创建的虚拟工作室的视图。该代码在Windows窗体中运行良好。现在,当我尝试在WPF中使用相同的代码时,它会抱怨显示输出的最后一行,这一行涉及窗口处理。我对下面的代码不太熟悉,也不太了解委托和处理,但有人能帮我在WPF中运行吗 namespace MSShowTestGUI { public delegate void CallbackDelegate(); public delegate void Notifica
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)
{
}
}
}
名称空间MSShowTestGUI
{
公共委托void CallbackDelegate();
公共委托无效通知ScallBackDelegate(CinectorNotification消息);
公共部分类Form1:Form
{
MSShowAPI.API实例=新API();
//列出音频设备=新列表();
//List cameraDevices=新列表();
Callback委托点击进入委托;
IntPtr点击输入指针;
通知ScalBackDelegate通知ScalBackDeleg;
IntPtr通知ScallBackpointer;
布尔引擎规划=假;
公共表格1()
{
初始化组件();
如果(复选框_autostart.Checked)
{
初始化Engine2();
}
Application.Idle+=更新;
clickIntoDeleg=ClickIntoCallback;
clickIntoPointer=Marshal.GetFunctionPointerForDelegate(clickIntoDeleg);
SetClickIntoCallback(clickIntoPointer);
notificationsCallbackDeleg=NotificationsCallback;
notificationsCallbackPointer=Marshal.GetFunctionPointerForDelegate(notificationsCallbackDeleg);
SetNotificationsCallback(notificationsCallbackPointer);
//instance.SetNotificationsCallback()实例
}
#区域初始化
private void InitializeEngine2()
{
updateControl();
如果(!引擎规划)
{
CallbackDelegate处理程序=ReadyCallback;
IntPtr delegPointer=Marshal.GetFunctionPointerForDelegate(处理程序);
instance.InitializeEngine(CinectorWindow.Handle,新分辨率(1920,1080),1000,delegPointer);//这一行在面板中显示工作室的视图,但在WPF中没有“CinectorWindow.Handle”
}
}
受保护的void ReadyCallback()
{
引擎规划=真;
SetActiveStudio(0);
updateControl();
//只叫第一次?
/*引擎规划=真;
updateControl()*/
}
私有无效按钮\初始化引擎\单击(对象发送者,事件参数e)
{
初始化Engine2();
}
私有void updateControl()
{
按钮_initEngine.Enabled=!engineRunning;
按钮\u killEngine.Enabled=引擎运行;
}
私有作废Form1\u FormClosing(对象发送方,FormClosingEventArgs e)
{
关闭发动机();
}
私有void关闭引擎()
{
if(发动机润滑)
{
instance.ShutdownEngine();
引擎规划=错误;
}
updateControl();
}
私有无效按钮\u killEngine\u单击(对象发送者,事件参数e)
{
关闭发动机();
}
#端区
私有void ClickIntoCallback()
{
//代码
}
私有无效通知ScalBack(CinectorNotification notif)
{
notificationBox.AppendText(“[”+notif.timestamp+“]”“+notif.type+”:“+notif.message+Environment.NewLine”);
}
无效更新(对象发送方,事件参数e)
{
Update();
}
私有void CinectorWindow_Paint(对象发送器,PaintEventArgs e)
{
}
}
}
编辑:事实证明,不仅Windows有句柄
有一个名为WindowsFormsHost
的控件,用于在WPF视图中承载WinForms元素,该控件有自己的句柄属性
因此,您只需更改CinectorWindow
,将其设置为WindowsFormsHost
,而不是StackPanel,并像您在问题中已经做的那样使用其句柄
--原始答案--
在WPF中,只有Windows具有句柄,并且没有Handle
属性
要获得窗口的句柄,您需要执行以下操作:
// "this" being the current Window
WindowInteropHelper windowHwnd = new WindowInteropHelper(this);
IntPtr hWnd = windowHwnd.Handle;
WPF和Windows窗体控件具有不同的属性。请您准确地指出是哪一行代码导致了问题,确切的错误是什么?如果没有这些东西,很难判断实际的问题是什么,我在那行旁边加了一条评论。但这里是:instance.InitializeEngine(CinectorWindow.Handle,新分辨率(19201080),1000,delegPointer);它只是抱怨CinectorWindow没有句柄属性,这是一个StackPanel。啊,是的,我现在看到了它,评论离开了我的屏幕,所以我看不到它。StackPanels没有句柄属性或方法:好的,谢谢。但是我可以用什么来代替呢?我会在工作时做一些检查,这样我可能需要一点时间才能找到你。有没有一种不用手柄的方法?没有,除非你能修改
初始化引擎代码,并能解释该方法的功能。不幸的是,我没有。该方法是dll中的内部方法,它加载程序的deafult初始状态。所以你们是说,无论我在Windows窗体的绘制面板中看到什么,现在我只能在wpf的新窗口中看到?我想我可能已经找到了一个选项。。。我将编辑我的答案。完成!只要把你的CinectorWindow
做成一个WindowsFormsHost,你就有希望了。