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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2012, 17:18   #1
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
Сообщение Загрузка Dll и доступ CallNextHookEx к памяти

Я хочу сделать что-то типа Т9 на компьютере, задействовав бесполезную цифровую клавиатуру. Но для этого необходима также и возможность переназначения клавиш, чтобы можно было и левой рукой набирать и не только лишь на цифровой клавиатуре. Да и клавы разные и скан коды у них тоже разные (хотя в целом стандартизированы).

Это код дээлэльки:

Код:
library KeyHookDll

(......)

Function HookExecute (code:integer; wParam:integer; lParam: integer): integer; Stdcall;
var
  Wnsd: hWnd;
  v:integer;
  b:pChar;

begin
Look:=0;


  if (code = HC_ACTION) and (lParam <> lParam or $8000 shl 16)
                      and (lParam <> lParam or $8000 shl 15) then
    begin
     Wnsd:=FindWindow(Wintitle , nil);
      if Wnsd<>0 then
            begin
             SendMessage(Wnsd, KeyEvent, wParam, lParam);
            end;


      v:=lParam shr 16;
      if v =  71 then Look:=1;
      if v =  72 then Look:=1;
      if v =  73 then Look:=1;
      if v =  75 then Look:=1;
      if v =  76 then Look:=1;
      if v =  77 then Look:=1;
      if v =  79 then Look:=1;
      if v =  80 then Look:=1;
      if v =  81 then Look:=1;
      if v =  82 then Look:=1;

      b:=Pchar('test after "if" - ' + IntToStr(v)+ ' Look - ' + IntToStr(Look));
MessageBox(0, b, 'Error', mb_Ok);


      If  Look <> 1 then
        begin
        b:=Pchar('After ReCallNext - ' + IntToStr(v)+ ' Look - ' +              IntToStr(Look));
        MessageBox(0, b, 'Error', mb_Ok);
        CallNextHookEx(HookHandle, code, WParam, lParam);
        end;

   end;
end;

(......)
Тут вот что происходит:

1. Обработка нажатия клавиши и посылка сообщения в основную форму
2. Проверяется, что была нажата клавиши на NumPad и сохранение результата в переменной Look.
3. Выведение MessageBox с результатами этой проверка
4. Условие на результат проверки:
5. Выведение аналогичнейшего MessageBox с результатами проверки, но уже внутри if...then.
6. Передача в систему указания на обработку следующего hook'a.


Так вот... Значения Look'a, до If...then и внутри него - разные. Что за фигня??

У меня такое чувство, что одна часть dll'ки грузится в пространство основной программы, а еще одна часть, в которой фунциклирует CallNextHookEx, грузится в память, подчиненную общей системе. И эти две части одной и той же dll между собой не соотносятся, или, по крайней мере, часть из общесистемной зоны памяти не может быть никак в процессе работы изменена. Она записывается один раз при инициализации и неизменна до конца. Перезапись невозможна.

Но такие рассуждения мне самому кажутся шаманством и мракобесием. Но даже если это и так, и попытаться явно указать переменную Look как указатель (но переменные ж по идее и есть не что иное как указатели уже сами по себе), то указатели ведь наверняка могут указывать не на всю память, от 0 до 4гб, а лишь в пределах зоны памяти, выделенной системой для данного приложения.

Вопрос:
Каким же макаром запрещать/разрешать вызов следующего обработчика события клавиатуры, если проверка условия if..then не работает?

Последний раз редактировалось Smogg; 22.02.2012 в 19:00.
Smogg вне форума Ответить с цитированием
Старый 24.02.2012, 17:16   #2
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

не знаю, помогут или нет мои коментарии, но всё равно отпишусь
1. DLL с обработчиком хука загружается в каждый процесс который хоть раз за свою жизнь принял клавиатурное сообщение
2. у каждого процесса своё собственное адресное пространство 0-4ГБ (верхняя половина которого недоступна)
3. в каждом процессе своя индивидуальная копия DLL
4. CallNextHookEx надо вызывать так
Код:
result:= CallNextHookEx(0, code, WParam, lParam);
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к переменной, объявленной в одной dll, из другой dll eduard93 Visual C++ 2 25.09.2011 11:10
Определить SIZEMEM у DLL(Размер dll в памяти процесса) Человек_Борща Общие вопросы Delphi 6 22.07.2011 20:54
Доступ к ячейкам памяти Hemul Общие вопросы C/C++ 3 17.05.2011 22:16
Прямой доступ к памяти Sibedir Общие вопросы Delphi 20 13.06.2010 17:19
[DLL] Загрузка и выгрузка dll в/из чужого процесса Человек_Борща Win Api 4 28.02.2010 17:47