Преобразование кода FormKeyDown в код FormKeyPress

Эта таблица, написанная для Delphi используется в редакторе swe, она необходима для организации программного стробирования клавиатуры



(*--------------------------------------------------------------*)
(* Универсальная таблица для преобразования кода клавиши        *)
(* функции FormKeyDown в код символа функции FormKeyPress       *)
(*  - необходима, чтобы обойтись без вызова KeyPress при        *)
(*    организации программного стробирования клавиатуры         *)
(*    (программное, т.е. от таймера)                            *)
(*                                                              *)
(* (C) 2003 (SW) http://uafo.ru/msg/homepage/                   *)
(*--------------------------------------------------------------*)

Const
  MKeys =115;        (* количество [разнообразных] клавиш *)

Type

  TKeyDef = packed record
    Ord : byte;      (* порядковый номер в исходном массиве          *)
    Key : byte;      (* код клавиши=младш.байт var Key в FormKeyDown *)
    Eng : byte;      (* соответствующий символ в англ.раскладке      *)
    ESh : byte;      (* символ с нажатым Shift или CapsLock          *)
    ECh : boolean;   (* действует ли CapsLock - т.е. буква ли это    *)
    Rus : byte;      (* соотв. символ в кириллической раскладке      *)
    RSh : byte;      (* символ с нажатым Shift или CapsLock          *)
    RCh : boolean;   (* действует ли CapsLock - т.е. буква ли это    *)
  end;

  TArrKeyC  = packed array [1..MKeys] of TKeyDef;  (* исх. массив клавиш   *)
  TArrKeys  = packed array [0..255]   of TKeyDef;  (* упорядоченный по Key *)

Const

  CArrKeys : TArrKeyC =
   (

(* верхний ряд клавиатуры *)
(Ord:  1;Key:$1B;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Esc
(Ord:  2;Key:$70;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F1
(Ord:  3;Key:$71;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F2
(Ord:  4;Key:$72;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F3
(Ord:  5;Key:$73;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F4
(Ord:  6;Key:$74;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F5
(Ord:  7;Key:$75;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F6
(Ord:  8;Key:$76;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F7
(Ord:  9;Key:$77;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F8
(Ord: 10;Key:$78;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F9
(Ord: 11;Key:$79;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F10
(Ord: 12;Key:$7A;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F11
(Ord: 13;Key:$7B;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // F12
(Ord: 14;Key:$FF;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Prnt Scr
(Ord: 15;Key:$91;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Scroll Lock
(Ord: 16;Key:$13;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Pause

(* ряд цифр *)
(Ord: 17;Key:$C0;Eng:$60;ESh:$7E;ECh:false;Rus:$B8;RSh:$A8;RCh:true ), // ~
(Ord: 18;Key:$31;Eng:$31;ESh:$21;ECh:false;Rus:$31;RSh:$21;RCh:false), // 1
(Ord: 19;Key:$32;Eng:$32;ESh:$40;ECh:false;Rus:$32;RSh:$22;RCh:false), // 2
(Ord: 20;Key:$33;Eng:$33;ESh:$23;ECh:false;Rus:$33;RSh:$B9;RCh:false), // 3
(Ord: 21;Key:$34;Eng:$34;ESh:$24;ECh:false;Rus:$34;RSh:$3B;RCh:false), // 4
(Ord: 22;Key:$35;Eng:$35;ESh:$25;ECh:false;Rus:$35;RSh:$25;RCh:false), // 5
(Ord: 23;Key:$36;Eng:$36;ESh:$5E;ECh:false;Rus:$36;RSh:$3A;RCh:false), // 6
(Ord: 24;Key:$37;Eng:$37;ESh:$26;ECh:false;Rus:$37;RSh:$3F;RCh:false), // 7
(Ord: 25;Key:$38;Eng:$38;ESh:$2A;ECh:false;Rus:$38;RSh:$2A;RCh:false), // 8
(Ord: 26;Key:$39;Eng:$39;ESh:$28;ECh:false;Rus:$39;RSh:$28;RCh:false), // 9
(Ord: 27;Key:$30;Eng:$30;ESh:$29;ECh:false;Rus:$30;RSh:$29;RCh:false), // 0
(Ord: 28;Key:$BD;Eng:$2D;ESh:$5F;ECh:false;Rus:$2D;RSh:$5F;RCh:false), // -
(Ord: 29;Key:$BB;Eng:$3D;ESh:$2B;ECh:false;Rus:$3D;RSh:$2B;RCh:false), // =
(Ord: 30;Key:$DC;Eng:$5C;ESh:$7C;ECh:false;Rus:$5C;RSh:$2F;RCh:false), // \
(Ord: 31;Key:$08;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // BkSpace

(* первый ряд букв ЙЦУКЕН *)
(Ord: 32;Key:$09;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Tab
(Ord: 33;Key:$51;Eng:$71;ESh:$51;ECh:true ;Rus:$E9;RSh:$C9;RCh:true ), // Q
(Ord: 34;Key:$57;Eng:$77;ESh:$57;ECh:true ;Rus:$F6;RSh:$D6;RCh:true ), // W
(Ord: 35;Key:$45;Eng:$65;ESh:$45;ECh:true ;Rus:$F3;RSh:$D3;RCh:true ), // E
(Ord: 36;Key:$52;Eng:$72;ESh:$52;ECh:true ;Rus:$EA;RSh:$CA;RCh:true ), // R
(Ord: 37;Key:$54;Eng:$74;ESh:$54;ECh:true ;Rus:$E5;RSh:$C5;RCh:true ), // T
(Ord: 38;Key:$59;Eng:$79;ESh:$59;ECh:true ;Rus:$ED;RSh:$CD;RCh:true ), // Y
(Ord: 39;Key:$55;Eng:$75;ESh:$55;ECh:true ;Rus:$E3;RSh:$C3;RCh:true ), // U
(Ord: 40;Key:$49;Eng:$69;ESh:$49;ECh:true ;Rus:$F8;RSh:$D8;RCh:true ), // I
(Ord: 41;Key:$4F;Eng:$6F;ESh:$4F;ECh:true ;Rus:$F9;RSh:$D9;RCh:true ), // O
(Ord: 42;Key:$50;Eng:$70;ESh:$50;ECh:true ;Rus:$E7;RSh:$C7;RCh:true ), // P
(Ord: 43;Key:$DB;Eng:$5B;ESh:$7B;ECh:false;Rus:$F5;RSh:$D5;RCh:true ), // [
(Ord: 44;Key:$DD;Eng:$5D;ESh:$7D;ECh:false;Rus:$FA;RSh:$DA;RCh:true ), // ]

(* второй ряд букв ФЫВАПРОЛД *)
(Ord: 45;Key:$14;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Caps
(Ord: 46;Key:$41;Eng:$61;ESh:$41;ECh:true ;Rus:$F4;RSh:$D4;RCh:true ), // A
(Ord: 47;Key:$53;Eng:$73;ESh:$53;ECh:true ;Rus:$FB;RSh:$DB;RCh:true ), // S
(Ord: 48;Key:$44;Eng:$64;ESh:$44;ECh:true ;Rus:$E2;RSh:$C2;RCh:true ), // D
(Ord: 49;Key:$46;Eng:$66;ESh:$46;ECh:true ;Rus:$E0;RSh:$C0;RCh:true ), // F
(Ord: 50;Key:$47;Eng:$67;ESh:$47;ECh:true ;Rus:$EF;RSh:$CF;RCh:true ), // G
(Ord: 51;Key:$48;Eng:$68;ESh:$48;ECh:true ;Rus:$F0;RSh:$D0;RCh:true ), // H
(Ord: 52;Key:$4A;Eng:$6A;ESh:$4A;ECh:true ;Rus:$EE;RSh:$CE;RCh:true ), // J
(Ord: 53;Key:$4B;Eng:$6B;ESh:$4B;ECh:true ;Rus:$EB;RSh:$CB;RCh:true ), // K
(Ord: 54;Key:$4C;Eng:$6C;ESh:$4C;ECh:true ;Rus:$E4;RSh:$C4;RCh:true ), // L
(Ord: 55;Key:$BA;Eng:$3B;ESh:$3A;ECh:false;Rus:$E4;RSh:$C6;RCh:true ), // ;
(Ord: 56;Key:$DE;Eng:$27;ESh:$22;ECh:false;Rus:$FD;RSh:$DD;RCh:true ), // '
(Ord: 57;Key:$0D;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Enter

(* третий ряд букв ЯЧСМИТ *)
(Ord: 58;Key:$10;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Shift
(Ord: 59;Key:$5A;Eng:$7A;ESh:$5A;ECh:true ;Rus:$FF;RSh:$DF;RCh:true ), // Z
(Ord: 60;Key:$58;Eng:$78;ESh:$58;ECh:true ;Rus:$F7;RSh:$D7;RCh:true ), // X
(Ord: 61;Key:$43;Eng:$63;ESh:$43;ECh:true ;Rus:$F1;RSh:$D1;RCh:true ), // C
(Ord: 62;Key:$56;Eng:$76;ESh:$56;ECh:true ;Rus:$EC;RSh:$CC;RCh:true ), // V
(Ord: 63;Key:$42;Eng:$62;ESh:$42;ECh:true ;Rus:$E8;RSh:$C8;RCh:true ), // B
(Ord: 64;Key:$4E;Eng:$6E;ESh:$4E;ECh:true ;Rus:$F2;RSh:$D2;RCh:true ), // N
(Ord: 65;Key:$4D;Eng:$6D;ESh:$4D;ECh:true ;Rus:$FC;RSh:$DC;RCh:true ), // M
(Ord: 66;Key:$BC;Eng:$2C;ESh:$3C;ECh:false;Rus:$E1;RSh:$C1;RCh:true ), // ,
(Ord: 67;Key:$BE;Eng:$2E;ESh:$3E;ECh:false;Rus:$FE;RSh:$DE;RCh:true ), // .
(Ord: 68;Key:$BF;Eng:$2F;ESh:$3F;ECh:false;Rus:$2E;RSh:$2C;RCh:false), // /
(Ord: 69;Key:$10;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // ShiftR

(* нижний ряд клавиатуры *)
(Ord: 70;Key:$11;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Ctrl
(Ord: 71;Key:$5B;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Wnd
(Ord: 72;Key:$12;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Alt
(Ord: 73;Key:$20;Eng:$20;ESh:$20;ECh:false;Rus:$20;RSh:$20;RCh:false), // Space
(Ord: 74;Key:$12;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // AltR
(Ord: 75;Key:$5C;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // WndR
(Ord: 76;Key:$5D;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Menu
(Ord: 77;Key:$11;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // CtrlR

(* блок управляющих клавиш *)
(Ord: 78;Key:$2D;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Insert
(Ord: 79;Key:$24;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Home
(Ord: 80;Key:$21;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // PageUp
(Ord: 81;Key:$2E;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Delete
(Ord: 82;Key:$23;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // End
(Ord: 83;Key:$22;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // PageDown

(* стрелки *)
(Ord: 84;Key:$26;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Up
(Ord: 85;Key:$25;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Left
(Ord: 86;Key:$27;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Right
(Ord: 87;Key:$28;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // Down

(* цифровой блок *)
(Ord: 88;Key:$90;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // NumLock
(Ord: 89;Key:$6F;Eng:$2F;ESh:$2F;ECh:false;Rus:$2F;RSh:$2F;RCh:false), // /G
(Ord: 90;Key:$6A;Eng:$2A;ESh:$2A;ECh:false;Rus:$2A;RSh:$2A;RCh:false), // *G
(Ord: 91;Key:$6D;Eng:$2D;ESh:$2D;ECh:false;Rus:$2D;RSh:$2D;RCh:false), // -G
(Ord: 92;Key:$24;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // 7G (Home )
(Ord: 93;Key:$26;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // 8G (Up   )
(Ord: 94;Key:$21;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // 9G (PgUp )
(Ord: 95;Key:$6B;Eng:$2B;ESh:$2B;ECh:false;Rus:$2B;RSh:$2B;RCh:false), // +G
(Ord: 96;Key:$25;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // 4G (Left )
(Ord: 97;Key:$0C;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // 5G (     )
(Ord: 98;Key:$27;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // 6G (Right)
(Ord: 99;Key:$23;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // 1G (End  )
(Ord:100;Key:$28;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // 2G (Down )
(Ord:101;Key:$22;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // 3G (PgDn )
(Ord:102;Key:$2D;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // 0G (Ins  )
(Ord:103;Key:$2E;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // .G (Del  )
(Ord:104;Key:$0D;Eng:$00;ESh:$00;ECh:false;Rus:$00;RSh:$00;RCh:false), // EnterG

(*---------- вариант клавиш цифрового блока при включённом NumLock ---------------*)
(Ord:105;Key:$67;Eng:$37;ESh:$37;ECh:false;Rus:$37;RSh:$37;RCh:false), // 7G (Home )
(Ord:106;Key:$68;Eng:$38;ESh:$38;ECh:false;Rus:$38;RSh:$38;RCh:false), // 8G (Up   )
(Ord:107;Key:$69;Eng:$39;ESh:$39;ECh:false;Rus:$39;RSh:$39;RCh:false), // 9G (PgUp )
(Ord:108;Key:$64;Eng:$34;ESh:$34;ECh:false;Rus:$34;RSh:$34;RCh:false), // 4G (Left )
(Ord:109;Key:$65;Eng:$35;ESh:$35;ECh:false;Rus:$35;RSh:$35;RCh:false), // 5G (     )
(Ord:110;Key:$66;Eng:$36;ESh:$36;ECh:false;Rus:$36;RSh:$36;RCh:false), // 6G (Right)
(Ord:111;Key:$61;Eng:$31;ESh:$31;ECh:false;Rus:$31;RSh:$31;RCh:false), // 1G (End  )
(Ord:112;Key:$62;Eng:$32;ESh:$32;ECh:false;Rus:$32;RSh:$32;RCh:false), // 2G (Down )
(Ord:113;Key:$63;Eng:$33;ESh:$33;ECh:false;Rus:$33;RSh:$33;RCh:false), // 3G (PgDn )
(Ord:114;Key:$60;Eng:$30;ESh:$30;ECh:false;Rus:$30;RSh:$30;RCh:false), // 0G (Ins  )
(Ord:115;Key:$6E;Eng:$2E;ESh:$2E;ECh:false;Rus:$2E;RSh:$2E;RCh:false)  // .G (Del  )

    );

(*------------------------------  где-то далее в программе:

var ArrKeys : TArrKeys;
// массив клавиш, в котором индекс совпадает со значением поля Key

procedure ArrKeyInit;  // получить упорядоченный ArrKeys из исходного CArrKeys
var I,K : integer;
begin
  FillChar(ArrKeys,SizeOf(ArrKeys),#0); // незаполненные поля будут пустыми
  for I := 1 to MKeys do begin
    K := CArrKeys[I].Key;               // Код клавиши -> индекс
    ArrKeys[K] := CArrKeys[I];          // скопировать все поля!
  end;
end;


//==================================================
// набор функций, определяющих состояние клавиатуры
//==================================================

function QIsRus : boolean;  // Query: Is Russian Layout
var KL : HKL;               // HKL = type LongWord (Windows Unit)
begin
  KL := GetKeyboardLayout(0);
  Result := ((KL and $0000FFFF) = $0419)
end;

function QIsEng : boolean;  // Query: Is English Layout
var KL : HKL;
begin
  KL := GetKeyboardLayout(0);
  Result := ((KL and $0000FFFF) = $0409)
end;

function QIsCapsLock : boolean;  // Query: Is CapsLock On
begin Result := (GetKeyState(VK_CAPITAL) <> 0) end;


-------------------------------*)



Вернуться к теме программное стробирование
Вернуться к теме проект редактора SWE

(с) Можаровский С.Г. // mailto:mozharovskys@mail.ru // swHome page