Показать всплывающее меню в окне другого приложения - PullRequest
2 голосов
/ 19 февраля 2012

Как приложение Delphi XE может отображать всплывающее меню в окне другого приложения?Идея для приложения вспомогательного типа, работающего в фоновом режиме.На зарегистрированной горячей клавише приложение должно отображать всплывающее меню рядом с текстовой кареткой или курсором мыши.

Обычные приложения, вот меню, созданное AutoHotkey и отображаемое в текстередактор:

popup menu attached to another application's window

Я думаю, что я спрашиваю: как я могу отобразить всплывающее меню в произвольном месте экрана, без его прикрепления куправление Delphi?

Ответы [ 2 ]

3 голосов
/ 19 февраля 2012

Создайте TPopupMenu с соответствующими пунктами меню.Когда вам нужно показать его, просто позвоните Popup, передав верхнюю левую позицию в экранных координатах.

PopupMenu1.Popup(X, Y);
2 голосов
/ 19 февраля 2012

@ DavidHeffernan ответил на ваш вопрос, но вы, возможно, не задали правильный вопрос.

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

Я рекомендую использовать AutoHotKey вместо того, чтобы пытаться повторить это на каком-то другом языке программирования. Если вы не знаете об этом, ваш код может запускать сценарии AutoHotKey. IIRC, вы можете скомпилировать скрипты AHK, поэтому вам не нужно устанавливать AHK, только скомпилированные скрипты. AHK, возможно, не самое элегантное из решений, но у него есть глубина и зрелость.

Если это невозможно, то я предлагаю вам изучить Windows Hooks и DLL Injection. Если вы не можете найти какой-либо существующий ранее код или фреймворк, это повлечет за собой немало работы.

Причина такой сложности? Чтобы плавно дополнить другую программу (без проблем с фокусировкой и т. Д.), Вы хотите, чтобы ваш код выполнялся как часть этой другой программы. Механика этого может быть сделана через инъекцию DLL. Однако это только первый шаг. Когда ваш код выполняется в правильном контексте, он должен взаимодействовать с программой «host». Это может быть сложно (это полезно, если у вас есть глубокий опыт работы с сообщениями Windows и Windows API). Если вы хотите, чтобы это работало беспрепятственно с любой произвольной программой, это становится еще сложнее.

...