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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2012, 15:14   #1
Spawn.Ivan
Пользователь
 
Регистрация: 21.03.2012
Сообщений: 12
Радость Ловля боковых кнопок Мыши по всему экрану

Здравствуйте. Когда бродил по просторам интернета я нашел вот это:
Код:
type
  TForm1 = class(TForm)
  procedure WMXButtonDown( var Message: TWMMouse); message WM_XBUTTONDOWN;


const
{$ifdef COMPILER_13_UP} // WM_XBUTTON* уже объявлены в D2010
      WM_XBUTTONDOWN = $020B; // сообщение о нажатии X button
      WM_XBUTTONUP = $020C;   // сообщение об отпускании X button
{$endif}
      MK_XBUTTON1 = $20;      // идентификатор клавиши "назад" в LoWord(WParam)
      MK_XBUTTON2 = $40;      // идентификатор клавиши "вперёд" в LoWord(WParam)
      XBUTTON1 = $1;          // код клавиши "назад" в HiWord(WParam)
      XBUTTON2 = $2;          // код клавиши "вперёд" в HiWord(WParam)

...

// Боковые кнопки---------------------------------------------------------------------
procedure TForm1.WMXButtonDown(var Message: TWMMouse);
var Msg: PEVENTMSG; 
begin
  // удостоверяемся, что нажата Х кнопка
  if Message.Keys and (MK_XBUTTON1 or MK_XBUTTON2) <> 0 then
  begin 
    // определяем, какая именно Х кнопка нажата и действуем соответственно
   case HiWord(Message.Keys) of
     XBUTTON1 : Form1.Memo1.Lines.Add('Back');
      XBUTTON2 : Form1.Memo1.Lines.Add('Fwd');
      else       ShowMessage('Err');
    end;


    end;


  end;
//------------------------------------------------------------------------------

Он позволяет определить что была нажата одна из X кнопок мыши.
Подскажите пожалуйста как его заставить работать в любом чужом окне и по всему рабочему пространству.

При определении 1,2,3-й кнопок я разобрался как. Но тут не получается... Помогите =)

Последний раз редактировалось Stilet; 22.09.2015 в 19:01. Причина: Изменил код до начального состояния
Spawn.Ivan вне форума Ответить с цитированием
Старый 21.03.2012, 17:53   #2
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

Вся проблема в том, что автор не мог или не хотел изложить задачу компилятору в более доступной форме. Перемудрил одни словом). Вся ошибка в условии.

Вот так должно работать:

Код:
if (Message.Keys = MK_XBUTTON1) or (Message.Keys = MK_XBUTTON2) then
Miha85193 вне форума Ответить с цитированием
Старый 21.03.2012, 18:24   #3
Spawn.Ivan
Пользователь
 
Регистрация: 21.03.2012
Сообщений: 12
По умолчанию

Miha85193,
Цитата:
Вот так должно работать:
if (Message.Keys = MK_XBUTTON1) or (Message.Keys = MK_XBUTTON2) then
А так вапще ничего не работает =)
Spawn.Ivan вне форума Ответить с цитированием
Старый 21.03.2012, 18:32   #4
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

пардон, ошибся)

попробуй вот так:

Код:
if (Message.Keys and (MK_XBUTTON1 or MK_XBUTTON2)) <> 0 then
или так:

Код:
if ((Message.Keys and MK_XBUTTON1) <> 0) or ((Message.Keys and MK_XBUTTON2) <> 0) then
Miha85193 вне форума Ответить с цитированием
Старый 21.03.2012, 18:33   #5
Spawn.Ivan
Пользователь
 
Регистрация: 21.03.2012
Сообщений: 12
По умолчанию

Нашел проблему.. надо так:

Код:
if (loword(Message.Keys) = MK_XBUTTON1) or (loword(Message.Keys) = MK_XBUTTON2)then
Но работает ТОЛЬКО внутри моей проги... А мне надо снаружи чтобы ловило...

Miha85193,
Цитата:
или так:
Код:
if ((Message.Keys and MK_XBUTTON1) <> 0) or ((Message.Keys and MK_XBUTTON2) <> 0) then
Так работает, но опять же только внутри...


Подскажи пожалуйста как это сделать ))

Последний раз редактировалось Stilet; 21.03.2012 в 22:01.
Spawn.Ivan вне форума Ответить с цитированием
Старый 21.03.2012, 18:48   #6
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Spawn.Ivan Посмотреть сообщение
Miha85193,


Так работает, но опять же только внутри...


Подскажи пожалуйста как это сделать ))
а за пределами окна TForm1 ловит нажатия (когда окно приложения в фокусе)?
Miha85193 вне форума Ответить с цитированием
Старый 21.03.2012, 19:41   #7
Spawn.Ivan
Пользователь
 
Регистрация: 21.03.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Miha85193 Посмотреть сообщение
а за пределами окна TForm1 ловит нажатия (когда окно приложения в фокусе)?
Вот это я и хочу сделать... Чтобы ловил за пределами формы..
Spawn.Ivan вне форума Ответить с цитированием
Старый 21.03.2012, 19:52   #8
Miha85193
Delphi, OpenGL API
Форумчанин
 
