2015-10-09 3 views
0

Через некоторое время аварии, и я, чтобы начать крюк сноваМои Крюк функции перестают работать

Функция KeyboardHook

function KeyboardHook(Code: Integer; wParam : WPARAM; lParam : LPARAM): LongInt; 
var 
    Buffer: TEventMsg; 
    Key: Cardinal; 
begin 
    if (wParam = $0101) and 
    (App.Inside) then 
    begin 
    Buffer := PEventMsg(lParam)^; 
    Key := Buffer.message; 

    if App.Inside then 
    begin 
     case Key of 
     VK_NEXT: App.Next; 
     VK_CAPITAL: App.Show; 
     end; 
    end; 
    end; 
    CallNextHookEx(Hook_ID_Keyboard, Code, wParam, lParam); 
    Result := 0; 
end; 

Функция для запуска крюке

function StartHookKeyboard: Boolean; stdcall; 
begin 
    Hook_ID_Keyboard := SetWindowsHookEx(13, @KeyboardHook, HInstance, 0); 
    If Hook_ID_Keyboard = 0 then 
    Result := False else 
    Result := True; 
end; 

Есть ли какие-либо ошибки в моем коде?

+0

Повторение * Через некоторое время происходит сбой, и я должен снова запустить крючок * несколько раз не вопрос. Копирование и вставка * Через некоторое время происходит сбой, и я должен снова запустить крючок. Через некоторое время происходит сбой, и я должен снова запустить крючок. После некоторого сбоя и я снова должен снова запустить крючок. * Не вопрос. Копирование и вставка * Через некоторое время происходит сбой, и я должен снова запустить крючок. Через некоторое время происходит сбой, и я должен снова запустить крючок. После некоторого сбоя и я снова должен снова запустить крючок. * Не вопрос. Повторите попытку и повторите попытку. –

+0

Письмо *, поэтому я пишу этот абзац, бесполезный для его публикации * так же неправильно, как копирование и вставка бессмыслицы. Существует требование для определенного количества текста, чтобы вы предоставили ** полезную ** информацию, а не шум. Если вы не хотите участвовать здесь, действуя правильно, отправляйтесь в другое место, чтобы найти помощь. –

+0

Хорошо, мне очень жаль. – user2022323

ответ

1

Не используйте жестко закодированные magic numbers. В этом контексте 13 составляет WH_KEYBOARD_LL, $0101 - WM_KEYUP и т. Д. Используйте фактические имена в вашем коде. Они объявлены в единицах Windows и Messages.

Вы объявили KeyboardHook(), чтобы использовать соглашение о звонках stdcall? Код, который вы показали, не делает этого. Это очень важно, поэтому значения параметров передаются правильно в стеке вызовов.

lParam значение WH_KEYBOARD_LL крючка НЕ ​​PEventMsg (указатель на структуру EVENTMSG). Эта структура используется для крючков WH_JOURNALPLAYBACK. WH_KEYBOARD_LL использует структуру KBDLLHOOKSTRUCT. Delphi не объявляет эту конкретную структуру, поэтому вам придется объявить ее самостоятельно в своем коде.

И не игнорируйте параметр обратного вызова Code или возвращаемое значение CallNextHookEx(). Они важны. Значения wParam и lParam действительны только тогда, когда параметр Code равен HC_ACTION (0). И возвращаемое значение CallNextHookEx() должно быть передано цепочке крючков.

Попробуйте вместо этого:

type 
    PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; 
    KBDLLHOOKSTRUCT = record 
    vkCode: DWORD; 
    scanCode: DWORD; 
    flags: DWORD; 
    time: DWORD; 
    dwExtraInfo: ULONG_PTR; 
    end; 

function KeyboardHook(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; 
begin 
    if Code = HC_ACTION then 
    begin 
    if (wParam = WM_KEYUP) and (App.Inside) then 
    begin 
     case PKBDLLHOOKSTRUCT(lParam)^.vkCode of 
     VK_NEXT: App.Next; 
     VK_CAPITAL: App.Show; 
     end; 
    end; 
    end; 
    // note that CallNextHookEx() ignores the first parameter, 
    // so you could pass 0 instead of ID_Keyboard... 
    Result := CallNextHookEx(Hook_ID_Keyboard, Code, wParam, lParam); 
end; 

function StartHookKeyboard: Boolean; stdcall; 
begin 
    if Hook_ID_Keyboard = 0 then 
    Hook_ID_Keyboard := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHook, HInstance, 0); 
    Result := Hook_ID_Keyboard <> 0; 
end; 

function StopHookKeyboard: Boolean; stdcall; 
begin 
    if Hook_ID_Keyboard <> 0 then 
    begin 
    if UnhookWindowsHookEx(Hook_ID_Keyboard) then 
     Hook_ID_Keyboard := 0; 
    end; 
    Result := Hook_ID_Keyboard = 0; 
end; 

Если код еще сбой, это, вероятно, связано с App. Что такое App? Где и как оно объявляется? Как он инициализируется? Что делать Next() и Show() на самом деле делаете? Вы устанавливаете глобальный крючок, чтобы закрепить все запущенные процессы, так что App используется в кросс-технологическом режиме?

+0

Я использую Delphi 7 и WH_KEYBOARD_LL не существует Но работа кода и ошибка в «App.Show». – user2022323

+0

Либо ваш указатель 'App' недействителен, либо' Show() 'делает то, что он не должен делать. В любом случае, вы не указали какой-либо код, связанный с тем, как вы настраиваете 'App' или что' Show() 'делает. Поэтому никто не может объяснить вам, почему ваш код не работает. –

+0

Нет проблем, я обнаружил ошибку внутри App.Show и исправить. Thx все в любом случае. И извините за мой английский. – user2022323

Смежные вопросы