我正在尝试将QEMU嵌入到.NET 4.5中的面板中。
。我找到了应用程序面板示例,该示例正在使用WinAPI SetParent函数。
很好,但是如何获取QEMU窗口的句柄或生成它?
我看了(也许停产了?QEMU 管理器,我发现,管理器正在执行带有 -hwnd 参数的 QEMU 模拟器,并在它后面传递数字(也许是 int 指针?
我尝试使用 Process.MainWindowHandle 作为窗口句柄,并使用 WaitForInputHandle() 函数等待它,但我得到了异常,因为 QEMU 是控制台应用程序......
所以,最后一个问题是:如何获取/生成QEMU窗口的窗口句柄?
。请记住,我需要多个 QEMU 实例。
感谢您的任何帮助,
Vít "VitekST" staniček
在 VB 中:
Private Function WaitForMainWindowHandle(proc As Process, Optional maxIntent As Integer = Integer.MaxValue) As IntPtr
Dim hwnd As IntPtr
Do
hwnd = proc.MainWindowHandle
If hwnd <> IntPtr.Zero Then Return hwnd
Application.DoEvents() // or:
Threading.Thread.Sleep(25)
maxIntent -= 1
Loop While hwnd = IntPtr.Zero AndAlso maxIntent > 0
'**********
Return hwnd
End Function
用:
Dim hwnd As IntPtr = WaitForMainWindowHandle(procQEMU, 50)
Dim message As New StringBuilder(256)
SendMessage(hwnd, WM_GETTEXT, message.Capacity, message)
Console.WriteLine(message)
user5154346 的答案翻译给遇到这个的人:
private IntPtr WaitForMainWindowHandle(Process proc, int maxIntent = int.MaxValue)
{
IntPtr hwnd;
do
{
hwnd = proc.MainWindowHandle;
if (hwnd != IntPtr.Zero)
return hwnd;
System.Threading.Thread.Sleep(25);
maxIntent--;
} while (hwind == IntPtr.Zero && maxIntent > 0);
return hwnd;
}
用:
IntPtr hwnd = WaitForMainWindowHandle(procQEMU, 50);
StringBuilder message = new StringBuilder(256);
SendMessage(hwnd, WM_GETTEXT, message.Capacity, message);
Console.WriteLine(message);