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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> После наж F9 прога(+dll) сразу закрывается, в dll хук на клаву, взятый из DRKB 
V
    Опции темы
BEST13
  Дата 11.11.2011, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нужно, отключить клаву, для этого использую DLL c хуком, взял код из  DRKB. Только проблема в  том что при запуске проекта, по F9 или по иконке, все вылазит окошко с инфой компиляции, пропадает и все проект как и не был запушен иконка снова активна.. если закомментирывать вызов процедуры,  тогда все норм запускаться. Delphi на этот счет никаких предупреждений не выдает.
DLL:
Код

library KeyBoardHookDLL;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  System.SysUtils,
  System.Classes,
  Windows;

const KF_UP_MY = $40000000;
var CurrentHook: HHook;
    KeyArray: array[0..19] of char;
    KeyArrayPtr: integer;
    CurFile:text;
{$R *.res}
function GlobalKeyBoardHook(code: integer; wParam: integer; lParam:
integer): longword; stdcall;
var
i:integer;
begin
  if code< 0 then
   begin
     result:=CallNextHookEx(CurrentHook,code,wParam,lparam);
     Exit;
   end;
  if ( (lParam and KF_UP_MY ) = 0) and (wParam>=65) and (wParam<=90) then
    begin
      KeyArray[KeyArrayPtr]:=char(wParam);
      KeyArrayPtr:=KeyArrayPtr+1;
      if KeyArrayPtr> 19 then
       begin
        for i:=0 to 19 do
        begin
          Assignfile(CurFile,'d:\log.txt');
          if fileexists('d:\log.txt')=false then rewrite(CurFile)
          else Append(CurFile);
          write(Curfile, KeyArray[i]);
          closefile(curfile);
        end;
        KeyArrayPtr:=0;
       end;
    end;
    CallNextHookEx(CurrentHook,code,wParam,lparam);
    result:=0;
end;
procedure SetupGlobalKeyBoardHook;
begin
  CurrentHook:=SetWindowsHookEx(WH_KEYBOARD, @GlobalKeyBoardHook,HInstance, 0);
  KeyArrayptr:=0;
end;
procedure unhook;
begin
  UnhookWindowshookEx(CurrentHook);
end;

exports
 SetupGlobalKeyBoardHook, UnHook;

begin
end.
 

А вот часть и проги:
Код

var
  Form1: TForm1;
  DriveKeyLetter:char;
  procedure SetupGlobalKeyBoardHook; stdcall; external 'KeyBoardHookDLL.dll';
  procedure UnHook;  stdcall; external 'KeyBoardHookDLL.dll';

***
begin
 TrayIcon1Click(Self);
 SendMessage (Form1.Handle, WM_SYSCOMMAND, SC_ZOOM, 0);//максимизируем  окно
 SetWindowPos (Form1.Handle, HWND_TOP, 0, 0,GetSystemMetrics(SM_CXSCREEN),
              GetSystemMetrics(SM_CXSCREEN), SWP_SHOWWINDOW); //ставим окно поверх других
 Timer_block.Enabled:=true;
 SetupGlobalKeyBoardHook;
end;

***

begin
 Hide();
 WindowState := wsMinimized;
 Timer_block.Enabled:=false;
 UnHook;
end;


Может в win7 как-то надо по другому с DLL работать? Или может, что в хуке не так?
Спасибо, что потратили время на меня. 
PM MAIL ICQ GTalk   Вверх
bems
Дата 11.11.2011, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вопрос на засыпку: а почему она не должна закрываться? Там какая-то задержкау тебя, или что? а то в том коде что показал нету


--------------------
Обижено школьников: 8
PM MAIL   Вверх
CodeMonkey
Дата 11.11.2011, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

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



И в хуке тоже не так. Налицо непонимание принципов работы хуков.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
BEST13
Дата 11.11.2011, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, что откликнулись!
Цитата(bems @  11.11.2011,  01:20 Найти цитируемый пост)
Вопрос на засыпку: а почему она не должна закрываться? Там какая-то задержкау тебя, или что? а то в том коде что показал нету
 

А разве просто программа( с формой) должна, после запуска сразу закрываться? Как я выше и писал, если закомментирывать вызов процедур из ДЛЛ, то прога работает нормально(максимизируеться на весь экран).  задержек, никаких нет. Поскольку без, вызова процедур из ДЛЛ все работает , ок.    
Цитата(CodeMonkey @  11.11.2011,  06:29 Найти цитируемый пост)
И в хуке тоже не так. Налицо непонимание принципов работы хуков. 

Вы правы,  наверно, это мое первое приложение с хуком. Я прочитал, статью про применении хуков из ДКРБ и статью про ДЛЛ, может я что-то и упустил. Я знаю, что вы мне ничем не обязаны, но был бы благодарен, если бы указали, что не так в хуке?

Меня самого смущает, что в этом примере хука из ДКРБ, я вызываю процедуру, в других я примерах я видел только в основном функции. И поскольку я пишу ключевое слово stdcall, насколько означает, что библиотека написана по определенным правилам и может использоваться в программах с различными языками, к примеру С, а там процедур нет. Может  в этом дело?       
PM MAIL ICQ GTalk   Вверх
CodeMonkey
Дата 11.11.2011, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

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