Аватар для Miha85193
 
Регистрация: 29.03.2010
Сообщений: 152
По умолчанию

так походу приложение теряет фокус при нажатии кнопок мышки за пределами окна. а когда главное окно приложения не в фокусе, оно "спит".

Код:
type
TForm1 = class(TForm)
procedure WMXButtonDown( var Message: TWMMouse); message WM_XBUTTONDOWN;
из самого кода следует, что нельзя решить проблему этим путем.
Miha85193 вне форума Ответить с цитированием
Старый 21.03.2012, 20:26   #9
Spawn.Ivan
Пользователь
 
Регистрация: 21.03.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Miha85193 Посмотреть сообщение
из самого кода следует, что нельзя решить проблему этим путем.
А можно как-нить вапще решить эту проблему? или тоже самое сделать но чтобы не только в форме работало?

Вот весь код программы:

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
     procedure WMXButtonDown( var Message: TWMMouse); message WM_XBUTTONDOWN;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1; HookHandle: HHook;

implementation

{$R *.dfm}
 const
{$ifdef COMPILER_13_UP} // WM_XBUTTON* уже объявлены в D2010
      WM_XBUTTONDOWN = $020B; // сообщение о нажатии X button
      WM_XBUTTONUP = $020C;   // сообщение об отпускании X button
{$endif}
      MK_XBUTTON1 = $20;      // идентификатор клавиши "назад" в LoWord(WParam)
      MK_XBUTTON2 = $40;      // идентификатор клавиши "вперёд" в LoWord(WParam)
      XBUTTON1 = $1;          // код клавиши "назад" в HiWord(WParam)
      XBUTTON2 = $2;          // код клавиши "вперёд" в HiWord(WParam)
//Ищем хэндл по имени окна -------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var h: Thandle;
begin
h:=FindWindow(nil,PChar(edit1.text));
label1.Caption:=inttostr(h);
end;
//--------------------------------------------------------------------------------

 // ХУК --------------------------------------------------------------------------
Function HookProc(Code: Integer; WParam: Word; LParam: Longint): Longint; Stdcall;
Var
Msg: PEVENTMSG;
Begin
If Code>=0 Then
Begin
Msg:=Pointer(LParam);
Case Msg.message Of
WM_LBUTTONDOWN: Form1.Memo1.Lines.Add('L-mouse');
WM_RBUTTONDOWN: Form1.Memo1.Lines.Add('R-mouse');
WM_MBUTTONDOWN: Form1.Memo1.Lines.Add('middle');
End;
End;
End;
//--------------------------------------------------------------------------------

procedure TForm1.FormCreate(Sender: TObject);
begin
HookHandle:=SetWindowsHookEx(WH_JOURNALRECORD,@HookProc,HInstance,0);
end;

// Боковые кнопки---------------------------------------------------------------------
procedure TForm1.WMXButtonDown(var Message: TWMMouse);
begin
  // удостоверяемся, что нажата Х кнопка
 if ((Message.Keys and MK_XBUTTON1) <> 0) or ((Message.Keys and MK_XBUTTON2) <> 0) then
  begin
    // определяем, какая именно Х кнопка нажата и действуем соответственно
   case HiWord(Message.Keys) of
     XBUTTON1 : Form1.Memo1.Lines.Add('Back');
      XBUTTON2 : Form1.Memo1.Lines.Add('Fwd');
      else       ShowMessage('Err');
    end;


    end;


  end;
//------------------------------------------------------------------------------

end.



И вот когда я наживаю на 1,2, и 3-ю кнопку на мышке - кнопки определяются по всему экрану... Форма выходит из фокуса но все работает... Я понимаю вроде почему но не могу тоже самое сделать и тут...

Последний раз редактировалось Stilet; 21.03.2012 в 22:04.
Spawn.Ivan вне форума Ответить с цитированием
Старый 22.09.2015, 15:25   #10
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Искал решение, на форумах не нашел.
Может кому пригодится.
Код:
function MouseProc(const nCode: Integer; const wParam, lParam: Longint)
  : LRESULT; stdcall;
Var
  Msg: PEVENTMSG;
begin
  result := CallNextHookEx(0, nCode, wParam, lParam);
  Msg := Pointer(lParam);
  if (nCode = HC_ACTION) then
    case Msg.paramH of
      65536:
        //forward
      131072:
        //back
    end;

end;
Кольша вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение курсора мыши по экрану Илья2204 Общие вопросы C/C++ 1 08.12.2010 13:34
Программное перемещение указателя мыши по экрану. LENINGOLD Общие вопросы Delphi 3 30.11.2009 01:58
Перехват нажатия кнопок мыши DarkEvil Win Api 7 15.06.2009 22:38
Узнать состояние кнопок мыши Cold_Night Общие вопросы Delphi 3 07.06.2009 21:36
Нажатие кнопок мыши zzzzz Win Api 7 02.12.2007 12:33