Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.01;
Скачать: CL | DM;

Вниз

SetWindowsHookEx   Найти похожие ветки 

 
Лысеющий Самурай   (2007-04-29 11:42) [0]

Уважаемые Мастера подскажите пожалуйста почему прграмма неработает если кликаешь по заголовкам окон или например на "ToolbarWindow32"

var
 Form1: TForm1;
 GWWM_MBUTTONDOWN: Cardinal;
 GWWM_MBUTTONUP: Cardinal;
 GWWM_LBUTTONDOWN: Cardinal;
 GWWM_LBUTTONUP: Cardinal;
 GWWM_RBUTTONDOWN: Cardinal;
 GWWM_RBUTTONUP: Cardinal;
 GWWM_MOUSEMOVE: Cardinal;

 procedure RunStopHook(State: Boolean) stdcall; external "MouseHook.dll";

implementation

{$R *.dfm}

procedure TForm1.WndProc(var Msg: TMessage);
begin
inherited ;
 if Msg.Msg = GWWM_LBUTTONDOWN then
 begin
   Memo1.Lines.Add("Left Mouse Down");
 end;
 if Msg.Msg = GWWM_LBUTTONUP then
 begin
   Memo1.Lines.Add("Left Mouse Up");
 end;
 if Msg.Msg = GWWM_MBUTTONDOWN then
 begin
   Memo1.Lines.Add("Middle Mouse Down");
 end;
 if Msg.Msg = GWWM_MBUTTONUP then
 begin
   Memo1.Lines.Add("Middle Mouse Up");
 end;
 if Msg.Msg = GWWM_RBUTTONDOWN then
 begin
   Memo1.Lines.Add("Right Mouse Down");
 end;
 if Msg.Msg = GWWM_RBUTTONUP then
 begin
   Memo1.Lines.Add("Right Mouse Up");
 end;
 if Msg.Msg = GWWM_MOUSEMOVE then
 begin
   Caption:= IntToStr(Mouse.CursorPos.X) + " / " + IntToStr(Mouse.CursorPos.Y);
 end;
end;

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

procedure TForm1.FormDestroy(Sender: TObject);
begin
 RunStopHook(False);
end;

initialization
 GWWM_MBUTTONDOWN:= RegisterWindowMessage("GWWM_MBUTTONDOWN");
 GWWM_MBUTTONUP:= RegisterWindowMessage("GWWM_MBUTTONUP");
 GWWM_LBUTTONDOWN:= RegisterWindowMessage("GWWM_LBUTTONDOWN");
 GWWM_LBUTTONUP:= RegisterWindowMessage("GWWM_LBUTTONUP");
 GWWM_RBUTTONDOWN:= RegisterWindowMessage("GWWM_RBUTTONDOWN");
 GWWM_RBUTTONUP:= RegisterWindowMessage("GWWM_RBUTTONUP");
 GWWM_RBUTTONUP:= RegisterWindowMessage("GWWM_MOUSEMOVE");

end.


DLL

library MouseHook;

uses
 Windows, Messages, Controls;
var
 SysHook: HHook = 0;
 Wnd: Hwnd = 0;
 GWWM_MBUTTONDOWN: Cardinal;
 GWWM_MBUTTONUP: Cardinal;
 GWWM_LBUTTONDOWN: Cardinal;
 GWWM_LBUTTONUP: Cardinal;
 GWWM_RBUTTONDOWN: Cardinal;
 GWWM_RBUTTONUP: Cardinal;
 GWWM_MOUSEMOVE: Cardinal;

function SysMsgProc(code: integer; wParam: word; lParam: longint): longint; stdcall;
begin
CallNextHookEx(SysHook, Code, wParam, lParam);
if code = HC_ACTION then
begin
  Wnd:= TMsg(Pointer(lParam)^).hwnd;
  if TMsg(Pointer(lParam)^).message = WM_LBUTTONDOWN then
    SendMessage(HWND_BROADCAST, GWWM_LBUTTONDOWN, 0, 0);
  if TMsg(Pointer(lParam)^).message = WM_LBUTTONUP then
    SendMessage(HWND_BROADCAST, GWWM_LBUTTONUP, 0, 0);
  if TMsg(Pointer(lParam)^).message = WM_MBUTTONDOWN then
    SendMessage(HWND_BROADCAST, GWWM_MBUTTONDOWN, 0, 0);
  if TMsg(Pointer(lParam)^).message = WM_MBUTTONUP then
    SendMessage(HWND_BROADCAST, GWWM_MBUTTONUP, 0, 0);
  if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then
    SendMessage(HWND_BROADCAST, GWWM_RBUTTONDOWN, 0, 0);
  if TMsg(Pointer(lParam)^).message = WM_RBUTTONUP then
    SendMessage(HWND_BROADCAST, GWWM_RBUTTONUP, 0, 0);
  if TMsg(Pointer(lParam)^).message = WM_MOUSEMOVE then
    SendMessage(HWND_BROADCAST, GWWM_MOUSEMOVE, 0, 0);
 end;
