Главная страница
    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
2-1181037181
Изя
2007-06-05 13:53
2007.07.01
чтото вида PageControl


2-1180988044
Koha
2007-06-05 00:14
2007.07.01
помогите конвертировать время


1-1178270061
Oleg_teacher
2007-05-04 13:14
2007.07.01
Вопрос по Стринггриде


2-1181492780
Sycho
2007-06-10 20:26
2007.07.01
Перетосовщик Букв Помогите !


2-1181140831
Bora_ru
2007-06-06 18:40
2007.07.01
Handle окна по неполному названию





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский