Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




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


3-1175663068
greg123
2007-04-04 09:04
2007.07.01
При переливе из gdb-ки в dbf-ку - сообщение "Out of memory"


11-1164286342
Stan
2006-11-23 15:52
2007.07.01
Undeclared identifier Hint при добавлении компоненты


2-1181413107
Infinityx93
2007-06-09 22:18
2007.07.01
проценты в chart


2-1181112918
Neket
2007-06-06 10:55
2007.07.01
Предотвратить запуск Excel 2 :-((





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский