잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).

여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.

감사합니다. -현록

후원해주실 분은 여기로→

현록의 기록저장소

키보드 키 강제 치환과 키 코드 본문

Programs/help

키보드 키 강제 치환과 키 코드

현록 2020. 3. 4. 00:59

https://ydeer.tistory.com/170

에서 키보드의 키와 키 신호에 대해 잠시 언급했던 적이 있습니다.

하드웨어에서 발생시키는 신호에 맞게 OS가 동작해주는 것이죠.

 

이런 키는, 키 신호를 판독하여

프로그램으로 키를 맵핑할 수도 있고,

OS단에서 키를 치환할 수도 있습니다.

 

프로그램장점은 프로그램을 끄면 그만인 점.

단점은 사용할 곳에 따라 그에 맞는 권한으로 잘 실행시켜야한다는 점,

더 상위권한의 프로그램이 더 우선권을 가질 수 있다는 점.

 

OS단에서의 강제 치환의 장점은,

컴퓨터가 켜질 때에 최상위 우선권으로 고정된다는 점.

단점은 설정을 변경하고 재부팅까지 해야 적용된다는 점.

 

전 프로그램으로 키를 다루는 것을 추천하지만,

사람 일은 모르니, 강제 치환시키는 법도 소개합니다.

 


레지스트리에 값을 등록시켜서 강제로 치환할겁니다.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]

의 경로에 설정합니다.

 

여기에 Scancode Map 이라는 이름의 Hex 값을 추가할 것입니다.

직접 regedit으로 설정해도 되겠지만,

Hex값을 조금 귀찮게 다뤄야하기 때문에, .reg 파일을 만들어서 등록/수정하고 삭제할겁니다.

 


링크 아래부터는 코드의 이론적인 설명 부분입니다.

실제 코드는 여기에서 자동으로 생성할 수 있습니다.

https://blackdeery.github.io/scmap/

 

Windows 강제 키 치환 reg 생성기

현록_Blackdeer

blackdeery.github.io

 


 

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,\
                   00,00,00,00,\
                   02,00,00,00,\
                   F2,E0,52,E0,\
                   00,00,00,00

이제 아래 부분의 설명입니다.

"Scancode Map"=hex:00,00,00,00,\    #1

                   00,00,00,00,\    #2

                   03,00,00,00,\    #3

                   F2,E0,52,E0,\    #4

                   F1,E0,53,E0,\    #5

                   00,00,00,00      #6

ㆁ#1과 #2의 00,00,00,00들은 항상 고정되는 패턴입니다.

ㆁ#3의 03은, 쉽게 설명하면 이 아래의 줄 수를 적으면 됩니다.

 *이 아래로 3개의 줄이 있으니, 03을 적으면 됩니다.

 *Hex값으로 적어야하니, 16진수로 적습니다.

 *키 치환을 그렇게나 많이할까 싶지만,

  255(FF)개를 넘으면, 오른쪽으로 증가하면 될 것 같습니다.

  (FF,00,00,00→00,01,00,00→01,01,00,00→02,01,00,00→...)

ㆁ#4와 #5는 각각 실제 치환에 관한 내용입니다.

 *#4를 보면, 으로 바꾸겠다는의미입니다.

 *#5를 보면, 으로 바꾸겠다는의미입니다.

 *즉, 오른쪽 키를 왼쪽 키로 사용하겠다는 의미입니다.

 *여기에 사용할 값은 아래에 표로 제공합니다.

 *예시의 내용은 이렇습니다.

  ㆍInsert키한/영키로 사용

  ㆍDelete키한자키로 사용

ㆁ#6을 보면, 마지막 줄은 항상 00,00,00,00으로 끝납니다.

 

 

이 양식으로 메모장에 붙여넣고

---.reg 파일로 저장한 후, 실행하면 됩니다.

 

 

.reg 파일을 실행하면 덮어씌워버리므로 해당 방법으로 수정하시면 됩니다.

 

 

모든 Scancode Map 값을 날려버리고 싶다면,

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=-

로, =- 를 주면 됩니다.

 


아래는 키 신호레지스트리에 사용할 값을 적어둔 것입니다.

바이트 단위(16진수 두 글자)로 순서가 바뀐 것은,

데스크탑 메모리 주소가 little endian으로 정렬되기 때문이고,

(개발자가 아니라면 큰 신경 쓸 필요는 없습니다)

SC가 01--인데, --,01이 아닌, --,E0가 되는 이유는 저도 모르겠습니다.

동일한 SC는 여러개 존재할 수 있는데, 실제 하드웨어에 사용하는 키 신호로 정하는 것인지..

키 종류

Scan Code(SC)

Virtual Key(VK)

레지스트리에

사용할 값

마우스 LButton

-

01

-

마우스 RButton

-

02

-

마우스 MButton

-

04

-

마우스 Xbutton1

-

05

-

마우스 XButton2

-

06

-

Esc

0001

1B

01,00

F1

