|
Вопрос # 6 226/ вопрос решён / |
|
Приветствую, уважаемые эксперты!
Я написал программу для изменения символов вводимых с клавиатуры и у меня появилась проблема при нажатии на любую кнопки вставляется символ "м", а если поставить исключение на кнопку "V" то все нормально работает.
в чем проблема я не недоумеваю. ПОМОГИТЕ ПОЖАЛУЙСТА!!!!
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- library DisableKey;
- uses
- Windows,IniFiles,Clipbrd,
- Messages,SysUtils;
- type
- TKBDLLHOOKSTRUCT = record
- vkCode:DWORD;
- end;
- PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
- var
- HookKey:HHOOK;
-
- Procedure BuferPlaste(Key: String);
- begin
- Clipboard.clear;
- Clipboard.SetTextBuf(PChar(Key));
- keybd_event(VK_CONTROL, 0, 0, 0);
- keybd_event(Ord('V'), 0, 0, 0);
- keybd_event(Ord('V'), 0, KEYEVENTF_KEYUP, 0);
- keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
- end;
-
- function LowLevelKeyboardProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
- var
- ini: TIniFile;
- //KD,KD2:boolean;
- p: PKBDLLHOOKSTRUCT;
- NamePattern,Path:String;
- begin
- GetDir(0, Path);
- Ini:=TiniFile.Create(Path+'\'+'Settings.ini');
- NamePattern:= Ini.ReadString('Settings','Pattern', 'Rus');
- //KD:= Ini.ReadBool('Settings','KeyDissable', True);
- Ini.Free;
- Ini:=TiniFile.Create(Path+'\'+'Pattern\'+NamePattern+'.ini');
- if nCode = HC_ACTION then
- begin
- case wParam of
- WM_KEYDOWN:
- begin
- p:=PKBDLLHOOKSTRUCT(lParam);
-
- if Ini.ValueExists('Skey',IntToStr(p^.vkCode)) then
- BuferPlaste(Ini.ReadString('Skey',IntToStr(p^.vkCode),'notkey'));
-
- end;
- end;
- Ini.Free;
- end;
- if true then
- result:=1
- else
- result:= CallNextHookEx(0, nCode, wParam, lParam);
- end;
-
- procedure hook(Switch: Boolean; HandleProg: HWND) export; stdcall;
- begin
- if Switch then
- begin
- HookKey:=SetWindowsHookEx(13,@LowLevelKeyboardProc,HInstance,0)
- end
- else
- begin
- UnhookWindowshookEx(HookKey);
- HookKey:=0;
- end;
- end;
-
- exports hook ;
- begin
- end.
-
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 20 июля 2012, 20:11; участников в обсуждении: 3.
|
min@y™ (статус: Доктор наук), 20 июля 2012, 15:54 [#1]:
Очевидно, срабатывает условие
if Ini.ValueExists('Skey',IntToStr(p^.vkCode)) then
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 20 июля 2012, 15:54 [#2]:
Отладчиком пользоваться пробовал?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Amidamaru (статус: 4-ый класс), 20 июля 2012, 16:02 [#3]:
Раз уж делаешь в библиотеке, то мог бы и не Lowlevel а полноценный хук на клавиатуру поставить.
А вообще ты же нажимаешь программно ctrl+v. Я просто не знаю как это нажатие обрабатывается твоим хуком, возможно изза этой рекурсии и получается такая ошибка. Ведь LL хук имеет определенный лимит времени на выполнение.
|
|
Корбут Анатолий Владимирович (статус: Посетитель), 20 июля 2012, 16:27 [#4]:
Точно а я про это не подумал.Аа не подскажите как обойтись без программного нажатия ctrl+v мож есть что нибудь другое?
|
|
Корбут Анатолий Владимирович (статус: Посетитель), 20 июля 2012, 16:32 [#5]:
SendMessage (ActiveControl.Handle, WM_Paste, 0, 0)
такой код не во всех случаях работает. Может как нибудь по другому можно вставит символ в поле где находиться каретка ??
|
|
Amidamaru (статус: 4-ый класс), 20 июля 2012, 19:14 [#6]:
можно проверять нажата ли клавиша ctrl (а также alt и shift) и если нажата - то пропускать.
|
|
Корбут Анатолий Владимирович (статус: Посетитель), 20 июля 2012, 19:18 [#7]:
Тогда получается нет универсальной функции для вставки текста в поле где расположена каретка кроме которой я использую а то я делаю прогу для игры мож есть что нибудь еще ???
|
|
Amidamaru (статус: 4-ый класс), 20 июля 2012, 20:02 [#8]:
есть SendInput, которая более новая версия, объединяющая mouse_event и keybd_event.
можно ещё с помощью GetKeyboardState - SetKeyboardState.
Только ты набираешь ctrl+v, а можно набирать именно сам текст нажатиями клавиш.
Ещё можно посылать сообщения WM_Char которые в делфи соответствуют OnKeyPress.
ps и нужно не ActiveControl.Handle, а GetForegroundWindow.
|
20 июля 2012, 20:13: Статус вопроса изменён на решённый (изменил автор вопроса — Корбут Анатолий Владимирович): Вопрос решен.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|