Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Делаю ловушку на клаву 
:(
    Опции темы
Budy
Дата 25.4.2005, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 616
Регистрация: 6.2.2004
Где: Екатеринбург

Репутация: 1
Всего: 2



А как мона сделать чтоб DLL передавала какието параметры вызвающей программе?
Ну например в этом случае, DLL получила клавишу и нужно ее передать программе..


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
RA
Дата 25.4.2005, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Вот есть хороший пример:



Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  Messaging.rar
PM   Вверх
vintch
Дата 25.4.2005, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 24.4.2005

Репутация: нет
Всего: нет



Цитата
repeat until false;

Это в Win-проге использовать просто нельзя! smile
Нужно:

Код

program Project1;

uses
  Windows, Messages;

var Msg: TMsg;

procedure Timer; stdcall;
begin
   MessageBox(0, 'Работаем!', 'Сообщение :)', MB_ICONINFORMATION);
end;

begin
   SetTimer(0, 0, 3000, @Timer);
   while GetMessage(Msg,0,0,0) do
    begin
       TranslateMessage(Msg);
       DispatchMessage(Msg);
    end;
end.


PS. SetTimer и всё что с ним связано - чисто для показухи smile
PM MAIL   Вверх
Budy
Дата 25.4.2005, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 616
Регистрация: 6.2.2004
Где: Екатеринбург

Репутация: 1
Всего: 2



vintch, ага, я уже понял smile Просто я между делом делал маленькую запускающую прогруамму


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
Dr.No_xXx
Дата 25.4.2005, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 215
Регистрация: 24.2.2005

Репутация: нет
Всего: нет



Цитата
А как мона сделать чтоб DLL передавала какието параметры вызвающей программе?
Ну например в этом случае, DLL получила клавишу и нужно ее передать программе..

Зачем? и какие именно?
PM MAIL   Вверх
Budy
Дата 25.4.2005, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 616
Регистрация: 6.2.2004
Где: Екатеринбург

Репутация: 1
Всего: 2



RAdmin, я мона полегче примерчик? Я шото там запутался smile


Dr.No_xXx, посмотри эту тему. Я кидал код, там процедуре "procedure AddKey(Key: String);" я передаю полученную нажатую клавишу. Дак вот спрашиваю, как эту "Key: String" - клавишу передать в главную прогу?


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
Rouse_
Дата 26.4.2005, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



Цитата(Budy @ 25.4.2005, 16:36)
RAdmin, я мона полегче примерчик? Я шото там запутался

Ты работаешь под NT? Если так то не нужны никакие лишние DLL. Вот смотри примерчик:

Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

var
  hHook: THandle;

{$R *.dfm}

function LowLevelKeyboardProc(nCode: Integer;
  WParam: WPARAM; LParam: LPARAM): LRESULT stdcall;
type
  PKbdDllHookStrukt = ^TKbdDllHookStrukt;
  _KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: PDWORD;
  end;
  TKbdDllHookStrukt = _KBDLLHOOKSTRUCT;

const
  RPT_WPARAM_DATA = 'Keyboard message = %s ';
  RPT_LPARAM_DATA = 'scan code = %s [%d]';
var
  StrResult: String;
begin
  StrResult := '';
  if nCode = HC_ACTION then
    Result := CallNextHookEx(hHook, nCode, WParam, LParam);
  case WParam of
    WM_KEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYDOWN']);
    WM_KEYUP: StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYUP']);
    WM_SYSKEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYDOWN']);
    WM_SYSKEYUP: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYUP']);
  end;

  StrResult := StrResult + Format(RPT_LPARAM_DATA, [
    Chr(PKbdDllHookStrukt(LParam)^.vkCode), PKbdDllHookStrukt(LParam)^.vkCode]);
  Form1.Memo1.Lines.Add(StrResult);
end;

procedure TForm1.FormCreate(Sender: TObject);
const
  WH_KEYBOARD_LL = 13;
begin
  hHook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
  if hHook = 0 then RaiseLastOSError;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if not UnhookWindowsHookEx(hHook) then RaiseLastOSError;
end;

end.



--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
vintch
Дата 26.4.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 24.4.2005

Репутация: нет
Всего: нет



Да, признаться, давно я на MSDN небыл smile

Rouse, ещё новичком себя называет smile

PS. А можно ещё так: не repeat until false; а repeat sleep(10) until false; smile И проц не на сотню smile

Это сообщение отредактировал(а) Girder - 26.4.2005, 13:54
PM MAIL   Вверх
Rouse_
Дата 26.4.2005, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



Цитата(vintch @ 26.4.2005, 13:34)
А можно ещё так: не repeat until false; а repeat sleep(10) until false;  И проц не на сотню

Ну можно и application.HandleMessage или ее аналог написать. Самый ненапряжный вариант smile


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Rouse_
Дата 26.4.2005, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



Ну чтож, давайте теперь разберем ошибки.

dsergey:
Папка D6Hook1 файл hook.pas
смотрим код:
Код

function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;

Теперь вопрос. С каких пор WParam поменяло значение с двойного слова на одинарное? Правильней будет Longint(DWORD, Cardinal) но никак не word. Самое правильное - специально определенный тип для всех hook procedures объявленный в модуле Windows.pas под названием WPARAM;
Собстенно вот все используемые типы:
Код

type
  WPARAM = Longint;
  {$EXTERNALSYM WPARAM}
  LPARAM = Longint;
  {$EXTERNALSYM LPARAM}
  LRESULT = Longint;
  {$EXTERNALSYM LRESULT}


Исследуем далее код функции function HookProc того же модуля
Код

  if Code >= 0 then begin
    ...
  end else
    result := CallNextHookEx(HookHandle, code, WParam, LParam);

Довольно оптимистичное начало. Благо что данный код исполняется в локальном приложении, в противном случае была бы разбита цепочка хуков и никто не смог бы гарантировать правильную работу не только своих, но и чужих приложений...

Ну и естестенно довольно странно видеть проверку при уничтожении хука:
Код

procedure TfmMain.FormDestroy(Sender: TObject);
begin
  if HookHandle > 0 then
    UnhookWindowsHookEx(HookHandle);
end;

...при ее полном отсутствии на момент создания:
Код

procedure TfmMain.FormCreate(Sender: TObject);
begin
...
  HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
...
end;


Папка D6Hook2DLL, модуль keyboardhook.dpr:
смотрим код:
Код

procedure DLLEntryPoint(dwReason: DWord); stdcall;

В данном случае из-за объявления stdcall, абсолютно здесь не уместного никогда в жизни не отработает сообщение DLL_PROCESS_DETACH

Далее абсолютно не понятен двойной вызов следующей функции на момент инициализации библиотеки.
Код

WM_MYKEYHOOK:=RegisterWindowMessage('WM_MYKEYHOOK');



Папка D6Hooks модуль HookDll.pas
Та же ошибка с word, ну и явно безграмотное написание библиотеки с разбитием цепочки хуков, так как автор видимо забывает что все экземпляры библиотеки разнесены по различным адресным пространствам приложений и не потрудился создать единые экземпляры констант чере отображаемые в память процесса файлы.
Предыдужий пример был написан намного лучше.

Примеры в архивах даже не хочется комментировать.


По поводу примера от RAdmin.
Ну это немного не из той серии, но очень грамотно написаный пример...

Мой пост собственно не указание на ошибки, а указание на возможные неприятности при бездумном использовании кода...

Это сообщение отредактировал(а) Rouse_ - 26.4.2005, 20:05


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
RA
Дата 26.4.2005, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Цитата(Rouse_ @ 26.4.2005, 20:03)
Ну это немного не из той серии, но очень грамотно написаный пример...


Дык человек вопрос задал :

Цитата(Budy @ 25.4.2005, 06:25)
А как мона сделать чтоб DLL передавала какието параметры вызвающей программе?
Ну например в этом случае, DLL получила клавишу и нужно ее передать программе..


Естесно потом возникнет вопрос а как текст передать. и тд.


А что касатется хука на клаву то мой пример уже давно пылится в кладовке.
(тотже принцип что и у тебя, толкьо с перламутровыми пуговицами )

Это сообщение отредактировал(а) RAdmin - 26.4.2005, 20:56
PM   Вверх
Budy
Дата 27.4.2005, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 616
Регистрация: 6.2.2004
Где: Екатеринбург

Репутация: 1
Всего: 2



RAdmin, Rouse_, пасибо, ребята! Оба помогли, у обоих код позаимствовал smile Еще раз спасибо


--------------------
Как ты назовешь свой корабль, так на нем и напишут
user posted image
PM MAIL WWW ICQ   Вверх
Denis-delphist
Дата 27.4.2005, 18:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Уменьшь её на сколько можно и пусть результат не в прогу пишется, а в LOG файл, не указывая время(Только беквы и цифры). Ещё можно эту штуку коммандной строкой сделать!!! Также можно сделать так, чтобы не все буквы запоминались, а некоторые. smile

Это сообщение отредактировал(а) Girder - 27.4.2005, 23:57
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0844 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.