003B

70

3B,00

F2

003C

71

3C,00

F3

003D

72

3D,00

F4

003E

73

3E,00

F5

003F

74

3F,00

F6

0040

75

40,00

F7

0041

76

41,00

F8

0042

77

42,00

F9

0043

78

43,00

F10

0044

79

44,00

F11

0057

7A

57,00

F12

0058

7B

58,00

Tab

000F

09

0F,00

Enter

001C

0D

1C,00

Backspace

000E

08

0E,00

Space

0039

20

39,00

CapsLock

003A

14

3A,00

LShift

002A

A0

2A,00

RShift

0036

A1

36,00

LAlt

0038

A4

38,00

RAlt

0138

A5

38,E0

LCtrl

001D

A2

1D,00

RCtrl

011D

A3

1D,E0

LWin

015B

5B

5B,E0

RWin

015C

5C

5C,E0

AppsKey

015D

5D

5D,E0

한/영

01F2

15

F2,E0

한자

01F1

19

F1,E0

101키(종류1-2)에서의

RAlt/RCtrl을 치환한

한/영

0138

15

????

101키(종류1-2)에서의

RAlt/RCtrl을 치환한

한자

011D

19

????

101키(종류3)에서의

Shift+Space로 호출하는

한/영

0039

15

????

101키(종류3)에서의

Ctrl+Space로 호출하는

한자

0039

19

????

Up(↑)

0148

26

48,E0

Left(←)

014B

25

4B,E0

Right(→)

014D

27

4D,E0

Down(↓)

0150

28

50,E0

Insert

0152

2D

52,E0

Delete

0153

2E

53,E0

Home

0147

24

47,E0

End

014F

23

4F,E0

PageUp

0149

21

49,E0

PageDown

0151

22

51,E0

NumLock

0145

90

45,E0

Numpad0

0052

60

52,00

Numpad1

004F

61

4F,00

Numpad2

0050

62

50,00

Numpad3

0051

63

51,00

Numpad4

004B

64

4B,00

Numpad5

004C

65

4C,00

Numpad6

004D

66

4D,00

Numpad7

0047

67

47,00

Numpad8

0048

68

48,00

Numpad9

0049

69

49,00

NumpadAdd(+)

004E

6B

4E,00

NumpadSub(-)

004A

6D

4A,00

NumpadMult(*)

0037

6A

37,00

NumpadDiv(/)

0135

6F

35,E0

NumpadDot(.)

0053

6E

53,00

NumpadEnter

011C

0D

1C,E0

PrintScreen

0137

2C

37,E0

ScrollLock

0046

91

46,00

Pause/Break

0045

13

45,00

`(~)

0029

C0

29,00

1

0002

31

02,00

2

0003

32

03,00

3

0004

33

04,00

4

0005

34

05,00

5

0006

35

06,00

6

0007

36

07,00

7

0008

37

08,00

8

0009

38

09,00

9

000A

39

0A,00

0

000B

30

0B,00

-

000C

BD

0C,00

=

000D

BB

0D,00

Q

0010

51

10,00

W

0011

57

11,00

E

0012

45

12,00

R

0013

52

13,00

T

0014

54

14,00

Y

0015

59

15,00

U

0016

55

16,00

I

0017

49

17,00

O

0018

4F

18,00

P

0019

50

19,00

[

001A

DB

1A,00

]

001B

DD

1B,00

\

002B

DC

2B,00

A

001E

41

1E,00

S

001F

53

1F,00

D

0020

44

20,00

F

0021

46

21,00

G

0022

47

22,00

H

0023

48

23,00

J

0024

4A

24,00

K

0025

4B

25,00

L

0026

4C

26,00

;

0027

BA

27,00

'

0028

DE

28,00

Z

002C

5A

2C,00

X

002D

58

2D,00

C

002E

43

2E,00

V

002F

56

2F,00

B

0030

42

30,00

N

0031

4E

31,00

M

0032

4D

32,00

Comma(,)

0033

BC

33,00

Dot(.)

0034

BE

34,00

/

0035

BF

35,00

키보드의 진짜 [한/영]과 [한자]는

하드웨어적으로 Down 신호만 발생시키고,

Up 신호는 발생시키지 않기 때문에,

이 키를 치환하게 되면, 키가 계속 눌려있게 될 수 있으니 치환용으로 적절하지 않습니다.

 

(이 키 치환하면 문제지만, 다른 키를 이 키 사용하는 것은 문제가 없습니다.

해당 키는 하드웨어에서 제대로 둘 다 신호가 발생할 것이기 때문.)

 

(101키 키보드의 [한/영]과 [한자]는 진짜가 아니라

RAlt와 RCtrl에 각인만 바꾼 것이니,

제대로 Down/Up 신호가 발생합니다.)

 

 

이 외의 키 코드에 대한 문서는 검색해보시길

https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

 

 

Comments

잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).

여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.

감사합니다. -현록

후원해주실 분은 여기로→