Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 226

/ вопрос решён /

Приветствую, уважаемые эксперты!
Я написал программу для изменения символов вводимых с клавиатуры и у меня появилась проблема при нажатии на любую кнопки вставляется символ "м", а если поставить исключение на кнопку "V" то все нормально работает.
в чем проблема я не недоумеваю. ПОМОГИТЕ ПОЖАЛУЙСТА!!!!

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. library DisableKey;
  2. uses
  3. Windows,IniFiles,Clipbrd,
  4. Messages,SysUtils;
  5. type
  6. TKBDLLHOOKSTRUCT = record
  7. vkCode:DWORD;
  8. end;
  9. PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
  10. var
  11. HookKey:HHOOK;
  12.  
  13. Procedure BuferPlaste(Key: String);
  14. begin
  15. Clipboard.clear;
  16. Clipboard.SetTextBuf(PChar(Key));
  17. keybd_event(VK_CONTROL, 0, 0, 0);
  18. keybd_event(Ord('V'), 0, 0, 0);
  19. keybd_event(Ord('V'), 0, KEYEVENTF_KEYUP, 0);
  20. keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
  21. end;
  22.  
  23. function LowLevelKeyboardProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  24. var
  25. ini: TIniFile;
  26. //KD,KD2:boolean;
  27. p: PKBDLLHOOKSTRUCT;
  28. NamePattern,Path:String;
  29. begin
  30. GetDir(0, Path);
  31. Ini:=TiniFile.Create(Path+'\'+'Settings.ini');
  32. NamePattern:= Ini.ReadString('Settings','Pattern', 'Rus');
  33. //KD:= Ini.ReadBool('Settings','KeyDissable', True);
  34. Ini.Free;
  35. Ini:=TiniFile.Create(Path+'\'+'Pattern\'+NamePattern+'.ini');
  36. if nCode = HC_ACTION then
  37. begin
  38. case wParam of
  39. WM_KEYDOWN:
  40. begin
  41. p:=PKBDLLHOOKSTRUCT(lParam);
  42.  
  43. if Ini.ValueExists('Skey',IntToStr(p^.vkCode)) then
  44. BuferPlaste(Ini.ReadString('Skey',IntToStr(p^.vkCode),'notkey'));
  45.  
  46. end;
  47. end;
  48. Ini.Free;
  49. end;
  50. if true then
  51. result:=1
  52. else
  53. result:= CallNextHookEx(0, nCode, wParam, lParam);
  54. end;
  55.  
  56. procedure hook(Switch: Boolean; HandleProg: HWND) export; stdcall;
  57. begin
  58. if Switch then
  59. begin
  60. HookKey:=SetWindowsHookEx(13,@LowLevelKeyboardProc,HInstance,0)
  61. end
  62. else
  63. begin
  64. UnhookWindowshookEx(HookKey);
  65. HookKey:=0;
  66. end;
  67. end;
  68.  
  69. exports hook ;
  70. begin
  71. end.
  72.  


Корбут Анатолий Владимирович Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Корбут Анатолий Владимирович (статус: Посетитель)
Вопрос отправлен: 20 июля 2012, 15:33
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 20 июля 2012, 20:11; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 20 июля 2012, 15:54 [#1]:

Очевидно, срабатывает условие
if Ini.ValueExists('Skey',IntToStr(p^.vkCode))   then
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 20 июля 2012, 15:54 [#2]:

Отладчиком пользоваться пробовал?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Amidamaru

Amidamaru (статус: 4-ый класс), 20 июля 2012, 16:02 [#3]:

Раз уж делаешь в библиотеке, то мог бы и не Lowlevel а полноценный хук на клавиатуру поставить.
А вообще ты же нажимаешь программно ctrl+v. Я просто не знаю как это нажатие обрабатывается твоим хуком, возможно изза этой рекурсии и получается такая ошибка. Ведь LL хук имеет определенный лимит времени на выполнение.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Корбут Анатолий Владимирович

Корбут Анатолий Владимирович (статус: Посетитель), 20 июля 2012, 16:27 [#4]:

Точно а я про это не подумал.Аа не подскажите как обойтись без программного нажатия ctrl+v мож есть что нибудь другое?
Корбут Анатолий Владимирович

Корбут Анатолий Владимирович (статус: Посетитель), 20 июля 2012, 16:32 [#5]:

SendMessage (ActiveControl.Handle, WM_Paste, 0, 0)
такой код не во всех случаях работает. Может как нибудь по другому можно вставит символ в поле где находиться каретка ??
Amidamaru

Amidamaru (статус: 4-ый класс), 20 июля 2012, 19:14 [#6]:

можно проверять нажата ли клавиша ctrl (а также alt и shift) и если нажата - то пропускать.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Корбут Анатолий Владимирович

Корбут Анатолий Владимирович (статус: Посетитель), 20 июля 2012, 19:18 [#7]:

Тогда получается нет универсальной функции для вставки текста в поле где расположена каретка кроме которой я использую а то я делаю прогу для игры мож есть что нибудь еще ???
Amidamaru

Amidamaru (статус: 4-ый класс), 20 июля 2012, 20:02 [#8]:

есть SendInput, которая более новая версия, объединяющая mouse_event и keybd_event.
можно ещё с помощью GetKeyboardState - SetKeyboardState.
Только ты набираешь ctrl+v, а можно набирать именно сам текст нажатиями клавиш.
Ещё можно посылать сообщения WM_Char которые в делфи соответствуют OnKeyPress.

ps и нужно не ActiveControl.Handle, а GetForegroundWindow.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Корбут Анатолий Владимирович

Корбут Анатолий Владимирович (статус: Посетитель), 20 июля 2012, 20:11 [#9]:

Спасибо за помощь буду рыть дальше а вопрос решен.

20 июля 2012, 20:13: Статус вопроса изменён на решённый (изменил автор вопроса — Корбут Анатолий Владимирович): Вопрос решен.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:38
Выполнено за 0.03 сек.