Как обнаружить события кнопки мыши вперед и Назад в Delphi?

Если у мыши есть другие кнопки в дополнение к стандартным левым/правым/средним (например, вперед / назад), как мы можем обнаружить эти кнопки в Delphi?

примером того, как это используется, является Internet Explorer, где кнопка вперед/назад на стороне мыши Logitech или MS переключается вперед и назад между любыми загруженными веб-страницами. Кажется, это реплицирует Backspace / CTRL+Backspace на клавиатуре, но я попытался обнаружить это с помощью KeyPreview и события KeyPress, но это не поднимает его.

есть идеи, как обнаружить щелчки на этих расширенных кнопках мыши?

1 ответов


вам нужно захватить сообщение WM_APPCOMMAND, а затем извлечь конкретный запрос команды с помощью GET_APPCOMMAND_LPARAM. В принципе, что-то вроде этого:

type
  TMyForm = class(TForm)
  private
    procedure WMAppCommand(var Msg: TMessage); message WM_APPCOMMAND;
  end;

procedure TMyForm.WMAppCommand(var Msg: TMessage);
begin
  case GET_APPCOMMAND_LPARAM(Msg.LParam) of
    APPCOMMAND_BROWSER_BACKWARD:
    begin
      // Do "go back" code
      Msg.Result := 1;
    end;
  end;
end;

вот перевод заголовка:

unit AppCommand;

{$RANGECHECKS OFF}

interface

uses
  Windows;

const
  WM_APPCOMMAND = 19;

const
  // Windows 2000, ME, and above
  APPCOMMAND_BROWSER_BACKWARD                   = 1;
  APPCOMMAND_BROWSER_FORWARD                    = 2;
  APPCOMMAND_BROWSER_REFRESH                    = 3;
  APPCOMMAND_BROWSER_STOP                       = 4;
  APPCOMMAND_BROWSER_SEARCH                     = 5;
  APPCOMMAND_BROWSER_FAVORITES                  = 6;
  APPCOMMAND_BROWSER_HOME                       = 7;
  APPCOMMAND_VOLUME_MUTE                        = 8;
  APPCOMMAND_VOLUME_DOWN                        = 9;
  APPCOMMAND_VOLUME_UP                          = 10;
  APPCOMMAND_MEDIA_NEXTTRACK                    = 11;
  APPCOMMAND_MEDIA_PREVIOUSTRACK                = 12;
  APPCOMMAND_MEDIA_STOP                         = 13;
  APPCOMMAND_MEDIA_PLAY_PAUSE                   = 14;
  APPCOMMAND_LAUNCH_MAIL                        = 15;
  APPCOMMAND_LAUNCH_MEDIA_SELECT                = 16;
  APPCOMMAND_LAUNCH_APP1                        = 17;
  APPCOMMAND_LAUNCH_APP2                        = 18;
  APPCOMMAND_BASS_DOWN                          = 19;
  APPCOMMAND_BASS_BOOST                         = 20;
  APPCOMMAND_BASS_UP                            = 21;
  APPCOMMAND_TREBLE_DOWN                        = 22;
  APPCOMMAND_TREBLE_UP                          = 23;
  // Windows XP and above
  APPCOMMAND_MICROPHONE_VOLUME_MUTE             = 24;
  APPCOMMAND_MICROPHONE_VOLUME_DOWN             = 25;
  APPCOMMAND_MICROPHONE_VOLUME_UP               = 26;
  APPCOMMAND_HELP                               = 27;
  APPCOMMAND_FIND                               = 28;
  APPCOMMAND_NEW                                = 29;
  APPCOMMAND_OPEN                               = 30;
  APPCOMMAND_CLOSE                              = 31;
  APPCOMMAND_SAVE                               = 32;
  APPCOMMAND_PRINT                              = 33;
  APPCOMMAND_UNDO                               = 34;
  APPCOMMAND_REDO                               = 35;
  APPCOMMAND_COPY                               = 36;
  APPCOMMAND_CUT                                = 37;
  APPCOMMAND_PASTE                              = 38;
  APPCOMMAND_REPLY_TO_MAIL                      = 39;
  APPCOMMAND_FORWARD_MAIL                       = 40;
  APPCOMMAND_SEND_MAIL                          = 41;
  APPCOMMAND_SPELL_CHECK                        = 42;
  APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE  = 43;
  APPCOMMAND_MIC_ON_OFF_TOGGLE                  = 44;
  APPCOMMAND_CORRECTION_LIST                    = 45;
  // Windows XP SP1 and above
  APPCOMMAND_MEDIA_PLAY                         = 46;
  APPCOMMAND_MEDIA_PAUSE                        = 47;
  APPCOMMAND_MEDIA_RECORD                       = 48;
  APPCOMMAND_MEDIA_FAST_FORWARD                 = 49;
  APPCOMMAND_MEDIA_REWIND                       = 50;
  APPCOMMAND_MEDIA_CHANNEL_UP                   = 51;
  APPCOMMAND_MEDIA_CHANNEL_DOWN                 = 52;

  FAPPCOMMAND_MOUSE = 00;
  FAPPCOMMAND_KEY   = 0;
  FAPPCOMMAND_OEM   = 00;
  FAPPCOMMAND_MASK  = $F000;

  // Mouse buttons;  remaining ones are declared in Windows.pas
  MK_XBUTTON1 = ;
  MK_XBUTTON2 = ;

function GET_APPCOMMAND_LPARAM(lParam: LPARAM): Short;
function GET_DEVICE_LPARAM(lParam: LPARAM): Word;
function GET_KEYSTATE_LPARAM(lParam: LPARAM): Word;


implementation

function GET_APPCOMMAND_LPARAM(lParam: LPARAM): Short;
begin
  Result := HiWord(lParam) and not FAPPCOMMAND_MASK;
end;

function GET_DEVICE_LPARAM(lParam: LPARAM): Word;
begin
  Result := HiWord(lParam) and FAPPCOMMAND_MASK;
end;

function GET_KEYSTATE_LPARAM(lParam: LPARAM): Word;
begin
  Result := LoWord(lParam);
end;

end.