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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2009, 18:57   #1
sav0k
Новичок
Джуниор
 
Аватар для sav0k
 
Регистрация: 06.02.2009
Сообщений: 2
По умолчанию Проблема с хуком WH_MOUSE

Здравствуйте, похожая тема уже есть, но у меня другая проблема.
Пишу програмку для анализа интерфейса программ: моя прога должна считать время, клики мышкой, нажатия с клавиатуры и тд. Потом по этим данным оценка будет.
В сети нашел хук для мыши и столкнулся с проблемой: при использовании хука WH_MOUSE_LL - не срабатывает событие WM_LBUTTONDBLCLK (двойной клик), а при использовании WH_MOUSE - не работают контекстные меню.
Не могу понять в чем проблема. Заранее спасибо.

Код DLL:
Код:
function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin

  if (Code = HC_ACTION) then         
  begin
    if (wParam =  WM_LBUTTONDBLCLK) then
    begin
      SendMessage(GlobalData.Wnd, MWM_LBUTTONDBLCLK, 0, 0);
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_LBUTTONDOWN) then
    begin
      SendMessage(GlobalData.Wnd, MWM_LBUTTONDOWN, 0, 0);
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_LBUTTONUP) then
    begin
      SendMessage(GlobalData.Wnd, MWM_LBUTTONUP, 0, 0);
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_MBUTTONDOWN) then
    begin
      SendMessage(GlobalData.Wnd, MWM_MBUTTONDOWN, 0, 0);
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_MBUTTONUP) then
    begin
      SendMessage(GlobalData.Wnd, MWM_MBUTTONUP, 0, 0);
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_RBUTTONDOWN) then
    begin
      SendMessage(GlobalData.Wnd, MWM_RBUTTONDOWN, 0, 0);
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_RBUTTONUP) then
    begin
      SendMessage(GlobalData.Wnd, MWM_RBUTTONUP, 0, 0);
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_MOUSEWHEEL) then
    begin
      SendMessage(GlobalData.Wnd, MWM_MOUSEWHEEL, 0, 0);
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_MOUSEMOVE) then
    begin
      SendMessage(GlobalData.Wnd, MWM_MOUSEMOVE, 0, 0);
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end
    else
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
  end;
end;


function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall;
begin
  Result := False;
  if State = True then
  begin
    //  WH_MOUSE_LL    WH_MOUSE
    GlobalData.WndHook := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);
    GlobalData.Wnd := Wnd;


    if GlobalData.WndHook <> 0 then
      Result := True;
  end
  else
  begin
    UnhookWindowsHookEx(GlobalData^.WndHook);
    Result := False;
  end;
end;
Код программы:
Код:
// обработка события --------------------------
procedure TFormMain.WndProc(var Msg: TMessage);
begin
  inherited;
  if (Msg.Msg = MWM_LBUTTONDBLCLK) then
  begin
    Stat.inc(3);
    if(stat.LKM>0) then Stat.dec(0);
  end;
  if (Msg.Msg = MWM_LBUTTONDOWN) then
  begin
    Stat.inc(0);
  end;
  if (Msg.Msg = MWM_MBUTTONDOWN) then
  begin
    Stat.inc(2);
  end;
  if (Msg.Msg = MWM_RBUTTONDOWN) then
  begin
    Stat.inc(1);
  end;
  if (Msg.Msg = MWM_MOUSEMOVE) then
  begin
    //CheckBox1.Checked := true;
  end;
end;

initialization
  MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
  MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
  MWM_MBUTTONDOWN := RegisterWindowMessage('MWM_MBUTTONDOWN');
  MWM_MBUTTONUP := RegisterWindowMessage('MWM_MBUTTONUP');
  MWM_RBUTTONDOWN := RegisterWindowMessage('MWM_RBUTTONDOWN');
  MWM_RBUTTONUP := RegisterWindowMessage('MWM_RBUTTONUP');
  MWM_MOUSEWHEEL := RegisterWindowMessage('MWM_MOUSEWHEEL');
  MWM_MOUSEMOVE := RegisterWindowMessage('MWM_MOUSEMOVE');
  MWM_LBUTTONDBLCLK := RegisterWindowMessage('MWM_LBUTTONDBLCLK');
end.
Вложения
Тип файла: rar projects.rar (373.1 Кб, 29 просмотров)
sav0k вне форума Ответить с цитированием
Старый 08.02.2009, 19:20   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

код обработчика у тебя довольно-таик черезжопный...
может лучше так
Код:
function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin

  if (Code = HC_ACTION) then         
  begin
    case ... of
.......
    end;
   end; 
  Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    // вызываем слудующий обработчик в любом случае
end;
rpy3uH вне форума Ответить с цитированием
Старый 08.02.2009, 22:39   #3
sav0k
Новичок
Джуниор
 
Аватар для sav0k
 
Регистрация: 06.02.2009
Сообщений: 2
По умолчанию

