C# 控制外部Qt应用程序-打开文件

C# 控制外部Qt应用程序-打开文件,c#,qt,ui-automation,C#,Qt,Ui Automation,我需要能够控制一个外部Qt应用程序,以便我可以在应用程序中打开一个文件 我曾尝试使用Process获取窗口句柄,然后通过PInvoke使用GetMenu、GetSubMenu和GetMenuItemID获取使用SendMessage的所有参数,并在外部应用程序的打开菜单上单击 如果我尝试将Notepad作为外部应用程序使用,这将非常有效,但实际应用程序使用的是Qt 我确实得到了窗口句柄,但GetMenu返回0 我有这个密码 [DllImport("user32.dll")] private st

我需要能够控制一个外部Qt应用程序,以便我可以在应用程序中打开一个文件

我曾尝试使用Process获取窗口句柄,然后通过PInvoke使用GetMenu、GetSubMenu和GetMenuItemID获取使用SendMessage的所有参数,并在外部应用程序的打开菜单上单击

如果我尝试将Notepad作为外部应用程序使用,这将非常有效,但实际应用程序使用的是Qt

我确实得到了窗口句柄,但GetMenu返回0

我有这个密码

[DllImport("user32.dll")]
private static extern IntPtr GetMenu(IntPtr hWnd);

[DllImport("user32.dll")]
private static extern IntPtr GetSubMenu(IntPtr hMenu, int nPos);

[DllImport("user32.dll")]
private static extern uint GetMenuItemID(IntPtr hMenu, int nPos);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);


private void OpenButton_Click(object sender, EventArgs e)
{
    OpenDocument("notepad", "test.doc");
}

public void OpenDocument(string windowTitle, string document)
{
    IntPtr hWnd = GetWindow(windowTitle);
    IntPtr hMenu = GetMenu(hWnd);
    IntPtr hSubMenu = GetSubMenu(hMenu, 0);    // File menu
    uint menuItemId = GetMenuItemID(hSubMenu, 2);  // Open

    IntPtr ptr = SendMessage(hWnd, (uint)WM.COMMAND, (IntPtr)menuItemId, IntPtr.Zero);
}

private static IntPtr GetWindow(string windowTitle)
{
    IntPtr hWnd = IntPtr.Zero;
    Process[] processes = Process.GetProcesses();
    foreach (Process p in processes)
    {
        if (p.MainWindowTitle.IndexOf(windowTitle, StringComparison.InvariantCultureIgnoreCase) > -1)
        {
            hWnd = p.MainWindowHandle;
            break;
        }
    }

    return hWnd;
}
如何从Qt应用程序中获取菜单和子菜单以及菜单项ID的句柄


//Anders

您应该尝试向Qt应用程序发送右键事件。Qt通常不太使用Windows控件,因此如果您真的想查看UI组件,则需要使用Qt特定的机制。唯一可靠的方法是使用适当的IPC机制,并告诉应用程序打开文件。谢谢!我使用keybd_事件成功地使它工作,但我知道IPC是一条出路。我正在和Qt应用程序的程序员讨论这个问题,他们将添加一种方法,但这需要一些时间。时间不等人,用户也不等人。。。再次感谢你!我想这个问题的答案会有帮助:[在这里输入链接描述][1][1]: