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

Поиск:

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


Опытный
**


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

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



:Приветсвую
Делаю ловушку на клавиатуру. Использую Hook, использую DLL. Все норм работает, но есть проблема - при запуске проги все тормозит. TaskMan 100%ую загрузку ЦП показывает.
Видать получился глобальный Хук, а хотелось чтоб не тормозило. Помогите плз


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


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



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

Присоединённый файл ( Кол-во скачиваний: 80 )
Присоединённый файл  Hooks_Exep.rar
PM MAIL   Вверх
Bes
Дата 20.4.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно использовать getkeystate тогда и без дллки обойтись можно.
PM MAIL   Вверх
RA
Дата 20.4.2005, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Budy Покажи код.
PM   Вверх
Budy
Дата 20.4.2005, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Прога, запускающая DLL'ку:
Код

procedure StartHOOK; stdcall; external 'getkeys.dll' index 1;
begin
  StartHOOK;
  repeat until false;
end.

Прога в памяти весит, всего около 300 Кб имеет.
А вот DLL'ка:

Код

library getkeys;
uses windows;
type
   ca=array[0..255] of Char;
var
  HookHandle: hHook = 0;
  hook:hHook=0;
  Last_Key: String;

//Из заглавных в строчные
function DownKey(key: char): char;
begin
...
end;

//По клавиатуре с англ на русс
function lat_to_rus(key: char):char;
begin
...
end;

//Сохраняем полученную клавишу
procedure AddKey(Key: String);
begin
...
end;

function gethook(code: integer; wParam, lParam: longint): longword; StdCall;
var
  Key_Name: Char_array;
  WhatLan: Array[0..$FFF] of Char;
  CapsLock, Russian: Boolean;
  ResKey: Char;
  Key: String;
begin
  if Code<0 then begin
    Result:=CallNextHookEx(HK,Code,wParam,lParam);
    Exit;
  end;
  if(Code=HC_ACTION)and(((lParam shr 16) and KF_UP)=0)then
    begin
      CapsLock:=(GetKeyState(VK_CAPITAL) and $01)<>0;
      if GetKeyboardLayoutName(WhatLan)then if WhatLan='00000419' then Russian:=True else Russian:=False;
      GetKeyNameText(lParam, Key_Name, sizeof(Key_Name));
      Key:=Key_Name;
//Если буква или цифра (1 символ)
      if Length(Key)=1 then
        begin
          case Key[1] of
            '1'..'9','0':ResKey:=Key[1];
            'A'..'Z':begin
                      if Russian then ResKey:=lat_to_rus(Key[1])else ResKey:=Key[1];
                      if CapsLock=False then ResKey:=DownKey(ResKey);
                     end;
            else ResKey:=Key[1];
          end;
          Key:='';
        end else
          begin
            if Key='Space' then Key:=' ' else
            if Key='Page Up' then Key:=' [PUp] ' else
            if Key='Page Down' then Key:=' [PDown] ' else
            if Key='Right Shift' then Key:=' [RShift] ' else
            if Key='Right Alt' then Key:=' [RAlt] ' else
            if Key='Right Ctrl' then Key:=' [RCtrl] ' else
            if Key='Insert' then Key:=' [Ins] ' else
            if Key='Delete' then Key:=' [Del] ' else
            if Pos('Num ',Key)>0 then Key:=' [N'+Copy(Key,5,Length(Key)-4)+'] ' else
            Key:=' ['+Key+'] ';
          end;
      if Key='' then Key:=ResKey;
      if(Last_Key<>Key)or(Length(Key)=1) then AddKey(Key);
      if(Pos('Ctrl',Key)>0)or(Pos('Alt',Key)>0)or(Pos('Shift',Key)>0)then Last_Key:=Key else Last_Key:='';
    end;
  CallNextHookEx(HK,Code,wParam,lParam);
  Result:=0;
end;

procedure StartHOOK; StdCall;
begin
  hook:=SetWindowsHookEx(WH_KEYBOARD,@gethook,hInstance,0);
end;

exports
  StartHOOK;

end.


PS.В коде (здесь строки 75-76) пробовал писать Result:=CallNewxt...... Тогда клавиши не возращаются нужным приложениям.


Bes, расскажи поподробнее. Просто пробовал в EXE'шник пихнуть - когда на клаве щелкаешь кнопки при других окнах, они закрываются.

Это сообщение отредактировал(а) Budy - 20.4.2005, 17:25


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


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


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

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



Убери repeat until false;
PM   Вверх
Budy
Дата 20.4.2005, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



RAdmin, дык тогда ничего работать и не будет


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


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


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

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



Ты пробовал?
PM   Вверх
RA
Дата 20.4.2005, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



То верхнее это моя оценка на вскидку.

А вот специально решил
посмотреть что к чему:



Почему в CallNextHookEx(HK,Code,wParam,lParam); переменная "HK"
а тут
hook:=SetWindowsHookEx(WH_KEYBOARD,@gethook,hInstance,0); hook ?

Они хоть потом связываются или как?
Я заменил HK на Hook.


Загузчик ......

implementation
function StartHOOK: Longint; external 'getkeys.dll' name 'StartHOOK';
{$R *.dfm}

procedure .....
begin
StartHOOK;
end;


И всё работает пучком.

ЗЫ: так как код процедуры "AddKey" ты не показал то я туда вставил бональный ShowMessage. (для теста)



PM   Вверх
Budy
Дата 21.4.2005, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



RAdmin, я с "HK" и "hook" перепутал, короче это одна и та же переменная, иначе "hook: HHOOK;"
AddKey - здесь я сохраняю клавиши в оперативную память, пробовал в файл сохранять - возникают проблемы из за загрузки ЦП.
Добавлено @ 14:45
Цитата(RAdmin @ 20.4.2005, 20:28)
Убери repeat until false;

Цитата(RAdmin @ 20.4.2005, 23:15)
Ты пробовал?

Дак прога тогда закрывается.


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


Опытный
**


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

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



Цитата(RAdmin @ 20.4.2005, 23:48)
И всё работает пучком

Работать то работает, да вот память сильно грузит :\


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


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


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

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



Budy Ну не знаю, то что я проверял работало без напрягов.
Пришли мне на мыло весь исходник, или тут выложи (только в аттаче).
exxxxx [a] gmail.com
PM   Вверх
Budy
Дата 21.4.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



RAdmin, дак я весь и выложил. Есть прога (там всего 5 строчек), которая запускает DLL и держит его в памяти. DLL в свою очередь ставит ловушку, и проверяет на нажатие клавиш на клавиатуре. Три процедуры, что я не расписывал не представляют из себя ничего серьезного - у все сводил к минимуму, просто получал Key_Name (GetKeyNameText(lParam, Key_Name, sizeof(Key_Name));) и записывал в файл. Всеравно всю память использует.
Может ловушка "слишком много на себя берет"?


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


Опытный
**


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

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



Цитата(Budy @ 21.4.2005, 17:43)
Цитата (RAdmin @ 20.4.2005, 20:28)
Убери repeat until false;
Цитата (RAdmin @ 20.4.2005, 23:15)
Ты пробовал?
Дак прога тогда закрывается.

Ага, в этом все и дело. Я переделал запускающую прогу чтоб без зацикливания была, все встало на место

Добавлено @ 20:57
А я себе в голову вбил, что ето все DLL'ька виновата smile


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


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


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

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



ну вот и замечательно smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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