Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

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

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

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

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

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

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

Спасибо парни всетаки я откопал что меня интересовала и вот что получилось
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,842
Репутация: 6832
По умолчанию

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

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

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

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

Прога:
Код:

// 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.

Stilet вне форума   Ответить с цитированием
Старый 21.05.2008, 11:43   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
Репутация: 590
По умолчанию

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

Сделал как написано ничего своего не добавлял длл просто откомпилировал. В прогу поставил 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
Репутация: 590
По умолчанию

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
Репутация: 10
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


08:28.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru