Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 73
1

WH_KEYBOARD_LL Хук, русские буквы из чужого окна

11.03.2019, 19:59. Показов 1139. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Перехватываю нажатия клавиш... но к сожалению не получается перехватить буквы с разной раскладкой =(

если печатаю в своём же окне то всё ок!
делаю это так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  SC := MapVirtualKey(PBDLLHOOKSTRUCT(lParam).vkCode, MAPVK_VK_TO_VSC);
  VK := MapVirtualKey(PBDLLHOOKSTRUCT(lParam).scanCode, MAPVK_VSC_TO_VK);
 
  if code>=0 then
  begin
 
 
    if (wParam=WM_KEYDOWN) then
    begin
 
    GetKeyboardState(KS);
    ToUnicode(VK,SC,KS,@Ch,Sizeof(Ch),0);
    Form1.Edit1.Text:=Form1.Edit1.Text+ch;
 
 
    end;
но из чужих окон всё приходит на одном и том же языке и регистр не учитывается =(

в чём может быть проблема?

Добавлено через 3 часа 30 минут
провозился весь день сделал так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function xToUnicode(key: word): char;
var
 newHKL: PWideChar;
 KS: TKeyboardState;
 Ch: Char;
 VK, SC: cardinal;
 layout:integer;
begin
 
    layout:= GetKeyboardLayout(GetWindowThreadProcessID(GetForegroundWindow,nil)) shr 16;
 
    newHKL:=PChar('0000'+IntToHex(layout,4));
 
 
    SC := MapVirtualKeyEx(Key, MAPVK_VK_TO_VSC,LoadKeyboardLayout(newHKL, KLF_ACTIVATE ));
    VK := MapVirtualKeyEx(SC, MAPVK_VSC_TO_VK,LoadKeyboardLayout(newHKL,KLF_ACTIVATE));
 
    GetKeyboardState(KS);
    ToUnicode(VK,SC,KS,@Ch,Sizeof(Ch),0);
 
    result:=ch;
end;
но LoadKeyboardLayout(newHKL, KLF_ACTIVATE ) с флагом KLF_ACTIVATE очень тормозит... 1 -3 сек

а с другими флагами не получается
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2019, 19:59
Ответы с готовыми решениями:

Хук на скролл чужого окна
Доброй ночи. Необходимо отследить события от скролла в чужом окне. Есть dll в которой...

Заменить в исходном файле русские буквы ‘к’ на буквы ‘т’, буквы ‘т’ на буквы ‘к’, буквы ‘л’ на буквы ‘в’, буквы ‘в’ на
Задание: Заменить в исходном файле русские буквы ‘к’ на буквы ‘т’, буквы ‘т’ на буквы ‘к’, буквы...

Хук клавиатуры - как отлавливать русские символы?
Public Class Form1 <Runtime.InteropServices.DllImport("user32.dll")> _ Public Shared...

Хук окна
Скажите пожалуйста какой хук устанавливать и какое событие этого хука отслеживать что бы корректно...

4
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
12.03.2019, 04:30 2
MapVirtualKeyEx с флагом MAPVK_VK_TO_CHAR, должно сразу выдать юникод в младшем слове результата.
0
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 73
12.03.2019, 10:11  [ТС] 3
эмм а как получить младшее слово?

то есть вот так?
Delphi
1
SC := MapVirtualKey(Key, MAPVK_VK_TO_CHAR);
а VK так и оставить???
Delphi
1
VK := MapVirtualKeyEx(SC, MAPVK_VSC_TO_VK,LoadKeyboardLayout(newHKL,KLF_ACTIVATE));
???
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
12.03.2019, 11:30 4
Пример ставит хук на клавиатуру и выводит в MessageBox нажатую клавишу (для выхода нажать escape).
Pascal
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
uses
  Windows, Messages;
 
const
  WH_KEYBOARD_LL=13;
  MAPVK_VK_TO_CHAR=2;
 
type
  tagKBDLLHOOKSTRUCT=packed record
                     vkCode:      Cardinal;
                     scanCode:    Cardinal;
                     flags:       Cardinal;
                     time:        Cardinal;
                     dwExtraInfo: pointer;
                     end;
  PtagKBDLLHOOKSTRUCT=^tagKBDLLHOOKSTRUCT;
 
var
  msg: tagMSG;
 
function wsprintfW(outstr,format: PWideChar): Cardinal;cdecl;varargs;external 'user32.dll';
 
function LowLevelKeyboardProc(code,wParam: Cardinal; lParam: PtagKBDLLHOOKSTRUCT): Cardinal;stdcall;
var
  buf: array[0..32] of WideChar;
begin
  buf[wsprintfW(@buf,'0000%H',GetKeyboardLayout(GetWindowThreadProcessID(GetForegroundWindow,nil)) shr 16)]:=#0;
  buf[0]:=WideChar(MapVirtualKeyExW(lParam.vkCode, MAPVK_VK_TO_CHAR, LoadKeyboardLayoutW(@buf,KLF_ACTIVATE)));
  buf[1]:=#0;
  MessageBoxW(0,@buf,0,0);
  if lParam.vkCode=VK_ESCAPE then
    ExitProcess(0);
end;
 
begin
  SetWindowsHookExW(WH_KEYBOARD_LL,@LowLevelKeyboardProc,0,0);
  repeat
    GetMessage(msg,0,0,0);
    TranslateMessage(msg);
    DispatchMessage(msg);
  until false;
end.
1
0 / 0 / 0
Регистрация: 18.10.2013
Сообщений: 73
12.03.2019, 14:28  [ТС] 5
спасибо большое) сегодня вечером посмотрю =)
0
12.03.2019, 14:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2019, 14:28
Помогаю со студенческими работами здесь

Расположить латинские буквы в начале строки, отсортированные по алфавиту, а русские буквы в конце
ПОЖАЛУЙСТА ПОМОГИТЕ блондинке:) раньше не было фортрана а перевелася на другой факультет и сразу...

Handle чужого окна
Всем привет. Проблема в следующем: Есть окно посторонней программы, на ней расположено 2 поля для...

Закрытие чужого окна
Код: #include <windows.h> # include <vcl.h> #pragma hdrstop # include <Mmsystem.h> HWND...

Прозрачность чужого окна
Если не ошибаюсь на API есть возможность изменить прозрачность окна стороннего приложения. Как это...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru