0

アプリケーションでファイルを開くことができるように、外部 Qt アプリケーションを制御できる必要があります。

Process を使用してウィンドウ ハンドルを取得してから、GetMenu、GetSubMenu、および GetMenuItemID を使用して PInvoke を介して、SendMessage を使用するためのすべてのパラメーターを取得し、外部アプリケーションで開いているメニューで「クリック」しようとしました

メモ帳を外部アプリとして試してみると、これは完全に機能しますが、Qt を使用して作成された実際のアプリケーションでは機能しません。

Window ハンドルを取得しますが、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 アプリケーションからメニューとサブメニュー、および menuitemid のハンドルを取得するにはどうすればよいですか?

// アンダース

4

0 に答える 0