2016년 6월 2일 목요일

Windows 왼손 마우스 사용을 위한 키보드 매핑조정(오른쪽 '한/영'키 + 오른쪽 Ctrl키 사용)

드디오 올것이 왔습니다.
오른손이 말을 안듣고 마우스를 사용할때마다 아픕니다.
그래서 마우스를 왼손으로 사용해야하는 상황이 되었습니다.

마우스 왼손사용을 하려다 보면 오른쪽의 Ctrl 키를 사용하여야 하는 필요가 생깁니다.
왜냐면 에디터의 편집 단축키가 다음과 같이 사용될 수 있기 때문입니다.
또한 마우스 왼손 조작시에 Ctrl를 같이 조작할 필요가 있을때가 있는데 이때 왼쪽의 Ctrl을 오른손으로 조작하기가 힘듭니다.

복사(Copy) : Ctrl+C, Ctrl+Insert
붙여넣기(Paste) : Ctrl+V, Shift+Insert
잘라내기(Cut) :  Ctrl+X, Shift+Delete

단축키의 Shift는 오른쪽 Shift키를 쓰면됩니다. 대부분 마우스에서 오른쪽 Shift키의 크기는 상당히 크게되어 있습니다.
그러나 오른쪽 Ctrl키는 대체로 '한자'키에 매핑되어 있습니다.

'한자'키로 사용되는 오른쪽 Ctrl의 기능을 되돌리는 방법은 두가지 입니다.
1. 키보드 드라이버를 바꿔서 오른쪽 Ctrl키를 '한자'키로 사용하지 않는 설정(USB Type3)으로 바꾼다.
2. 키보드 리매핑을 하여 오른쪽 Ctrl키의 매핑을 왼쪽 Ctrl 키로 매핑한다.

1,2번 모두 Windows 레지스트리를 변경하는 작업으로 합니다.
또한 노트북에 키보드를 붙여 쓰는 경우에 노트북 내장 키보드와 추가로 장착한 USB키보드모두 적용됩니다.
또한 공용으로 사용하는 컴퓨터라면 기존의 키보드 매핑을 바꾸는것은 사용자간에 동의가 있어야 할 것입니다.

1번을 적용할 경우 '한/영'은 Shift+Space, '한자'는 Ctrl+Space로 매핑이 바뀝니다.
그래서 오른쪽 Ctrl키를 본래의 기능대로 사용할 수 있게 됩니다.
그러나 이게 좀 불편할 수 있습니다. 과거에 아래아 한글을 쓰던 사람은 쉽게 적응이 되지만 습관적으로 스페이스바 옆에 있는 ALT키를 '한/영'키로 쓰던 사람에게는 재앙이 됩니다.
또한 노트북에 키보드를 붙여서 사용하는 사용자의 경우에는 노트북의 '한/영'버튼이 ALT키로 되므로 좀 불편할 수도 있습니다.
일부 노트북에서는 오른쪽 ALT외에 '한/영'버튼이 있는 경우에는 큰 문제가 안될것입니다.

1번으로 적용할 경우 또하나의 문제는 VMware를 쓸때 게스트에서는 매핑이 되지 않아서 게스트 컴퓨터에서는 계속 오른쪽 Ctrl키가 '한자'키로 계속 남아 있다는 것입니다.
게스트 컴퓨터의 매핑도 바꿔줘야 합니다.

2번으로 적용하면 '한자'키의 사용이 왼쪽 Ctrl로 바뀝니다.
VMware 게스트의 매핑문제는 생기지 않고 VMware 게스트에서도 '한자'키가 오른쪽 Ctrl키 매핑이 바뀌어서 적용됩니다.
다만 '한자'키를 사용할 수 없는 단점이 생깁니다. 따라서 2번으로 적용할때는 사용빈도가 낮은 다른 키의 매핑을 '한자'로 추가해줘야 합니다. '한자'키 사용빈도가 높은 사람은 적용하기 힘듭니다.

단점이 있기는 하지만 오른쪽 Ctrl만 본래 기능으로 돌리는 작업을 보여 드리겠습니다.

