Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Заставить системное меню выпасть в указанном месте

Delphi , Компоненты и Классы , Меню

Заставить системное меню выпасть в указанном месте

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  How to popup the windows system menu? 
  Maybe you can use Keybd_event to eumlate ALT+SPACE 
  Maybe you can use a TPopupmenu. 
  But they always have some problem. 
  The method below is a perfect solution! 
  BTW: if your form has borderstyle = bsNone, Please do it like this: 
  Set forms style = bsSingle; and use the code below to set form boder: 
  SetWindowLong(Handle, GWL_STYLE,GetWindowLong(Handle, GWL_STYLE) 
  and (not WS_CAPTION) or WS_DLGFRAME or WS_OVERLAPPED); 
}

 procedure TForm1.Button1Click(Sender: TObject);
 const
   { Undocument message ID }
   WM_POPUPSYSTEMMENU = $313;
 begin
   SendMessage(Handle, WM_POPUPSYSTEMMENU, 0,
     MakeLong(Mouse.CursorPos.X, Mouse.CursorPos.Y));
 end;

Код на Delphi! Это код, который simulates системное меню (также известное как контекстное меню или всплывающее меню) отправкой custom сообщения (WM_POPUPSYSTEMMENU) в handle окна текущей формы.

Вот что это код делает:

  1. Он определяет константу WM_POPUPSYSTEMMENU с не документированным идентификатором сообщения $313.
  2. Когда кнопка нажата, он вызывает функцию SendMessage, чтобы отправить custom сообщение в handle (Handle) текущей формы.
  3. Сообщение включает три параметра:
    • 0: Это параметр wParam, который не используется в этом случае.
    • MakeLong(Mouse.CursorPos.X, Mouse.CursorPos.Y): Это создает LONGINT значение используя координаты X и Y позиции курсора мыши. Это значение будет передано как параметр lParam.

Отправкой этого custom сообщения системное меню (например, ALT+SPACE) всплывает в текущей позиции курсора мыши.

Обратите внимание, что этот код требует, чтобы форма имела валидный handle (Handle) и является только применимым для платформы Windows.

В отношении альтернативных решений можно использовать TPopupmenu или симулировать комбинацию клавиш ALT+SPACE с помощью Keybd_Event, как упоминалось в оригинальном тексте. Однако, эти подходы могут иметь свои проблемы и ограничения.

Маленькая рекомендация: вместо жесткого кодирования идентификатора сообщения $313, рассмотрите определение его как имени константы, чтобы сделать код более читаемым и поддерживаемым:

const
  WM_POPUPSYSTEMMENU = WM_USER + 313; // Не документированный идентификатор сообщения

Таким образом, если вам нужно изменить идентификатор сообщения в будущем, вы только должны обновить эту одиночную константу.

В статье описывается способ вызова системного меню Windows в указанном месте на экране с помощью процедуры TForm1.Button1Click(Sender: TObject).


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Меню ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:04:41/0.0052840709686279/1