спасибо, переписал обработчики, добавил WM_MBUTTONDBLCLK. Попробовал с WH_MOUSE и заработало нормально, видимо где то в коде что то было.

Код:
function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin
  if (Code = HC_ACTION) then         
  begin
    case wParam of
      WM_LBUTTONDBLCLK: SendMessage(GlobalData.Wnd, MWM_LBUTTONDBLCLK, 0, 0);
      WM_LBUTTONDOWN:   SendMessage(GlobalData.Wnd, MWM_LBUTTONDOWN, 0, 0);
      WM_LBUTTONUP:     SendMessage(GlobalData.Wnd, MWM_LBUTTONUP, 0, 0);
      WM_MBUTTONDOWN:   SendMessage(GlobalData.Wnd, MWM_MBUTTONDOWN, 0, 0);
      WM_MBUTTONUP:     SendMessage(GlobalData.Wnd, MWM_MBUTTONUP, 0, 0);
      WM_RBUTTONDOWN:   SendMessage(GlobalData.Wnd, MWM_RBUTTONDOWN, 0, 0);
      WM_RBUTTONUP:     SendMessage(GlobalData.Wnd, MWM_RBUTTONUP, 0, 0);
      WM_MOUSEWHEEL:    SendMessage(GlobalData.Wnd, MWM_MOUSEWHEEL, 0, 0);
      WM_MOUSEMOVE:     SendMessage(GlobalData.Wnd, MWM_MOUSEMOVE, 0, 0);
    end;
  end;
  Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end;


function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall;
begin
  Result := False;
  if State = True then
  begin
    //  WH_MOUSE
    GlobalData.WndHook := SetWindowsHookEx(WH_MOUSE, @LowLevelMouseProc, hInstance, 0);
    GlobalData.Wnd := Wnd; 
    if GlobalData.WndHook <> 0 then
      Result := True;
  end
  else
  begin
    UnhookWindowsHookEx(GlobalData^.WndHook);
    Result := False;
  end;
end;
sav0k вне форума Ответить с цитированием
Старый 11.04.2012, 20:13   #4
Владислав11
 
Регистрация: 30.03.2011
Сообщений: 3
По умолчанию 1

Цитата:
Сообщение от sav0k Посмотреть сообщение
спасибо, переписал обработчики, добавил WM_MBUTTONDBLCLK. Попробовал с WH_MOUSE и заработало нормально, видимо где то в коде что то было.

Код:
function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin
  if (Code = HC_ACTION) then         
  begin
    case wParam of
      WM_LBUTTONDBLCLK: SendMessage(GlobalData.Wnd, MWM_LBUTTONDBLCLK, 0, 0);
      WM_LBUTTONDOWN:   SendMessage(GlobalData.Wnd, MWM_LBUTTONDOWN, 0, 0);
      WM_LBUTTONUP:     SendMessage(GlobalData.Wnd, MWM_LBUTTONUP, 0, 0);
      WM_MBUTTONDOWN:   SendMessage(GlobalData.Wnd, MWM_MBUTTONDOWN, 0, 0);
      WM_MBUTTONUP:     SendMessage(GlobalData.Wnd, MWM_MBUTTONUP, 0, 0);
      WM_RBUTTONDOWN:   SendMessage(GlobalData.Wnd, MWM_RBUTTONDOWN, 0, 0);
      WM_RBUTTONUP:     SendMessage(GlobalData.Wnd, MWM_RBUTTONUP, 0, 0);
      WM_MOUSEWHEEL:    SendMessage(GlobalData.Wnd, MWM_MOUSEWHEEL, 0, 0);
      WM_MOUSEMOVE:     SendMessage(GlobalData.Wnd, MWM_MOUSEMOVE, 0, 0);
    end;
  end;
  Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
end;


function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall;
begin
  Result := False;
  if State = True then
  begin
    //  WH_MOUSE
    GlobalData.WndHook := SetWindowsHookEx(WH_MOUSE, @LowLevelMouseProc, hInstance, 0);
    GlobalData.Wnd := Wnd; 
    if GlobalData.WndHook <> 0 then
      Result := True;
  end
  else
  begin
    UnhookWindowsHookEx(GlobalData^.WndHook);
    Result := False;
  end;
end;
А можешь скинуть весь проект в архиве ? Просто интересно как это все работает , а у меня не получаеться скомпилить все это.
Владислав11 вне форума Ответить с цитированием
Старый 12.04.2012, 08:51   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Владислав11, все еще надеешься?
Код:
sav0k Последняя активность: 16.04.2009 22:54
counter вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с ПК Sawyer92 Компьютерное железо 28 14.09.2010 09:48
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37
Отладка dll с хуком или Мистика на марше Tihon Win Api 8 02.01.2009 13:55
Проблема с gets() TheWanderer Общие вопросы C/C++ 12 21.11.2008 14:35
Проблема с хуком, Делаю подмену клавиш мыши zhefran Win Api 12 17.04.2008 18:03