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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2013, 01:00   #1
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию Зависает IDE (Delphi XE4) при отладке глобального хука

Добрый день!
Проблема, собственно, в сабже:
экспортные ф-и отлаживаются нормально, но при бряке на функции Tfnhookproc происходит завис (прямо с begin), и после этого блокируется ввод с клавы.
Какие первые мысли? У кого такое бывало? Хочется узнать мнение опытных людей...
Код, в принципе не важен, но если что:
Код:
//ставим ловушку
procedure StartHook(AppHandle, CtrlHandle: HWND); stdcall;
begin
  hLastForm := 0;
  // ставим ловушку
  CurrentHook := SetWindowsHookEx(WH_KEYBOARD, @GlobalKeyHook, hInstance, 0);
  hMemFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
    SizeOf(THRec), 'globhk777');
  phf := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);
  phf.CtrlH := CtrlHandle;
  phf.AppH := AppHandle;
end;

function GlobalKeyHook(code: integer; wParam: WPARAM; lParam: LPARAM)
  : LRESULT; stdcall;
var
  KeyStat: TKeyBoardState;
  hActForm: HWND;
  count: integer;
  buf: PChar;
  twochar: array [0 .. 1] of char;
begin
  if code < 0 then
  begin
    Result := CallNextHookEx(CurrentHook, code, wParam, lParam);
    Exit;
  end;
  if code = HC_ACTION then
  begin
    hActForm := GetActiveWindow(); // получаем хэндл активного окна
    hMemFile := OpenFileMapping(FILE_MAP_WRITE, False, 'globhk777');
    phf := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);
    hRecCtrl := phf.CtrlH;
    hMForm := phf.AppH;
    if ((lParam and (1 shl 30)) <> 0) then
    begin
      // проверяем и получаем заголовок окна
      if hActForm <> hLastForm then
      begin
        GetMem(buf, 64);
        if GetWindowText(hActForm, buf, 64) <> 0 then
        begin
          cd.cbData := length(buf) + 1;
          cd.lpData := buf;
          SendMessage(hMForm, WM_COPYDATA, 0, integer(@cd));
        end;
        hLastForm := hActForm;
        FreeMem(buf);
      end;
      // отправляем в наш контрол
      GetKeyboardState(KeyStat);
      count := ToAscii(wParam, lParam, KeyStat, twochar, 0);
      if count = 1 then
        PostMessage(hRecCtrl, WM_CHAR, Ord(twochar[0]), 0);
    end;
  end;
  Result := CallNextHookEx(CurrentHook, code, wParam, lParam);
end;
Благодарен за любой совет!
P.S. проект не для шпиёнства (пройденный этап). Ловушки нужны для перехвата ввода со сканера штрих-кода, евоной обработки, и выполнения разных команд, с целью упразднения клавиатуры и мышки на произв. участке.

Последний раз редактировалось Hottabych; 20.06.2013 в 02:43.
Hottabych вне форума Ответить с цитированием
Старый 20.06.2013, 03:13   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у меня такое чувство что вы и сама среду тоже хукаете, потом она брякает, и происходит дэдлок.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2013, 10:23   #3
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Не уверен про Делфи, но Визуал Студио 2010 виснет при попытке бряка в коде хука из 64-битной дллельки.
Smogg вне форума Ответить с цитированием
Старый 20.06.2013, 18:53   #4
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Не знаю почему, но при использовании в качестве хост процесса \Debug\Project1.exe (не Release) всё работает хорошо. dll брякается только если ввод поступает в хостовое приложение, в принципе, как и должно.
Спасибо за участие!
Hottabych вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
xe4 При установке сервиса получаю no installed debuger has just-in-time debugging enabled punkrediska Общие вопросы Delphi 2 31.05.2013 21:37
Большой размер установочного фаила в delphi xe4 при компиляции под ios Flik Общие вопросы Delphi 5 24.05.2013 14:13
Как получить хэндел глобального хука wanes101 Win Api 4 18.02.2013 22:24
Посчитать сколько слов в текст.файле содержат 1,2,3..буквы (при работе зависает).Delphi. neytron007 Помощь студентам 3 03.01.2013 20:58
Функция-фильтр глобального хука. Katka Win Api 3 30.03.2009 10:57