end;

procedure RunStopHook(State : Boolean) export; stdcall;
begin
if State = true then
begin
  SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
end
else
begin
  UnhookWindowsHookEx(SysHook);
  SysHook:= 0;
end;
end;

exports RunStopHook;

begin
 GWWM_MBUTTONDOWN:= RegisterWindowMessage("GWWM_MBUTTONDOWN");
 GWWM_MBUTTONUP:= RegisterWindowMessage("GWWM_MBUTTONUP");
 GWWM_LBUTTONDOWN:= RegisterWindowMessage("GWWM_LBUTTONDOWN");
 GWWM_LBUTTONUP:= RegisterWindowMessage("GWWM_LBUTTONUP");
 GWWM_RBUTTONDOWN:= RegisterWindowMessage("GWWM_RBUTTONDOWN");
 GWWM_RBUTTONUP:= RegisterWindowMessage("GWWM_RBUTTONUP");
 GWWM_RBUTTONUP:= RegisterWindowMessage("GWWM_MOUSEMOVE");
end.


 
Лысеющий Самурай   (2007-04-29 11:46) [1]

Я так понимаю сообщения надо передавать как то по другому, не SendMessage(HWND_BROADCAST...


 
begin...end ©   (2007-04-29 21:23) [2]

> Лысеющий Самурай   (29.04.07 11:42)

> почему прграмма неработает если кликаешь по заголовкам окон

Потому что в этом случае генерируются сообщения вида WM_NC...BUTTON... (NC -- non-client, неклиентская область окна). Например, WM_NCLBUTTONDOWN.

Ну, а зачем передавать сообщения всем окнам верхнего уровня (HWND_BROADCAST), действительно, непонятно.

P.S. Вы про конструкцию case не слышали? ;-)


 
Leonid Troyanovsky ©   (2007-04-29 21:55) [3]


> Лысеющий Самурай   (29.04.07 11:46) [1]

> Я так понимаю сообщения надо передавать как то по другому,
>  не SendMessage(HWND_BROADCAST...

Правильно понимаешь.
Хотя бы, путем SendMessageTimeout.

--
Regards, LVT.


 
Ketmar ©   (2007-04-29 22:09) [4]

broadcast -- это круто. очень.

к автору есть предложение: почитать о других функциях отсылки сообщений. или подумать и переписать код.


 
Leonid Troyanovsky ©   (2007-04-29 22:12) [5]


> Ketmar ©   (29.04.07 22:09) [4]

> сообщений. или подумать и переписать код.

Неверная модальность, IMHO.
Думать надо всегда, до дней последних донца.

--
Regards, LVT.


 
Ketmar ©   (2007-04-29 22:17) [6]

> Leonid Troyanovsky © (29.04.07 22:12) [5]
> Неверная модальность, IMHO.
> Думать надо всегда, до дней последних донца.

я же не садист! а вдруг автору тяжело "всегда"?


 
Leonid Troyanovsky ©   (2007-04-29 22:23) [7]


> Ketmar ©   (29.04.07 22:17) [6]

> > Думать надо всегда, до дней последних донца.
> я же не садист! а вдруг автору тяжело "всегда"?

Тяжело в ученье - легко в бою.
"Всегда" же звучит упадочнечески.
С утра - это более по-нашему.

--
Regards, LVT.


 
Лысеющий Самурай   (2007-05-01 15:28) [8]


> begin...end
> Ketmar
> Leonid Troyanovsky


Спасибо



Страницы: 1 вся ветка

Текущий архив: 2007.07.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
11-1163367414
КВАНТ
2006-11-13 00:36
2007.07.01
StatusBar.AutoHint := ???


15-1180687632
Andy BitOff (ppc)
2007-06-01 12:47
2007.07.01
трафикометр для кпк


15-1180811637
Dr.Urgen
2007-06-02 23:13
2007.07.01
Andy BitOff - супер-спец!


2-1181201129
Snane
2007-06-07 11:25
2007.07.01
Замена DBNavigator


15-1179599783
GeLLeR
2007-05-19 22:36
2007.07.01
STALKER