【问题标题】:Open another application's System Menu打开另一个应用程序的系统菜单
【发布时间】:2009-07-13 21:38:36
【问题描述】:

我有一个类似 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,而不是等待响应...

【问题讨论】:

    标签: c# wpf winapi


    【解决方案1】:

    似乎给 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);
        }
    

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多