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

时间:2010-03-16 22:52:58

标签: delphi mouse mouseevent

如果鼠标除了标准左/右/中间(例如前/后)之外还有其他按钮,我们如何在Delphi中检测这些按钮点击?

如何使用它的一个示例是Internet Explorer,其中Logitech或MS鼠标侧面的前进/后退按钮在任何加载的网页之间前后循环。这似乎复制了键盘上的Backspace / CTRL + Backspace,但我尝试使用KeyPreview和KeyPress事件检测到它,但是它没有接收它。

知道如何检测这些扩展鼠标按钮的点击次数吗?

1 个答案:

答案 0 :(得分:16)

您需要捕获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.