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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2014, 09:22   #1
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию Клавиатурный хук, вывод клавиши два раза.

Наткнулся на такую проблему, если фокус ввода стоит в каком либо поле, то в memo символ записывается два раза, как решить проблему?
Обработчик:
Код:
var SC, VK: integer;
		buf: Char;
		KS: TKeyboardState;
		MyHKL: HKL;
begin
inherited ;
	if Msg.Msg = HookMsg then
		begin
			MyHKL:=GetKeyboardLayout(msg.LParam);
			SC:=MapVirtualKeyEx(Msg.WParam,MAPVK_VK_TO_VSC,MyHKL);
			GetKeyboardState(KS);
			ToUnicodeEx(Msg.WParam,SC,KS,@buf,sizeof(buf),0,MyHKL);
			Memo1.Text:=Memo1.Text+buf;
			MyHKL:=0;
		End;
Сам хук:
Код:
function KeyboardProc(code: integer; wParam: word; lParam: longint) : longint; stdcall;
var Wnd:HWND;
Begin
  if code < 0 then
    Result:= CallNextHookEx(CurHook, Code, wParam, lParam)
  else
    begin
      if Byte(LParam shr 24)<$80 then
        begin
          Wnd:= FindWindow(nil, PChar('Перехватчик'));
          SendMessage(Wnd,HookMsg,wParam, GetCurrentThreadId);
          Result:=CallNextHookEx(CurHook, Code, wParam, lParam);
       end;
  end;
end;
Winexcel вне форума Ответить с цитированием
Старый 09.07.2014, 17:33   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Наткнулся на такую проблему, если фокус ввода стоит в каком либо поле, то в memo символ записывается два раза, как решить проблему?
А это не баг, это фича. Первый раз это нажатие, второй отпускание.
Человек_Борща вне форума Ответить с цитированием
Старый 09.07.2014, 17:40   #3
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

MSDN писывает два возможных значения code - HC_ACTION и HC_NOREMOVE; вы их не проверяете.

Проверка на отпускание/нажатие имеется, хотя было бы неплохо записать ее так, чтоб она была более очевидна.

Последний раз редактировалось Silver_S; 09.07.2014 в 18:28.
Silver_S вне форума Ответить с цитированием
Старый 14.07.2014, 07:18   #4
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от Silver_S Посмотреть сообщение
MSDN писывает два возможных значения code - HC_ACTION и HC_NOREMOVE; вы их не проверяете.

Проверка на отпускание/нажатие имеется, хотя было бы неплохо записать ее так, чтоб она была более очевидна.
Огромное спасибо!
Winexcel вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хук мыши на дополнительные клавиши KoBRaAndrey Общие вопросы Delphi 3 16.04.2011 12:15
Глобальный хук на нажатие клавиши Slippy Общие вопросы Delphi 2 31.12.2010 19:30
Клавиатурный хук. Гляньте код.... Levmetall Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 26.02.2010 18:44
слово пишется два раза INDY-SAVER Microsoft Office Word 2 18.11.2009 23:49
глобальный хук & событие отжатия клавиши Nowichok Общие вопросы Delphi 9 24.11.2006 17:51