Показать системное меню из другого окна - PullRequest
2 голосов
/ 19 июня 2010

Проект, над которым я сейчас работаю, по сути является версией Ultramon с открытым исходным кодом (программа для работы с несколькими задачами). Таким образом, думайте, что приложение похоже на панель задач Windows. Кнопки для каждого окна и т. Д. Это кодируется в C / C ++ с использованием WinAPI

Я только начал это делать, и у меня отключены некоторые функции. Тем не менее, я застреваю при получении системных меню (например, меню, которое вы получаете, когда вы щелкаете правой кнопкой мыши на кнопке на панели задач), показывая, когда и где я хочу, чтобы они.

Я пытаюсь использовать:

HMENU menu = GetSystemMenu(item, false); 
SetForegroundWindow(hWnd);
TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, 0, 0, 0, hWnd, NULL);
PostMessage(hWnd, WM_NULL, 0, 0);

пункт - это HWND, для которого я хочу меню, hWnd - это HWND для кнопки / элемента, на котором я хочу, чтобы меню отображалось. (пока показывает 0, 0, верхний левый угол моего основного монитора).

Этот код отлично работает каждый раз для системного меню, которое настраивается. Например: это НЕ стандартное меню просто «Восстановить», «Развернуть» и т. Д. И т. Д., В него добавлены некоторые пункты меню. Эти меню всегда будут отображаться там, где я хочу.

Однако базовые системные меню по умолчанию (например, те, которые имеют только «Развернуть», «Восстановить», «Закрыть» и т. Д.) Будут отображаться ТОЛЬКО в первый раз, когда я их использую. После этого они отказываются появляться. Если я не перезагружаю компьютер, запускаю его снова, и в этот момент они работают отлично.

Примечание: SetForegroundWindow(hWnd); и PostMessage(hWnd, WM_NULL, 0, 0); находятся там, потому что я где-то читал, что системное меню будет работать только в первый раз, если я не выполнил этот трюк с выводом его на передний план, но он все еще не работает правильно.

Так у кого-нибудь есть идеи, как заставить это работать правильно? Или почему он работает только в первый раз после перезагрузки компьютера?


Только что проверил что-то, он также покажет системное меню для окна, если я закрою окно (например, выйду из программы) и снова открою его. Но еще раз, он покажет это только один раз, затем он перестает работать.

1 Ответ

0 голосов
/ 19 июня 2010

Это может быть хакерским, но вы пытались установить фокус окна и затем выдать Alt + Space через что-то вроде SendInput?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...