Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2023, 19:30   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Дополнительные кнопки мышки

На моей мышке есть дополнительные две кнопки
Вопрос: как в D7 отловить их нажатие, чтобы использовать в своей программе?
Kronos913 вне форума Ответить с цитированием
Старый 22.08.2023, 00:28   #2
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

Эти две кнопки это скорее всего xbutton1 и xbuton2, курим справку и выбираем способ и соответсвенно обрабатываем сообщения, в простейшем виде
Код:
 const
    WM_XBUTTONDOWN = $20b;
    WM_XBUTTONUP = $20c;
    WM_XBUTTONDBLCLK = $20d;
//...
type
  TFrmMain = class(TForm)
//...
 procedure xbtndown(var msg:TWMMouse); message WM_XBUTTONDOWN;
//...
  end;
procedure TFrmMain.xbtndown(var msg: TWMMouse);
begin
  //
  case HiWord(msg.Keys) of
    1: begin
        ShowMessage('XBUTTON1 pressed!');
        msg.Result:=1;
        //если сообщение обрабатывается, то необходимо вернуть результат
        //см: https://learn.microsoft.com/ru-ru/windows/win32/inputdev/wm-xbuttondown#return-value
      end;
    2:
      begin
        ShowMessage('XBUTTON2 pressed!');
        msg.Result:=1;
      end;
  end;
end;

Последний раз редактировалось DIONISKA; 22.08.2023 в 08:00.
DIONISKA вне форума Ответить с цитированием
Старый 31.08.2023, 13:02   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Спасибо, код протестировал

Результат такой: если я совершаю нажатие на форме - оно обрабатывается
Если я совершаю нажатие на кнопке, или еще на каком-то элементе - то оно игнорируется

Отсюда вопрос: как распространить это нажатие на кнопку, или еще какой-то элемент?
Kronos913 вне форума Ответить с цитированием
Старый 31.08.2023, 15:07   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Экспериментально получилось как-то так, но не сильно удобно получается
Это единственный способ решения проблемы?
Код:
  TButton111 = class(TButton)
  private
  public
    procedure xbtndown(var msg:TWMMouse); message WM_XBUTTONDOWN;
  end;
Kronos913 вне форума Ответить с цитированием
Старый 31.08.2023, 17:07   #5
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

могло бы помочь KeyPreview:=True; если-бы это не были xbutton, но и так вариантов в принципе немало: от локальных хуков до грязных хаков. Самый простой вариант это взять компонент TApplicationEvents и в OnMessage назначить ему что-то вроде:
Код:
procedure TFrmMain.AppEventsMessage(var Msg: tagMSG;
  var Handled: Boolean);
begin
Handled:=False;
   case Msg.message of
     WM_XBUTTONDOWN:
      begin
         case HiWord(Msg.wParam) of
             1:ShowMessage('XBUTTON1!');
             2:ShowMessage('XBUTTON2!');
         end;
      end;
   end;
end;
DIONISKA вне форума Ответить с цитированием
Старый 31.08.2023, 17:43   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Итак, сделал вот такой вот код.
Код:
  TButtonXMouse = class(TButton)
  private
  public
    procedure xbtndown(var msg:TWMMouse); message WM_XBUTTONDOWN;
  end;

  TImageXMouse = class(TImage)
  private
  public
    procedure xbtndown(var msg:TWMMouse); message WM_XBUTTONDOWN;
  end;
И теперь сюрприз: с кнопкой все работает на ура. А с изображением - компилируется но никакой реакции на нажатия
Kronos913 вне форума Ответить с цитированием
Старый 31.08.2023, 19:38   #7
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
никакой реакции
Используйте вариант с ApplicationEvents(TApplicationEvents), сам компонент на вкладке additional. Я чуть выше пример написал, он должен работать со всеми элементами без таких костылей. Если мне не изменяет память ApplicationEvents есть даже в Delphi 6(возможно и в более старых версиях), другой вопрос если используете lazarus/codetyphon, там есть аналог ApplicationProperties, но у него нет события OnMessage, там скорее всего проще с хуками на WH_GETMESSAGE.
DIONISKA вне форума Ответить с цитированием
Старый 31.08.2023, 20:34   #8
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Вопрос про костыли номер 2
Такой код оптимален, или более прямой способ?

Цель всей конструкции - во время какого-то другого действия отследить факт того что боковая кнопка зажата

Код:
var
  F1_XBut1:boolean=false;
  F1_XBut2:boolean=false;
Код:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
const
  WM_XBUTTONDOWN = $20b;
  WM_XBUTTONUP = $20c;
  WM_XBUTTONDBLCLK = $20d;

begin
  Handled:=False;
  case Msg.message of
    WM_XBUTTONDOWN: begin
                      case HiWord(Msg.wParam) of
                        1: F1_XBut1:=true;
                        2: F1_XBut2:=true;
                      end;
                    end;
      WM_XBUTTONUP: begin
                      case HiWord(Msg.wParam) of
                        1: F1_XBut1:=false;
                        2: F1_XBut2:=false;
                      end;
                    end;
  End;
end;
Kronos913 вне форума Ответить с цитированием
Старый 31.08.2023, 21:07   #9
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Такой код оптимален, или более прямой способ?
Если речь идёт просто о проверке что в какой-то произвольный момент времени нажата-ли кнопка, а не нужно отловить событие нажатия, то рациональнее всего использовать GetAsyncKeyState() из winapi(в том числе для XBUTTON1 и XBUTTON2). Что-то вроде:
Код:
const //виртуальные коды клавиш XBUTTON 1/2
     VK_XBUTTON1 = $05;
     VK_XBUTTON2 = $06;  
//..
  if GetAsyncKeyState(VK_XBUTTON1) <> 0 then showmessage('VK_XBUTTON1 сейчас нажата');
  if GetAsyncKeyState(VK_XBUTTON2) <> 0 then showmessage('VK_XBUTTON2 сейчас нажата');
DIONISKA вне форума Ответить с цитированием
Старый 01.09.2023, 00:21   #10
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

О, спасибо. Это как раз то что мне нужно было
Kronos913 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как скрыть показать скрытые файлы, и папки, без нажатие кнопки мышки Обновить falsebegin Общие вопросы Delphi 6 16.05.2019 05:43
Как осуществить выход из программы нажатием правой кнопки мышки? Ассемблер Vacarme Помощь студентам 0 26.05.2013 11:38
Нажатие левой кнопки мышки sashaxD Общие вопросы Delphi 18 14.06.2011 19:40
дополнительные кнопки в EXEL MixanMM Microsoft Office Excel 3 18.11.2009 12:53
Проблема с нажатием кнопки мышки Zeraim Общие вопросы Delphi 2 23.05.2008 18:33