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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2008, 18:01   #1
LAFUDR
 
Регистрация: 12.10.2007
Сообщений: 9
По умолчанию Отлов кликов мыши

Парни край нужно написать хук в DLL которое будет определять нажатие клавиши мыши не только в нашей проге но и во всей ситеме. И желательно с комментами. Заранее благодарю
LAFUDR вне форума Ответить с цитированием
Старый 17.05.2008, 18:31   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Вы делали как Вам говорили? http://programmersforum.ru/showthread.php?t=19107

На форуме полно информации и работающих примеров по хукам на всех возможных языках. Я лично несколько штук выкладывал.
B_N вне форума Ответить с цитированием
Старый 17.05.2008, 18:42   #3
LAFUDR
 
Регистрация: 12.10.2007
Сообщений: 9
По умолчанию

Спасибо парни всетаки я откопал что меня интересовала и вот что получилось
library dll;

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

var
SysHook : HHook = 0;
Wnd : Hwnd = 0;
rez : integer;

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if code = HC_ACTION then
begin
if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then
begin
MessageBox(0, 'Нажата правая клавиша мыши', 'ХУК', 0);
rez:=rez+1;
end;
end;
Result:=CallNextHookEx(SysHook, Code, wParam, lParam);
end;

procedure hook(switch : Boolean) export; stdcall;
begin
if switch=true then
begin
SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
MessageBox(0, 'ХУК установлен !', 'ХУК', 0);
end
else
begin
if UnhookWindowsHookEx(SysHook) then
MessageBox(0, 'ХУК снят !', 'ХУК', 0);
SysHook := 0;
end;
end;

exports hook;

begin
end.

Возник такой вопрос. У меня есть переменная рез которая считает количество нажатий правой клавиши. Как сделать чтоб после каждого увеличения эта переменная передавалась в основную программу? Заранее огрормное спасибо

Последний раз редактировалось Stilet; 19.05.2008 в 08:25.
LAFUDR вне форума Ответить с цитированием
Старый 19.05.2008, 08:27   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Как сделать чтоб после каждого увеличения эта переменная передавалась в основную программу?
А ты в ДЛЛ функцию добавь, которая бы возвращала значение из этой переменной, а в проге уже вызывай эту функцию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.05.2008, 17:59   #5
LAFUDR
 
Регистрация: 12.10.2007
Сообщений: 9
По умолчанию

НАписал но при запросе переменной постоянно выскакивает 0 посмотрите плиз в чем причина. Точнее 0 выскакивает при использовании хука глобально, при локальном использовании все ок.
Вложения
Тип файла: rar прога.rar (10.1 Кб, 18 просмотров)

Последний раз редактировалось LAFUDR; 19.05.2008 в 19:32.
LAFUDR вне форума Ответить с цитированием
Старый 21.05.2008, 09:42   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну вообще то я особо хуками не занимался но судя по твоему проекту я бы переделал вот в это:

Прога:
Код:
// Example1, Process2                 //
// @Aleksey Pavlov                   //


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

{для динамической загрузки функций из DLL}
type
  MyProcType = procedure (flag : Boolean); stdcall;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Button3: TButton;
    Timer1: TTimer;
    procedure FormClose(Sender: TObject;var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 function one:integer; external 'dll1.dll';
 procedure hook(switch : Boolean); external 'dll1.dll';
var
  Form1: TForm1;
  Hdll : HWND; { дескриптор загружаемой DLL (для динамической загрукзки)}

implementation

{$R *.DFM}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  hook(false);
  FreeLibrary(Hdll); { при закрытии формы - освобождаем DLL }
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
hook(true);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   form1.edit1.Text:=inttostr(one);
end;

end.
ДЛЛ
Код:
library dll1;

uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls;

var
SysHook : HHook = 0;
Wnd : Hwnd = 0;
rez : integer;

function one:integer;
begin
 result:=rez;
end;

function SysMsgProc(code : integer; wParam : WPARAM; lParam : LPARAM) : longint; stdcall;
var t:^tagMOUSEHOOKSTRUCT;
begin
 t:=pointer(lParam);

 rez:=WindowFromPoint(t^.pt);
Result:=CallNextHookEx(SysHook, Code, wParam, lParam);
end;

procedure hook(switch : Boolean);
begin
if switch=true then
begin
SysHook := SetWindowsHookEx(WH_MOUSE, @SysMsgProc, HInstance, 0);
MessageBox(0, 'ХУК установлен !', 'ХУК', 0);
end
else
begin
if UnhookWindowsHookEx(SysHook) then
MessageBox(0, 'ХУК снят !', 'ХУК', 0);
SysHook := 0;
end;
end;

exports hook,one;

begin
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2008, 11:43   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Такой способ если и будет работать, то только под Win9x. Это там, несмотря на то, что процессы изолированы, Dll при мэппинге не копируются в каждый процесс, а используется одна и та же копия. Под NT сей номер не пройдёт - и WH_MOUSE, и WH_GETMESSAGE вызываются в чужом процессе и каждый из них имеет свое отображение этой Dll. Таким образом - ещё одна избитая тема - связь между процессами: Общая память, объекты синхронизации, SendMessage и т.д. Применительно к хукам тоже рассматривалась.
B_N вне форума Ответить с цитированием
Старый 21.05.2008, 18:59   #8
LAFUDR
 
Регистрация: 12.10.2007
Сообщений: 9
По умолчанию

Сделал как написано ничего своего не добавлял длл просто откомпилировал. В прогу поставил 1 едит 1 таймер в тексте таймера изменил только на

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if form1.edit1.text<>inttostr(one)then
form1.edit1.Text:=inttostr(one) else
form1.edit1.text := '0';
end;

то что он показывает явно те то что нужно посмотрите плиз еще.
Сам вопрос состоит в том чтоб длл подало проге любой (boolian, integer) сигнал о том что был желчек мышью.
LAFUDR вне форума Ответить с цитированием
Старый 21.05.2008, 19:46   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

http://programmersforum.ru/showthread.php?t=16709
http://programmersforum.ru/showthrea...t=18623&page=2
B_N вне форума Ответить с цитированием
Старый 24.05.2008, 01:32   #10
LAFUDR
 
Регистрация: 12.10.2007
Сообщений: 9
По умолчанию

Спасибо огромное то чно нужно
LAFUDR вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стрелка мыши Gladiator Общие вопросы Delphi 3 21.05.2008 20:56
Sreen Saver отлов событий Alexoid Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 28.04.2008 15:41
Нажатие кнопок мыши zzzzz Win Api 7 02.12.2007 12:33
Как распознать 2 мыши sin Gamedev - cоздание игр: Unity, OpenGL, DirectX 16 11.04.2007 21:31
как сделать считалку кликов M@rsel Win Api 1 19.12.2006 15:37