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

Вниз

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

 
Igor Zorkov ©   (2007-11-21 13:36) [0]

Ставлю Hook на мышь, если форму закрываю кликнув на кнопке close в заголовке формы то форма закрывается через довольно большой промежуток времени, в остальных случаях нормально

Почему такое проиходит и как с этим бороться, подскажите пожалуйста?

вот код dll

library MouseHook;

uses
 Windows, Messages, Forms, Controls, Dialogs, SysUtils;

const
 WH_MOUSE_LL = 14;
 MMFName: PChar = "MMF";

type
 PGlobalDLLData = ^TGlobalDLLData;
 TGlobalDLLData = packed record
   SysHook: HWND;
   Wnd: HWND;
 end;

var
 GlobalData: PGlobalDLLData;
 MMFHandle: THandle;

function SysMsgProc(Code: Integer; wParam: Word; lParam: Longint): Longint; stdcall;
begin
 if (Code = HC_ACTION) then
 begin
   if (wParam =  WM_MBUTTONDOWN) then
     ShowMessage("MESSAGE")
   else
     Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
 end;
end;

function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall;
begin
 Result:= False;
 if State = True then
 begin
   GlobalData^.SysHook:= SetWindowsHookEx(WH_MOUSE_LL, @SysMsgProc, HInstance, 0);
   GlobalData^.Wnd:= Wnd;
   if GlobalData^.SysHook <> 0 then
     Result:= True;
 end
 else
 begin
   UnhookWindowsHookEx(GlobalData^.SysHook);
   Result:= False;
 end;
end;

function StopMouseHook(): Boolean; export; stdcall;
begin
 UnhookWindowsHookEx(GlobalData^.SysHook);
 if GlobalData^.SysHook = 0 then
   Result:= False
 else
  Result:= True;
end;

procedure OpenGlobalData();
begin
 MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
 GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
 if GlobalData = nil then
   CloseHandle(MMFHandle);
end;

procedure CloseGlobalData();
begin
 UnmapViewOfFile(GlobalData);
 CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(Reason: DWord); stdcall;
begin
 case Reason of
   DLL_PROCESS_ATTACH: OpenGlobalData;
   DLL_PROCESS_DETACH: CloseGlobalData;
 end;
end;

exports StartMouseHook, StopMouseHook;

begin
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


 
Rouse_ ©   (2007-11-21 14:34) [1]

function SysMsgProc(Code: Integer; wParam: Word; lParam: Longint): Longint; stdcall;
begin
if (Code = HC_ACTION) then
begin
  if (wParam =  WM_MBUTTONDOWN) then
    ShowMessage("MESSAGE")
  else
    Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
end
else
  Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
end;


 
Rouse_ ©   (2007-11-21 14:38) [2]

Кстати, зачем ты WH_MOUSE_LL в библиотеке используешь? Достаточно обычного приложения. И stdcall убери у DLLEntryPoint, к тому же wParam у SysMsgProc толжен иметь тип DWORD


 
Igor Zorkov ©   (2007-11-21 15:01) [3]


> Rouse_ ©   (21.11.07 14:38) [2]
> Кстати, зачем ты WH_MOUSE_LL в библиотеке используешь?


function SysMsgProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin
 if (Code = HC_ACTION) then
 begin
   if (wParam =  WM_MBUTTONDOWN) then
   begin
     if  boolean{некая переменная допустим}{если нужно заблокировать кнопку} = True then
       Result:= - 1
     else
       Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
   end else
     Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
 end;
end;



> Rouse_ ©   (21.11.07 14:34) [1]


Сделал так

function SysMsgProc(Code: Integer; wParam: Word; lParam: Longint): Longint; stdcall;
begin
if (Code = HC_ACTION) then
begin
 if (wParam =  WM_MBUTTONDOWN) then
   ShowMessage("MESSAGE")
 else
   Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
end
else
 Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
end;


если hook установлен, закрытие или минимизация формы проходит долго, если ставить на WH_MOUSE такого нет


 
Igor Zorkov ©   (2007-11-21 15:08) [4]

Если делать так

Rouse_ ©   (21.11.07 14:34) [1] +
if  boolean{некая переменная допустим}{если нужно заблокировать кнопку} = True then
      Result:= - 1
    else
      Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);


то блокируеться вся мышь, как же быть?


 
Rouse_ ©   (2007-11-21 15:29) [5]

Задержка на переключении контекста. Это описано в справке:

The system call this function every time a new mouse input event is about to be posted into a thread input queue. The mouse input can come from the local mouse driver or from calls to the mouse_event function. If the input comes from a call to mouse_event, the input was "injected". However, the WH_MOUSE_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event.


 
Igor Zorkov ©   (2007-11-21 15:48) [6]


> Rouse_ ©   (21.11.07 15:29) [5]


Что же делать? Подскажи пожалуйста


 
Rouse_ ©   (2007-11-21 16:14) [7]

Если решил уж использовать библиотеку - тогда используй обычный WH_MOUSE


 
Igor Zorkov ©   (2007-11-21 16:28) [8]


> Rouse_ ©   (21.11.07 16:14) [7]


Но в обычном приложении то же происходит задержка.

А если пользовать WH_MOUSE то как можно блокировать среднюю кнопку мыши?


 
Igor Zorkov ©   (2007-11-21 16:35) [9]

А если делать так то нормально минимизируеться, непонимаю

procedure TForm1.Button1Click(Sender: TObject);
begin
 Application.Minimize;
end;


 
Rouse_ ©   (2007-11-21 16:36) [10]


> Но в обычном приложении то же происходит задержка.

Я же объяснил, это издержки LowLevel... А блокировать просто - не вызывать CallNextHookEx на среднюю кнопку и возвращать 1


 
Igor Zorkov ©   (2007-11-21 17:36) [11]


> Rouse_ ©


Спасибо



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

Форум: "WinAPI";
Текущий архив: 2008.08.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
15-1215742935
Slider007
2008-07-11 06:22
2008.08.31
С днем рождения ! 11 июля 2008 пятница


15-1215890922
Zeqfreed
2008-07-12 23:28
2008.08.31
В ICFP никто не участвует?


8-1184936230
DmitriyZ
2007-07-20 16:57
2008.08.31
Как в Delphi сгенерировать звук произвольной частоты и вывести ег


2-1216819268
lavgirls
2008-07-23 17:21
2008.08.31
Подскажите как удалить папку


2-1216845572
Terasbetoni
2008-07-24 00:39
2008.08.31
Как устанавливать библиотеки? В частности GLScene.





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