![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; Последний раз редактировалось M.A.D.M.A.N., 20.06.2015 в 22:57. |
|
#9
|
||||
|
||||
|
Оффтоп:
Цитата:
но по аналогии с другими... |
|
#10
|
||||
|
||||
|
Цитата:
По сути указатель в дельфи как раз NativeUInt. |
|
#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 |
|
#14
|
||||
|
||||
|
Так скан-код един для каждой клавиши, различие лишь в состоянии шифта или CapsLosk, я когда-то тоже искал вариант решения подобной задачи (правда совсем в другой области, но принцип подобен) и вот вам для примера результат поиска, пжлст, гляньте энто дело
|