| 
| 
 | Вопрос # 6 226/ вопрос решён / | 
 |  Приветствую, уважаемые эксперты!Я написал программу для изменения символов вводимых с клавиатуры и у меня появилась проблема при нажатии на любую кнопки вставляется символ "м", а если поставить исключение на кнопку "V" то все нормально работает.
 в чем проблема я не недоумеваю. ПОМОГИТЕ ПОЖАЛУЙСТА!!!!
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) Приложение:Переключить в обычный режим library  DisableKey;uses  Windows,IniFiles,Clipbrd,  Messages,SysUtils;typeTKBDLLHOOKSTRUCT = record  vkCode:DWORD;end;PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;varHookKey: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;varini: 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 ;beginend. 
 Мини-форум вопросаВсего сообщений: 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: Статус вопроса изменён на решённый (изменил автор вопроса — Корбут Анатолий Владимирович): Вопрос решен. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |