如何在Delphi中检测鼠标前进和后退按钮事件?

8
如果鼠标除了标准的左/右/中键外还有其他按钮(例如前进/后退),我们如何在Delphi中检测这些按钮的点击?
这个功能的一个例子是Internet Explorer,在Logitech或MS鼠标侧面的前进/后退按钮可以在任何加载的网页之间前进和后退。这似乎复制了键盘上的Backspace / CTRL + Backspace,但我尝试使用KeyPreview和KeyPress事件来检测它,但它无法捕获。
有什么想法可以检测这些扩展鼠标按钮的点击吗?
1个回答

22
您需要捕获 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 = $0319;

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 = $8000;
  FAPPCOMMAND_KEY   = 0;
  FAPPCOMMAND_OEM   = $1000;
  FAPPCOMMAND_MASK  = $F000;

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

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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接