powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
8 сообщений из 8, страница 1 из 1
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
    #39582644
Доброго времени суток !!! тыкните где может быть проблема
Делаю хук на сообщения мышки, все работает кроме двойных кликов
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
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
    #39582647
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В воздух: у окошка есть флаг CS_DBLCLKS?
...
Рейтинг: 0 / 0
Hook на Mouse WM_LBUTTONDBLCLK и прочие двойные клики не срабатывают
    #39582667
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимо проходящий который год,

csDoubleClicks

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

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

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

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

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

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

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

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

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


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