![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() подскажите пожалуйста как реализовать функцию чтобы сменить полученные букву на туже только на русскую раскладку. Перехватываю хуком:
Код:
case PKbdDllHookStrukt(LParam)^.vkCode of 65..90: begin if GetKeyState($10) < 0 then begin StrResult:=UpperCase(Chr(PKbdDllHookStrukt(LParam)^.vkCode)); //A..Z buff:=buff+StrResult; end else begin StrResult:=LowerCase(Chr(PKbdDllHookStrukt(LParam)^.vkCode)); //a..z buff:=buff+StrResult; end; end; |
#2
|
||||
|
||||
![]() В смысле транслитерацию латиницы в кириллицу или нижний ряд на англицких кнопках?
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
![]() нет например я написал букву "q", а рядом перевод еще и русской раскладки "й". И получилось "qй"
|
#4
|
||||
|
||||
![]() Нужно глушить обработку первичного сообщения методом обнуления, посмотрите вот такой пример, вдруг поможет
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
|||
|
|||
![]() Цитата:
Код:
function KeyHookFunc(Code, VirtualKey, KeyStroke: integer): LRESULT; stdcall; var Kv: TKeyBoardState; b: array[0..1] of char; begin Result:= 0; if Code = HC_NOREMOVE then Exit; Result:= CallNextHookEx(hK, Code, VirtualKey, KeyStroke); if Code < 0 then Exit; if Code = HC_ACTION then begin if ((KeyStroke and (1 shl 30)) <> 0) then {if not IsWindow(hA) then }begin hM:= OpenFileMapping(FILE_MAP_WRITE, False, 'MyKeyMap'); Hr:= MapViewOfFile(hM, FILE_MAP_WRITE, 0, 0, 0); if Hr <> nil then hA:= Hr.AppHnd; end; if ((KeyStroke and (1 shl 30)) <> 0) then begin GetKeyboardState(Kv); if ToAscii(VirtualKey, KeyStroke, Kv, b, 0) = 1 then SendMessage(hA, WM_USER + 1753, Ord(b[0]), Code) else if VirtualKey = 19 then SendMessage(hA, WM_USER + 1753, 0, 19); end; end; end; hK:= SetWindowsHookEx(WH_KEYBOARD, KeyHookFunc, hInstance, 0);//<тут обибка только ошибку выбивает Код:
[dcc32 Error] Unit1.pas(291): E2010 Incompatible types: 'NativeUInt' and 'Integer' |
#6
|
||||
|
||||
![]() Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
|||
|
|||
![]() нет, не то либо я что то делаю не так
|
#8
|
||||
|
||||
![]() Цитата:
Для неумеющих читать справку: Код:
TFNHookProc = function (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall; Код:
function KeyHookFunc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall; — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 20.06.2015 в 22:57. |
#9
|
||||
|
||||
![]() Оффтоп:
Цитата:
![]() Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#10
|
||||
|
||||
![]() Цитата:
По сути указатель в дельфи как раз NativeUInt. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#11
|
|||
|
|||
![]() Цитата:
только я смотрю код, когда он должен выводить сообщение: Код:
function KeyHookFunc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall; stdcall; var Kv: TKeyBoardState; b: array[0..1] of char; begin Result:= 0; if Code = HC_NOREMOVE then Exit; Result:= CallNextHookEx(hK, Code, wparam, lparam); if Code < 0 then Exit; if Code = HC_ACTION then begin if ((lparam and (1 shl 30)) <> 0) then {if not IsWindow(hA) then }begin hM:= OpenFileMapping(FILE_MAP_WRITE, False, 'MyKeyMap'); Hr:= MapViewOfFile(hM, FILE_MAP_WRITE, 0, 0, 0); if Hr <> nil then hA:= Hr.AppHnd; end; if ((lparam and (1 shl 30)) <> 0) then begin GetKeyboardState(Kv); if ToAscii(wparam, lparam, Kv, b, 0) = 1 then SendMessage(hA, WM_USER + 1753, Ord(b[0]), Code) else if wparam = 19 then SendMessage(hA, WM_USER + 1753, 0, 19); end; end; end; Признаюсь с хуками только начинаю разбираться, прошу сильно не давить на меня, а объяснить пожалуйста. |
#12
|
|||
|
|||
![]() Попробовал так:
Код:
function Translit(s: string): string; const rus: string = 'qwertyuiopasdfghjklzxcvbnm'; lat: array[1..26] of string = ('й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь'); var p, i, l: integer; begin Result := ''; l := Length(s); for i := 1 to l do begin p := Pos(s[i], rus); if p<1 then Result := Result + s[i] else Result := Result + lat[p]; end; end; но проблема в том что не передается раскладка, то есть какой бы регистр не был все равно будут маленькие. Есть еще варианты? |
#13
|
||||
|
||||
![]() Гугли лучше, есть варианты, которые решают твою проблему. Лично видел.
Собственно вот: http://www.delphisources.ru/pages/fa...yr_to_lat.html — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#14
|
||||
|
||||
![]() Так скан-код един для каждой клавиши, различие лишь в состоянии шифта или CapsLosk, я когда-то тоже искал вариант решения подобной задачи (правда совсем в другой области, но принцип подобен) и вот вам для примера результат поиска, пжлст, гляньте энто дело
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |