Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2011, 18:49   #1
like_cloud
Пользователь
 
Аватар для like_cloud
 
Регистрация: 09.12.2009
Сообщений: 29
По умолчанию зависания при использовании хука на мышь

доброго времени суток,господа!

пишу программку,которая должна вести лог нажатий на клавиши мыши например с координатами курсора в момент нажатия. Использую для этого dll привязанный к основной форме программы.

вот, к примеру, перехват нажатия правой кнопки:
Код:
library mdetect;

uses
  Winapi.Windows,
  Winapi.Messages,
  System.Classes;

const
  MouseHookMSG=WM_USER+$125;

{$R *.res}

var
MouseDetect:HHook;

function MouseDetectFunc(code: integer; wParam: WPARAM; lParam: LPARAM):DWORD;stdCall;export;
var
  x,y:integer;
  MouseStruct: TMouseHookStruct;
begin
    if code<0 then
      Result := CallNextHookEx(MouseDetect,Code, wParam, lParam)
  else
  begin
    if  wParam=WM_RBUTTONDOWN then
     begin
    MouseStruct:=TMouseHookStruct(Pointer(Lparam)^);
    y:=MouseStruct.PT.y;
    x:=MouseStruct.PT.x;
    PostMessage(FindWindow(nil, PChar('Form3')),MouseHookMSG, x, y);
    result:=CallNextHookEx(MouseDetect,Code, wParam, lParam);
  end;
  end;
end;


function SetMouseDetectHook:boolean;stdCall;export;
begin
  result:=true;
  MouseDetect:=SetWindowsHookEx(WH_MOUSE, @MouseDetectFunc, hInstance, 0);
end;

function UnHookMouseDetect:boolean;stdCall;export;
begin
  UnhookWindowsHookEx(MouseDetect);
  result:=true;
end;

exports
  SetMouseDetectHook,
  UnHookMouseDetect;

begin

end.
проблема в том,что перехват происходит через раз равно как и вообще срабатывание любого клика мышью. При этом интерфейс вызвавшей dll формы прилично подвисает. Подскажите в какую сторону копать?
like_cloud вне форума Ответить с цитированием
Старый 08.12.2011, 19:01   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Код:
CallNextHookEx(<здесь можно ноль>,Code, wParam, lParam);
Код:
PostMessage(FindWindow(nil, PChar('Form3')),MouseHookMSG, x, y);
очень тяжёлый код особенно для хука. попробуй найти хендл формы заранее и сохранить его в переменную. а потом посмотрим что получится
rpy3uH вне форума Ответить с цитированием
Старый 08.12.2011, 20:08   #3
like_cloud
Пользователь
 
Аватар для like_cloud
 
Регистрация: 09.12.2009
Сообщений: 29
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
очень тяжёлый код особенно для хука. попробуй найти хендл формы заранее и сохранить его в переменную. а потом посмотрим что получится
переписал как советуете, результат тот же - висит интерфейс программы и "винды", левый и правый клики мышью срабатывают один из 5 или около того


нашел логическую ошибку, теперь вот так:
Код:
function MouseDetectFunc(code: integer; wParam: WPARAM; lParam: LPARAM):DWORD;stdCall;export;
var
  x,y:integer;
  MouseStruct: TMouseHookStruct;
begin
    if code<0 then
      Result := CallNextHookEx(MouseDetect,Code, wParam, lParam)
  else
  begin
    if  wParam=WM_RBUTTONDOWN then
     begin
    MouseStruct:=TMouseHookStruct(Pointer(Lparam)^);
    y:=MouseStruct.PT.y;
    x:=MouseStruct.PT.x;
    PostMessage(hh,MouseHookMSG, x, y);
  end;
  result:=CallNextHookEx(0,Code, wParam, lParam); //вынес из обработки ПКМ
  end;
end;
теперь все клики мышкой нормально срабатывают,но интерфейс программы продолжает подвисать и далеко не все клики ПКМ определяются

Последний раз редактировалось like_cloud; 08.12.2011 в 20:19.
like_cloud вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Cинтаксис кода при использовании Or Brucebelg Microsoft Office Excel 3 30.11.2011 13:06
Зависания при подключении alexprey Работа с сетью в Delphi 1 31.01.2011 21:55
Ошибка при использовании ICQClient Mihanches Работа с сетью в Delphi 2 04.10.2010 21:27
Проблема при использовании CreatProcess иннокент Win Api 6 18.08.2010 19:11
Как избавиться от зависания приложения при выполнении длительных операциях Des Общие вопросы Delphi 15 30.04.2009 02:05