Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают  [new]
Мимо проходящий который год
Guest
Доброго времени суток !!! тыкните где может быть проблема
Делаю хук на сообщения мышки, все работает кроме двойных кликов
WM_LBUTTONDBLCLK
WM_RBUTTONDBLCLK

+
library HookLib;
 
uses
  Windows,
  Messages;

const

  WH_MOUSE_LL = 14;
var
  HOOK_HANDLE: HHOOK;
 
// хук-процедура
function MouseHook(Code: integer; WParam,LParam: wparam): DWORD; stdcall;
var
  LogHWND: THandle;
begin
  if Code = HC_ACTION then
  begin
  LogHWND:= FindWindow(nil,'Hook_Log');
  if LogHWND <> 0 then
   case WParam of
      WM_LBUTTONDBLCLK: SendMessage(LogHWND,WM_USER, WParam,LParam);
      WM_RBUTTONDBLCLK: SendMessage(LogHWND,WM_USER, WParam,LParam);
      WM_LBUTTONDOWN:   SendMessage(LogHWND,WM_USER, WParam,LParam);
      WM_LBUTTONUP:     SendMessage(LogHWND,WM_USER, WParam,LParam);
      WM_MBUTTONDOWN:   SendMessage(LogHWND,WM_USER, WParam,LParam);
      WM_MBUTTONUP:     SendMessage(LogHWND,WM_USER, WParam,LParam);
      WM_RBUTTONDOWN:   SendMessage(LogHWND,WM_USER, WParam,LParam);
      WM_RBUTTONUP:     SendMessage(LogHWND,WM_USER, WParam,LParam);
      WM_MOUSEWHEEL:    SendMessage(LogHWND,WM_USER, WParam,LParam);
      WM_MOUSEMOVE:     SendMessage(LogHWND,WM_USER, WParam,LParam);
  end;
  {WM_MOUSEMOVE..WM_MOUSEWHEEL:
    begin
      LogHWND:= FindWindow(nil,'Hook_Log');
      if LogHWND <> 0 then

      SendMessage(LogHWND,WM_USER,WParam,LParam);
    end;
  end; }
  end;
  Result:= CallNextHookEx(HOOK_HANDLE,Code,WParam,LParam);
end;

procedure SetMouseHook;
begin
  HOOK_HANDLE:= SetWindowsHookEx(WH_MOUSE_LL,@MouseHook,HInstance,0);
end;

procedure UnHook;
begin
  if HOOK_HANDLE <> 0 then begin
    UnHookWindowshookEx(HOOK_HANDLE);
    HOOK_HANDLE:= 0;
  end;
end;
 
exports
  SetMouseHook, UnHook;
 
begin
  HOOK_HANDLE:= 0;
end.

    unit Unit1;
    
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure WMUser(var Msg: TMessage); message WM_USER;
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses HookLib_Int, MSLLHookStruct;
 
{$R *.dfm}
 
var
  HookData: tagMSLLHOOKSTRUCT;

procedure TForm1.WMUser(var Msg: TMessage);
begin
  HookData:= PtagMSLLHookStruct(Msg.LParam)^;
  // читаем координаты курсора
  Label2.Caption:= 'X: ' + IntToStr(HookData.pt.X);
  Label3.Caption:= 'Y: ' + IntToStr(HookData.pt.Y);
  // определяем тип события
  case Msg.WParam of
  WM_MOUSEMOVE: Label1.Caption:= 'Движение';
  WM_LBUTTONDOWN: Label1.Caption:= 'Нажата левая кнопка';
  WM_LBUTTONUP: Label1.Caption:= 'Отпущена левая кнопка';
  WM_LBUTTONDBLCLK: Label1.Caption:= 'Двойной щелчок левой';
  WM_RBUTTONDOWN: Label1.Caption:= 'Нажата правая кнопка';
  WM_RBUTTONUP: Label1.Caption:= 'Отпущена правая кнопка';
  WM_RBUTTONDBLCLK: Label1.Caption:= 'Двойной щелчок правой';
  WM_MBUTTONDOWN: Label1.Caption:= 'Нажата средняя кнопка';
  WM_MBUTTONUP: Label1.Caption:= 'Отпущена средняя кнопка';
  WM_MBUTTONDBLCLK: Label1.Caption:= 'Двойной щелчок средней';
   WM_MOUSEWHEEL: Label1.Caption:= 'Прокрутка колеса';
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetMouseHook;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnHook;
end;
11 янв 18, 16:08    [21098133]     Ответить | Цитировать Сообщить модератору
 Re: Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24148
В воздух: у окошка есть флаг CS_DBLCLKS?
11 янв 18, 16:13    [21098159]     Ответить | Цитировать Сообщить модератору
 Re: Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
Мимо проходящий который год,

csDoubleClicks

wadman, не приучай к плохому
11 янв 18, 16:31    [21098255]     Ответить | Цитировать Сообщить модератору
 Re: Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают  [new]
Мимо проходящий который год
Guest
wadman и kealon(Ruslan)
спасибо за ответы
если я правильно понимаю , мое окно(form1) должно уметь принимать такие сообщения, то есть иметь стиль CS_DBLCLKS
создаю его стандартными средствами TurboDelphi
как добавить стиль , и где не подскажите ? в реал-тайме или сразу перед компиляцией ?
или это касается чужого приложения с которого я ловлю двойное нажатие ?
12 янв 18, 05:45    [21099615]     Ответить | Цитировать Сообщить модератору
 Re: Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
Мимо проходящий который год,

тьфу, не посмотрел твой код, у тебя же реально хук

CS_DBLCLKS ставится при создании окна, и менять стили у чужого приложения это нехорошо. Выходит только самому считать или в идеале вообще отказаться от использования.
12 янв 18, 08:39    [21099740]     Ответить | Цитировать Сообщить модератору
 Re: Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают  [new]
Мимо проходящий который год
Guest
kealon(Ruslan)
Мимо проходящий который год,

тьфу, не посмотрел твой код, у тебя же реально хук

CS_DBLCLKS ставится при создании окна, и менять стили у чужого приложения это нехорошо. Выходит только самому считать или в идеале вообще отказаться от использования.

считать в смысле интервал между кликами и последовательность down up down up?
то есть глобальный хук не сможет обработать двойное нажатие мышки, может кто знает обход ? :-(
12 янв 18, 10:48    [21100330]     Ответить | Цитировать Сообщить модератору
 Re: Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3267
Мимо проходящий который год,

да, это не первичные сообщения, они в винпроц генерятся, собственно там и происходит расчёт

а в чём проблема интервал посчитать и сравнить с ... ?
12 янв 18, 19:57    [21102962]     Ответить | Цитировать Сообщить модератору
 Re: Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают  [new]
Мимо проходящий который год
Guest
kealon(Ruslan)
Мимо проходящий который год,

да, это не первичные сообщения, они в винпроц генерятся, собственно там и происходит расчёт

а в чём проблема интервал посчитать и сравнить с ... ?

так и сделал
TargetTime := GetTickCount;
...
GetDoubleClickTime<(TargetTime-lastTime)
...
LastTime:=GetTickCount;
13 янв 18, 02:13    [21103740]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить