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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2008, 23:30   #1
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию Глобальный хук. Проблема с dll =\\

Здрасте, наверное тема поднималась но что-то на я не нашёл.
Есть длл, правильно написана не знаю но выглядит она так:
Код:
library Mouse;

uses
  Windows;

var
HookH : thandle;

function GetMouseClick(Code, wParam, lParam : integer): LResult stdcall;
begin
CallNextHookEx(HookH, Code, wParam, lParam);
if Code = HC_ACTION then
begin
  if lParam = MK_LBUTTON then
  SendMessage(FindWindow(nil,'Cursorsnow'),666,0,0);
end;
result := 0;
end;

procedure SetHook(); stdcall;
begin
HookH := SetWindowsHookEx(WH_MOUSE,@GetMouseClick,HInstance,0);
end;

procedure UnHook(); stdcall;
begin
UnhookWindowsHookEx(HookH);
end;

exports
SetHook, UnHook;

end.
Суть в том, что когда нажимается левая кнопочка, моей программе шлётся сообщение, и поидее должна срабатывать процедура:
procedure GetMsg(MyMsg : TMsg);
Хотя незнаю, главное не это.
В моей длл описаны процедуры установки хука и снятия. И вроде бы экспорт по образцу из других примеров которые видел сделал.
А вот как в своей программе их вызывать? Эти процедуры?
Подскажите 8)
Zeraim вне форума Ответить с цитированием
Старый 17.12.2008, 10:54   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

CallNextHookEx надо вызывать в конце.
и надо так:
Result:=CallNextHookEx(HookH, Code, wParam, lParam);

про импорт из DLL
http://www.google.ru/search?hl=ru&lr...Delphi&spell=1

Последний раз редактировалось rpy3uH; 17.12.2008 в 10:58.
rpy3uH вне форума Ответить с цитированием
Старый 17.12.2008, 18:12   #3
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Хмм как-то странно, получается. Вроде длл поправил и вроде 15 минут назад сработала. Правда я забыл цикл обозначить, потому рекурсия получилась, но зато на нажитие мышки сработало. Сейчас оставил все также только вместо действий бибикалку поставил. Сообщения что хук установился выводит, а вот не бибикает =\\

Код:
library MousePress;

uses
  Windows,
  Messages;

var
HookH : thandle;

function GetMouseClick(Code, wParam, lParam : integer): LResult stdcall;
begin
if Code = HC_ACTION then
begin
  if lParam = MK_LBUTTON then
  begin
    windows.Beep(900,100);
  end;
end;
result := CallNextHookEx(HookH, Code, wParam, lParam);
end;

procedure SetHook(); stdcall;
begin
HookH := SetWindowsHookEx(WH_MOUSE,@GetMouseClick,HInstance,0);
if HookH = 0 then MessageBox(0, 'ACCESS DENIED','Hook', MB_OK)
else
  MessageBox(0, 'ACCESS GRANDIED','Hook', MB_OK);
end;

procedure UnHook(); stdcall;
begin
UnhookWindowsHookEx(HookH);
end;

exports
SetHook, UnHook, GetMouseClick;

end.
А тут я импортировал все что было в длл, на всякий случай. И соотвественно то как я пытаюсь установить хук.
Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
  procedure SetHook; external 'MousePress';
  procedure GetMouseClick; external 'MousePress';
  procedure UnHook; external 'MousePress';

procedure TForm1.Button1Click(Sender: TObject);
begin
SetHook;
end;
Zeraim вне форума Ответить с цитированием
Старый 17.12.2008, 20:52   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну как обычно. Все спешат времени ни на что нет ну а если присмотреться... думаю разницу уж сами увидите

Код:
procedure SetHook(); stdcall;
// сравните :) остальные по аналогии
procedure SetHook; external 'MousePress';
// и незнаю поправде говоря можно ли так... но я бы написал MousePress.dll или какое там у вас расширение
а вот это вообще поразило.. да и зачем это экспортировать ? где вы такое видели ?

Код:
function GetMouseClick(Code, wParam, lParam : integer): LResult stdcall;
// ииии
procedure GetMouseClick; external 'MousePress';
BOBAH13 вне форума Ответить с цитированием
Старый 17.12.2008, 21:14   #5
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Ну я вычитал, что когда импортируются функции статически необязательно писать расширение dll или exe, дельфи сама проверяет эти библиотеки в каталоге программы либо гдето в каталоге виндовс. А вот если нужные функции находятся в других расширениях или в других местах то надо уже подключать динамически. GetMouseClick импортировал чтобы наверняка 8)Э

Кстати, табличка о установленной ловушке выскакивает. Возможно у меня неправильно обработка сообщения идёт =\\
Zeraim вне форума Ответить с цитированием
Старый 17.12.2008, 22:52   #6
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Методом научного тыка обнаружил вот что:
if lParam = MK_LBUTTON then - не выполняется, тоесть если условие убрать, пищит постоянно если двигать мышкой, и с интервалом почти в секунду если не "дышать" 8)
Пробовал еще сделать так, тоже без результатно.
=================================== =================================== ===================================
Хм заработало но как-то странно =\\
Код:
procedure GetMouseClick(Code, wParam, lParam: integer) stdcall;
begin
if Code = HC_NOREMOVE then
  if wParam = WM_LBUTTONDOWN then
    windows.Beep(900,100);
CallNextHookEx(HookH, Code, wParam, lParam);
end;
Срабатывает только в текстовых окнах и при нажатии на рамочку окна вверху, причём, в текстовых окнах срабатывает после нажатия правой кнопкой. А если нажать на менюшке (Копировать, вставить и тд), которая выскакивает по правой кнопке, и нажать на грани между кнопками, то все пищит до тех пор пока хук не снимеш =\\
=================================== =================================== ==================================
Цитата:
Ну как обычно. Все спешат времени ни на что нет ну а если присмотреться... думаю разницу уж сами увидите
Насчёт спешат вы правы, я забыл закрыть Counter-Strike, отсюда и все глюки в остальных приложениях, потомучто в кс все работает на 5ку 8)

Последний раз редактировалось Zeraim; 17.12.2008 в 23:22.
Zeraim вне форума Ответить с цитированием
Старый 18.12.2008, 09:04   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

procedure GetMouseClick(Code, wParam, lParam: integer) stdcall;
так нельзя!!!!
можно только так:
function GetMouseClick(Code, wParam, lParam : integer): LResult; stdcall;


так пробовал?
Код:
if Code = HC_ACTION then
  if wParam = WM_LBUTTONDOWN then
rpy3uH вне форума Ответить с цитированием
Старый 18.12.2008, 13:17   #8
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
procedure GetMouseClick(Code, wParam, lParam: integer) stdcall;
так нельзя!!!!
можно только так:
function GetMouseClick(Code, wParam, lParam : integer): LResult; stdcall;


так пробовал?
Код:
if Code = HC_ACTION then
  if wParam = WM_LBUTTONDOWN then
А почему так нельзя? Если не нужен результат который возвращает функция, то зачем делать ? (Не сердитесь, я просто не знаю тонкостей)

Да пробовал, так работает, в полно экранных приложениях. В винде работает криво, только после нажатия правой кнопки а потом левой срабатывает. Возможно надо обрабатывать при WM_LBUTTONUP.
=================================== =================================== =================================
Да все верно, при WM_LBUTTONUP всё работает корректно, вот код:
Код:
procedure GetMouseClick(Code, wParam, lParam: integer) stdcall;
begin
if Code = HC_ACTION then
  if wParam = WM_LBUTTONUP then
    windows.Beep(900,100);
CallNextHookEx(HookH, Code, wParam, lParam);
end;

Последний раз редактировалось Zeraim; 18.12.2008 в 13:20.
Zeraim вне форума Ответить с цитированием
Старый 18.12.2008, 14:01   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
А почему так нельзя? Если не нужен результ....
Ну то что я написал мимо пролитело... ну а верно... зачем следовать MSDN лучше я уж сам напишу все что хочу и оно обязано работать Ну вы подумайте что вы говорите...
BOBAH13 вне форума Ответить с цитированием
Старый 18.12.2008, 14:10   #10
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Я в английском даже со словарём в терминах не силён, потому какие то сложные фразы в мсдн остаются для меня загадкой. А так если виндоус сам использует результат функций в хуках на своё усмотрениe, то тогда все понятно 8)

Последний раз редактировалось Zeraim; 18.12.2008 в 14:34.
Zeraim вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хук HttpSendRequestA через Wininet.dll VitaliyK Общие вопросы .NET 0 08.12.2008 14:28
Проблема с dll( DM_bite Помощь студентам 10 31.07.2008 16:05
И ещё проблема с DLL Altera Общие вопросы Delphi 7 25.06.2008 23:45
Глобальный хук на мышь не глобальный О_о JTG Общие вопросы Delphi 3 05.06.2008 17:41
глобальный хук & событие отжатия клавиши Nowichok Общие вопросы Delphi 9 24.11.2006 17:51