Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают / 8 сообщений из 8, страница 1 из 1
11.01.2018, 16:08:25
    #39582644
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
Доброго времени суток !!! тыкните где может быть проблема
Делаю хук на сообщения мышки, все работает кроме двойных кликов
WM_LBUTTONDBLCLK
WM_RBUTTONDBLCLK

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
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.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
    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;

...
Рейтинг: 0 / 0
11.01.2018, 16:13:14
    #39582647
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
В воздух: у окошка есть флаг CS_DBLCLKS?
...
Рейтинг: 0 / 0
11.01.2018, 16:31:20
    #39582667
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
Мимо проходящий который год,

csDoubleClicks

wadman, не приучай к плохому
...
Рейтинг: 0 / 0
12.01.2018, 05:45:44
    #39582959
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
wadman и kealon(Ruslan)
спасибо за ответы
если я правильно понимаю , мое окно(form1) должно уметь принимать такие сообщения, то есть иметь стиль CS_DBLCLKS
создаю его стандартными средствами TurboDelphi
как добавить стиль , и где не подскажите ? в реал-тайме или сразу перед компиляцией ?
или это касается чужого приложения с которого я ловлю двойное нажатие ?
...
Рейтинг: 0 / 0
12.01.2018, 08:39:15
    #39582990
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
Мимо проходящий который год,

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

CS_DBLCLKS ставится при создании окна, и менять стили у чужого приложения это нехорошо. Выходит только самому считать или в идеале вообще отказаться от использования.
...
Рейтинг: 0 / 0
12.01.2018, 10:48:44
    #39583107
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
kealon(Ruslan)Мимо проходящий который год,

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

CS_DBLCLKS ставится при создании окна, и менять стили у чужого приложения это нехорошо. Выходит только самому считать или в идеале вообще отказаться от использования.
считать в смысле интервал между кликами и последовательность down up down up?
то есть глобальный хук не сможет обработать двойное нажатие мышки, может кто знает обход ? :-(
...
Рейтинг: 0 / 0
12.01.2018, 19:57:18
    #39583520
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
Мимо проходящий который год,

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

а в чём проблема интервал посчитать и сравнить с ... ?
...
Рейтинг: 0 / 0
13.01.2018, 02:13:53
    #39583604
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
kealon(Ruslan)Мимо проходящий который год,

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

а в чём проблема интервал посчитать и сравнить с ... ?
так и сделал
TargetTime := GetTickCount;
...
GetDoubleClickTime<(TargetTime-lastTime)
...
LastTime:=GetTickCount;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]