我有启动外部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;