결과는 오른쪽 ALT는 '한/영'으로 계속사용하고 오른쪽 Ctrl만 '한자'에서 Ctrl의 본래 기능으로 되돌립니다.
우선 오른쪽 ALT를 '한/영'으로 사용하는 키보드 드라이버를 적용합니다.
관리자 권한의 명령창에서는 아래를 차례로 입력하면 됩니다.

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters" /v "LayerDriver KOR" /t REG_SZ /d "kbd101a.dll" /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters" /v "OverrideKeyboardIdentifier" /t REG_SZ /d "PCAT_101AKEY" /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters" /v "OverrideKeyboardType" /t REG_DWORD /d "8" /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters" /v "OverrideKeyboardSubtype" /t REG_DWORD /d "3" /f

만일 이미 "한글 101키 USB Type1"을 사용하고 있는 중이라면 이 과정은 할 필요가 없습니다.
Windows 10이라면 아래와 같이 되어 있으면 됩니다.
XP및 Win7,8에서는 약간 다르겠지만 아마 특별히 손대지 않았다면 "한글 101키 USB Type1"을 사용하고 계실것입니다.


"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters"

이제 키 매핑을 바꿉니다.
다음 오른쪽 Ctrl을 왼쪽 Ctrl로 매핑합니다.
이 명령을 실행하려면 관리자 권한의 콘솔에서 해야합니다.

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout" /v "Scancode Map" /t REG_BINARY /d "0000000000000000020000001D001DE000000000" /f

매핑의 의미는 오른쪽 Ctrl키(E01D)를 왼쪽 Ctrl(001D)로 매핑하는것입니다.

"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout\Scancode Map" 레지스트리 키는 본래 존재 하지 않습니다.
위 명령을 사용하면 추가 됩니다.

매핑을 취소하여 원위치 하려면 다음과 같이 합니다.
reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout" /v "Scancode Map" /f

매핑된 내용을 보려면 다음과 같이 합니다.
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout" /v "Scancode Map"

이러한 일을 좀더 쉽게하는 KeyTweak이라는 프로그램이 있는데

프로그램 실행창은 아래와 같이 생겼습니다.
프로그램 메인 창의 "Show Me The Raw Map"버튼을 누르면 매핑의 자세한 내용이 설명되어 나옵니다.
앞에서 등록한 레지스트리를 등록한 상태로 보면 아래와 같이 보입니다.

이 프로그램을 사용하셔도 편리하게 같은 일을 할 수 있습니다.

2016년 1월 11일 월요일

Windows에서 일반 실행 프로그램을 서비스로 실행하기

윈도우즈에서 서비스로 실행할 수 있는 프로그램은 특별한 요구사항을 준수해서 작성해야 합니다. 윈도우즈 서비스용 실행을 고려하지 않은 프로그램은 윈도우즈 서비스로 실행할 수 없습니다.
그런데 일반 프로그램을 서비스로 실행할 필요가 생길때가 있습니다.

1. 컴퓨터를 켜면 로그온을 하지 않을때도 일반 프로그램을 실행시켜 두어야 할때.
2. GNU툴과 같이 Windows를 특정하여 작성하지 않은 서버 프로그램을 서비스로 실행할때.
3. Java, .net와 같은 플랫폼 실행 프로그램을 서비스로 실행할때.

이를 해결하는 다양한 접근이 있습니다.
대개 서버를 구축하는 apache에서 이같은 문제를 해결하기위한 다양한 접근이 있고, Java와 연관된 작업을 하는곳에서도 비슷한 문제에 대해 다양한 해결법을 내놓고 있습니다.

Wiki에 Service Wrapper를 검색하시면 몇가지 전용도구를 통해서도 접근하는 방법을 설명하고 있습니다.

여기서는 윈도우즈에서 제3자의 설치파일 없이 사용하는 방법에 대해서 설명합니다.
두가지로 접근합니다.

1. "cmd /K start"와 같은 방식으로 서비스 프로그램을 등록하여 실행하는법
2. "svrany.exe"를 사용하여 서비스 프로그램을 등록하는법


