C# 将 QEMU 嵌入面板 - 如何获取/生成 QEMU 窗口句柄



我正在尝试将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);

相关内容

  • 没有找到相关文章

最新更新