Откройте системное меню другого приложения - PullRequest
2 голосов
/ 14 июля 2009

У меня есть приложение, похожее на панель задач 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, вместо ожидания ответа ...

1 Ответ

1 голос
/ 14 июля 2009

Кажется, есть проблема с предоставлением 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...