1. "cmd /K start"를 아용하는 아이디어

"cmd /K start"를 사용하는 방법의 아이디어는 이렇습니다.
윈도우즈의 서비스 관리는 서비스가 시작할때 프로그램이 스스로 종료하면 기동이 안됩니다. 따라서 서비스 실행이미지가 종료하지 않도록 해줘야 합니다.
"cmd /K"는 명령어 실행창을 실행시키되 종료하지 않도록 합니다.
그다음 "start" 명령을 사용해서 실제 프로그램 이미지를 실행하는것입니다.
예제는 다음과 같습니다.

sc create MyServiceName type= own type= interact start= auto error= ignore binpath= "cmd /K start MyServiceProgram.exe"

이렇게 하면 윈도우즈 서비스 관리자는 서비스용 실행이미지가 "cmd"로 알게 되겠지만 실제는 "MyServiceProgram.exe"를 실행하는것입니다.
"MyServiceProgram.exe"를 실행할대는 Full-Path로 써줘야 합니다.

이 방식의 단점은 윈도우즈 서비스 관리자에서 실행할때 1053에러가 뜬다는점입니다.
그 이유는 "cmd"프로그램 자체도 윈도우즈 서비스용 프로그램이 아니라는 점 때문입니다.
그러나 어쨋든 서비스 관리자를 통해서 프로그램은 서비스로 실행할 수 있기 때문에 사용할 수는 있습니다.
대개 해커들이 백도어를 실행할때 주로 쓰는 방법입니다.

2. "svrany.exe"를 이용하는 방법

"svrany.exe"를 사용하는것은 MSDN에 나와있는 방법입니다.

MSDN의 링크는 다음과 같습니다.

설명할 방법의 요약에 대한 링크는 다음과 같습니다.

you tube에도 동영상이 있습니다.

이 실행파일은 "Windows Server 2003 Resource Kit Tools"에 포함되어 있습니다.
다운로드 링크는 아래와 같습니다.


sc를 이용해서 서비스를 등록하되 서비스용 실행 이미지는 "svrany.exe"를 단순히 실행하도록 합니다.
"svrany.exe"는 실행직후에 Windows의 레지스트리를 읽어서 서비스를 기동하는 방식입니다.
따라서 특정위치의 레지스트리에 서비스 실행 파일/옵션/실행폴더를 지정하면됩니다.

"svrany.exe"를 서비스로 등록하는 방법은 아래와 같습니다.

sc create MyServiceName type= own start= auto error= ignore binpath= "C:\Program Files\Windows Resource Kits\Tools\srvany.exe"

만일 "svrany.exe" 를 리소스킷에서 추출하여 분리하셨다면 추출하여 분리한 폴더의 절대위치를 포함해서 지정하면됩니다.
그리고 다음과 같이 레지스트리를 등록합니다.

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceName\Parameters" /v "Application" /t REG_SZ /d  "프로그램 실행 이미지 절대위치" /f
reg add 

"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceName\Parameters" /v "AppParameters" /t REG_SZ /d "프로그램 실행 옵션" /f

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceName\Parameters" /v "AppDirectory" /t REG_SZ /d "프로그램 실행 폴더 절대위치" /f

명령행이 귀찮으시면 regedit로 등록해도 됩니다.
sc 를 통해서 MyServiceName를 등독하시고 나면 아래와 같은 레지스트리가 만들어져 있을것입니다.

"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceName"

이 아래에 "Parameters"추가하고 그 아래에 "Application", "AppParameters", "AppDirectory"를 추가한뒤 REG_SZ 타입으로 만들어서 지정하면 됩니다.

"svrany.exe"를 사용하는 방법은 완벽하게 작동하지만 문제가 있습니다.
대부분 백신프로그램이나 보안 프로그램이 "svrany.exe"를 보안에 위험한 프로그램으로 분류하고 문제가 있다는 보고를 한다는 것입니다.
때문에 보안성이 강화된 설정에서는 사용하는데 어려움이 있을 수 있습니다.