C# 打开另一个应用程序';s系统菜单

C# 打开另一个应用程序';s系统菜单,c#,wpf,winapi,C#,Wpf,Winapi,我有一个类似WPF任务栏的应用程序,我是为了好玩而开发的,我希望能够打开应用程序的系统菜单(在我的自定义任务栏中),右键单击,保留应用程序可能创建的任何自定义菜单(即Google Chrome)。我有以下代码适用于我之前制作的无边界窗口应用程序,但它似乎不起作用,我想知道为什么?我需要做什么才能让它工作 public static void ShowContextMenu(IntPtr hWnd) { SetForegroundWindow(hWnd);

我有一个类似WPF任务栏的应用程序,我是为了好玩而开发的,我希望能够打开应用程序的系统菜单(在我的自定义任务栏中),右键单击,保留应用程序可能创建的任何自定义菜单(即Google Chrome)。我有以下代码适用于我之前制作的无边界窗口应用程序,但它似乎不起作用,我想知道为什么?我需要做什么才能让它工作

        public static void ShowContextMenu(IntPtr hWnd)
    {
        SetForegroundWindow(hWnd);
        IntPtr wMenu = GetSystemMenu(hWnd, false);
        // Display the menu
        uint command = TrackPopupMenuEx(wMenu,
            TPM.LEFTBUTTON | TPM.RETURNCMD, 0, 0, hWnd, IntPtr.Zero);
        if (command == 0)
            return;

        PostMessage(hWnd, WM.SYSCOMMAND, new IntPtr(command), IntPtr.Zero);
    }

提示:TrackPopupMenuEx(…)似乎立即返回值为0的值,而不是等待响应…

给TrackPopupMenuEx菜单的所有者窗口句柄似乎有问题。。。相反,我使用了wpf窗口的句柄,然后在发布消息时,我使用了菜单的所有者。。。对我来说似乎有点奇怪,但它起作用了

        public static void ShowContextMenu(IntPtr hAppWnd, Window taskBar, System.Windows.Point pt)
    {
        WindowInteropHelper helper = new WindowInteropHelper(taskBar);
        IntPtr callingTaskBarWindow = helper.Handle;
        IntPtr wMenu = GetSystemMenu(hAppWnd, false);
        // Display the menu
        uint command = TrackPopupMenuEx(wMenu,
            TPM.LEFTBUTTON | TPM.RETURNCMD, (int) pt.X, (int) pt.Y, callingTaskBarWindow, IntPtr.Zero);
        if (command == 0)
            return;

        PostMessage(hAppWnd, WM.SYSCOMMAND, new IntPtr(command), IntPtr.Zero);
    }