Цитата(BEST13 @  11.11.2011,  11:36 Найти цитируемый пост)
Я прочитал, статью про применении хуков из ДКРБ и статью про ДЛЛ, может я что-то и упустил.


Не уверен, что в DRKB написано. Вот вроде нормальный текст: http://www.delphimaster.ru/articles/hooks/index.html

Ошибка в работе с CurrentHook. DLL грузится индивидуально в адресное пространство каждого процесса. Это значит, что CurrentHook равно нулю во всех экземплярах, кроме вашей программы.

Типичное решение - вынос глобальных переменных в MMF.

Впрочем, это не имеет значения в Windows XP (? не уверен) и выше - там изменено поведение функции CallNextHookEx: первый параметр игнорируется. Но об авторе кода этот факт говорит многое (###код).

Что более важно (причина вылета) - несовпадение сигнатуры SetupGlobalKeyBoardHook и Unhook в DLL и .exe: разные модели вызова.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
BEST13
Дата 12.11.2011, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



CodeMonkey,  Спасибо, за объяснения и помощь. В ДКРБ именно эта статья, и пример кода, прочитал её еще раз и закрепил знания.  поправил вызов, все нормально запускается и работает.
Я конечно, еще плохо понимаю в этой теме, но зачем использовать MMF и запоминать дескриптор, если он все равно игнорируется и все прекрасно работает. Ведь получается мы напишем код, который, никакой пользы не принесет, ведь игнорируется и пустой и не пусто дескриптор.
Поправите, если я что-то не то говорю.
P.S. С какого и по какой код, нужно написать что бы отлавливать все клавиши включая комбинации, и каких обрабатывать что бы они не срабатывали? В нете не нашел, ничего подобного.  Или стоит все таки,  для этого вопроса создать отдельную тему?    
PM MAIL ICQ GTalk   Вверх
CodeMonkey
Дата 12.11.2011, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

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



Цитата(BEST13 @  12.11.2011,  02:06 Найти цитируемый пост)
зачем использовать MMF и запоминать дескриптор, если он все равно игнорируется и все прекрасно работает


Чтобы код работал на старых системах.

Цитата(BEST13 @  12.11.2011,  02:06 Найти цитируемый пост)
Ведь получается мы напишем код, который, никакой пользы не принесет, ведь игнорируется и пустой и не пусто дескриптор.


Если интересуют только новые системы - то да, можно и не использовать MMF. Но тогда надо 0 передавать. А не CurrentHook.

Цитата(BEST13 @  12.11.2011,  02:06 Найти цитируемый пост)
С какого и по какой код, нужно написать что бы отлавливать все клавиши


Странный вопрос.

"Как мне ограничить, чтобы ничего не ограничивать?"

Вот ничего и не ограничивай.

Цитата(BEST13 @  12.11.2011,  02:06 Найти цитируемый пост)
включая комбинации


На уровне нажатия отдельных клавиш нет понятия "комбинация". 

Цитата(BEST13 @  12.11.2011,  02:06 Найти цитируемый пост)
и как их обрабатывать что бы они не срабатывали?


F1:

Цитата(MSDN)
If code is less than zero, the hook procedure must return the value returned by CallNextHookEx.

If code is greater than or equal to zero, and the hook procedure did not process the message, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_KEYBOARD hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the rest of the hook chain or the target window procedure.




--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
BEST13
Дата 12.11.2011, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо,.за ответы и помощь. От меня +.
Цитата(CodeMonkey @  12.11.2011,  01:51 Найти цитируемый пост)
Если интересуют только новые системы - то да, можно и не использовать MMF. Но тогда надо 0 передавать. А не CurrentHook.

Ага, с этим понятно.

Цитата(CodeMonkey @  12.11.2011,  01:51 Найти цитируемый пост)
Странный вопрос.
"Как мне ограничить, чтобы ничего не ограничивать?"

Честно,  я не понял. О чем вы?  Я такой фразы не писал.


Цитата(CodeMonkey @  12.11.2011,  01:51 Найти цитируемый пост)

На уровне нажатия отдельных клавиш нет понятия "комбинация". 

Значит, нет варианта через хук отключить комбинации клавиш (ALT+...,Ctrl+..., Shift+...)?
 

Цитата(CodeMonkey @  12.11.2011,  01:51 Найти цитируемый пост)
Цитата(MSDN)
If code is less than zero, the hook procedure must return the value returned by CallNextHookEx.

If code is greater than or equal to zero, and the hook procedure did not process the message, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_KEYBOARD hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the rest of the hook chain or the target window procedure.


Если я правильно понял, для того, что бы заблокировать клавиши мне достаточно, в результат функции возвращать любое не нулевое значение? 
И чтобы узнать что за клавиша, была нажата нужно функции параметр code записывать, как  HC_ACTION, что бы в wParam и lParam содержалась инфа о клавише. А  в wParam будет содержаться виртуальный код клавиши. Или если мне нужно , все клавиши просто возвращать результат функции не нулевой, и этого будет достаточно?

PM MAIL ICQ GTalk   Вверх
BEST13
Дата 18.11.2011, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вопрос закрыт!
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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