Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Помогите разобраться с KeyboardHook


Автор: wesadex 11.11.2005, 11:46
Пишу простейшую прогу - Калькулятор - но вылезла одна "веселая" заморочка: на компах, где будет он использоваться стоит PuntoSwitcher (автопереключатель раскладки клавы) и на кн. Break у него как раз забиндено переключение по дефолту, а я в свою очередь хочу использовать эту клавишу для сброса - удобнее так, да и нет других подходящих для этого клавиш рядом с цифровой клавиатурой... В результате получается дикое порно - при нажатии на Break результат на табло увеличивается по длине вдвое (множится), причем через раз... смысла описывать точно, что происходит нету, просто это глюк в прикладушке моей... и с ним надо бороться! Обчитался drkb на тему Hooks, но понял если честно слабо... попробовал локальный хук на клаву вешать - результат превзошел ожидание - пришлось тачку ребутить Reset'ом... Прошу помощи как мыслями на тему, так и по возможности кодом! smile
Оговорюсь сразу - изменение HotKey'ев в PS недопустимо - бухгалтерши тады повесятся! smile
Настройка исключений в PS на мою прикладушку тоже не решает проблемы... smile

Автор: Romikgy 11.11.2005, 12:56
Мож воспользоватся GetKeyboardState, и вручную обрабатывать требуемую клавишу?

Автор: _hunter 11.11.2005, 13:38
во-первых: почему бы не навесить сброс на Delete ( это IMHO логичнее )
во-вторых: почему бы не найти причину глюка?

Автор: wesadex 11.11.2005, 14:15
Romikgy, получилось, спасибо... вот решение:
Код

procedure TmainForm.LCDKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState); // LCD: TEdit;
var K:Char;
    State: TKeyboardState;
begin
   if not GetKeyboardState(State) then ShowMessage('Zhopa!') else
               begin
               if State[19]>127 then
                       begin
                       K:=#27; // Требуемые действа при нажатии на Break (VK_PAUSE)
                       LCDKeyPress(Sender, K); // они же 
                       end;
               end;
end;


2 _hunter:
На Delete неудобнее, чем на Break (см. клаву). Причину глюка же искать не надо - она уже известна - так работает PuntoSwitcher. То есть на Брейке висит отмена сделанных им изменений и когда ты вводил допустим только цифири (на калькуляторе так и есть), он частенько возвращает то, что у него в буфере еще раз, хотя изменений не было! smile

Всем спасибо за ответы! smile

Так, замечательно, Брейк я поймал, теперь осталось не дать PS его получить... smile

Автор: Romikgy 14.11.2005, 10:50
Дык обнуляй после своей ф-ции буфер клавы, по памяти вроде так
Key:=#0;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)