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

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

감사합니다. -현록

후원해주실 분은 여기로→

현록의 기록저장소

단발성 US키보드 제거 본문

Programs/help

단발성 US키보드 제거

현록 2019. 12. 12. 19:15

[Programs/help] - 자꾸 생기는 US키보드 삭제, 제거

앞서서, 계속 부활하는 US키보드를 부팅시에 부활하지 않도록 막는 방법에 대한 포스트를 작성했었습니다.

(이 포스트는 단발적인 방법입니다. 먼저 위의 지속적인 방법을 보고 추가로 이 방법을 응용하시기 바랍니다.)

 

 

 

Windows 계정 상태와 상관없이,

특정 프로그램이 US키보드를 추가시키는 경우가 있습니다.

(특히, 외국에서 만든 프로그램들...)

설정에서 US키보드를 추가했다가 지우면 되긴하지만..;;

우리들은 그걸 하기 싫어서 방법을 찾고 있는 것이니;;

 

(해외에서 검색을 해도 아직까지는 제가 작성한 부활 방지법 정도밖에 나오질 않네요. 뿌리를 뽑고 싶은데..

MS 포럼 공식 답변 중에 Windows를 다시 설치하는 방법을 추천하는 걸 보고는 이게 말이야 방구야 싶기도 해요.)

 

빠르게 본론으로 돌아오면, 이 포스트에서는 원클릭으로 US키보드를 추가했다가 제거하는 바로가기를 생성합니다.

 


아래 파일을 받습니다.

(찝찝하시면) 메모장을 열어 아래의 코드를 직접 복사한 후, UTF-8 타입으로 xml 확장자로 저장해둡니다.

Remove_en-US.xml
0.00MB

<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">

    <!--User List-->
    <gs:UserList>
        <gs:User UserID="Current"/>
    </gs:UserList>

    <!--input preferences--> 
    <gs:InputPreferences>
        <!--add en-US keyboard input-->
        <gs:InputLanguageID Action="add" ID="0409:00000409"/>
        <!--remove en-US keyboard input-->
        <gs:InputLanguageID Action="remove" ID="0409:00000409"/>
    </gs:InputPreferences>

</gs:GlobalizationServices>

(0409:00000409가 궁금하신 분들은 여기로. https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/default-input-locales-for-windows-language-packs)

 

 

아래 파일도 받습니다.

(찝찝하시면) 메모장을 열어 아래의 코드를 직접 복사한 후, UTF-8 타입으로 bat 확장자로 저장해둡니다.

Remove_en-US.bat
0.00MB

@echo off
FOR /F %%I IN ("%0") DO SET CURRENTDIR=%%~dpI
control intl.cpl,, /f:"%CURRENTDIR%Remove_en-US.xml"

(xml 파일의 이름이 Remove_en-US.xml이 아니라면 xml 파일이든 내부든 수정해서 통일합니다.)

 

여기서는 관리자 권한으로 bat을 실행하지 않아도 됩니다(일반적인 실행으로 충분).

 

이것은 제 Windows 계정이 Administrator로 설정해두어서 그런 것일 수도 있으니,

본인의 로그온 계정이 Administrator가 아니고, 혹시나 그래서 안된다면,

위 bat의 코드 중 %CURRENTDIR% 대신 직접 xml 파일의 경로를 적어주세요. (2번째 줄 역시 필요없어집니다.)

그리고 bat을 관리자 권한으로 실행합니다. (관리자 권한도 당겨올 수 없다면, 계정 타입부터 변경하시고 진행;;)

(관리자 권한으로 실행은 bat이 현재주소가 아닌 system32 폴더에서 실행되므로, xml의 절대주소가 필요.)

 


 

이제 이걸 실행하면 1초 내로 US키보드를 추가했다 제거하면서 불필요한 IME를 날려줍니다.

 

Windows의 System32 내부의 control(제어판) - intl.cpl(국가 또는 지역)에

xml에 적어둔 설정을 토대로 작업을 진행시킵니다.

 

 

※ 단축프로그램 위치 등은 아래의 포스트를 참조하시면 됩니다.

[PC원격제어/help] - 원클릭 해상도 변경

 


Q. 왜 추가했다가 제거하나요?

 

A.

수동으로 이 작업을 해본 분들은 아시겠지만,

설정에 들어가면 영어 언어는 없는데, Microsoft 입력기에는 영어가 존재하면서 더 복잡하게 만드는 상황입니다.

 

유저 입장에서는 멀쩡하게 영어가 존재해서 한글 입력을 방해

(특히 풀스크린 모드 게임 등에서 한/영이 아니라 IME가 영어 고정인 줄도 모르고 gksrmfdl dkscuwudy..하는 분들이 겪는 불편함)하는 현상을 낳으면서

 

설정에 가면 영어가 없으니 복창이 터집니다.

(있는데! 존재하는데! 쓸 수 있는데!(쓰고 싶지 않아!) 왜 없냐구!!! 라는 상황ㅋㅋ)

 

방법은 역시, 영어를 추가했다가 제거하라는 뚜껑 열리는 소리ㅎ

 

Powershell에 명령어(Get-WinUserLanguageList)를 통해 본 작업을 수행하려고 해도,

Get-WinUserLanguageList 에도 영어는 안 떠줘서, 이걸 토대로 작업도 불가능.

(이 방법은 UI 말고도 설정에도 제대로 영어가 존재하는 상태라서, 지우기만 하면 되는 상황에서 사용되는 방법.)

 

결국, UI를 강제로 수정하는 방법을 모르니(당연히 불안하기도 하고),

우리는 추가했다가 지우는걸 한 세트로 사용합니다.


아래는 US 키보드 현상의 연구 상태를 공유합니다.

더보기

US 키보드 제거로 많은 분들이 방문하셔서 팁을 얻고 가고 계십니다.

 

US 키보드는 두 가지 형태로 좀비처럼 부활하고 있습니다.

1. 부팅할 때마다 (본 포스트 내용으로 해결)

2. 어떤 프로그램을 실행할 때마다 (바로 위에 단발성 제거 링크로 해결)

 

두 가지 형태의 차이점은,

1은 Windows 계정 설정과 관련된 사항으로 보이고,

2는 실행한 프로그램과 관련된 사항으로 보입니다.

특히, 2의 경우 거의 다 어떤 키보드 동작 내용이 필요한 프로그램이었습니다.

    원격 제어 프로그램이나 게임(스팀 게임, 피파, ...) 등이었습니다.

 

 

 

아예 컴퓨터의 레지스트리의 모든 값을 내보낸 후,

어떤 프로그램을 실행되게 하여 US 키보드가 생긴 상태에서 레지스트리의 모든 값을 내보내고,

두 파일의 값을 비교해봤습니다.

 

우선,

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Input\Locales\loc_0409\InputMethods\1]

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Input\Locales\loc_0409\InputMethods\1]

Enabled가 각각 0에서 1로 변하더군요.

이 곳을 강제로 권한을 막아서 0으로 고정되게 해봤습니다만,

값이 0인채 여전히 US 키보드가 생겼습니다.

이건 위험하니, 다시 권한을 복구시켰습니다.

 

그리고, 이건 프로그램마다 다를텐데,

[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\KeyboardClass]

[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\PointerClass]

프로그램 실행시마다

클래스가 하나씩 늘어났습니다.

저는 원격 프로그램인 Moonlight를 실행하면서 비교한 것인데,

원격 프로그램은 키보드나 마우스를 위한 가상 장치를 설정하는 것이 많으니, 그런 것일지도 모르겠습니다.

(얘가 키보드를 건드려서 부활되고 있는 것으로 보입니다.)

강제로 추가되지 못하도록 하기엔 리스크가 너무 크니 손 쓰지 않았습니다.

 

그리고,

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Notifications\Data]

에서도 값이 변하는 곳이 있었습니다.

우측 하단 IME 아이콘과 관련된 곳일 것 같은데,

HEX값이라 임의로 건드리기도 위험하니,

(고정시키기엔 다른 곳에도 영향을 받는 부분이라)

알아도 손 쓸 수 없다고 봐야겠네요.

 

그 외에도 프로그램에 따라 오디오 설정 등도 함께 되었기 때문에

다른 차이점도 있지만,

비교적 관련 없는 곳 같아서 다 적지는 않겠습니다.

 

 

 

그리고 문득 이런 의문이 들었습니다.

US 키보드 사태는 아예 막을 수 없는게 아닐까?

(Windows 개발자가 아닌, 일반 유저의 입장에서는)

 

위에서 구분지은 부활 상황 중,

1은 Windows 업데이트와 관련된 사항이라, 뭔가 찌꺼기 설정값이 남아있어서 그럴 수 있다고 생각했는데,

2는 그냥 프로그램이 실행 전에 키보드의 입력상태를 점검하거나,

    본 프로그램을 위해 키보드의 설정을 세팅하는 것만으로 생겨나고 있습니다.

특히, 2의 상황은, 설치시에 US 키보드를 설정하지 않았던 분들도 나타나는 것으로 보입니다.

즉, 2의 상황은, 유저가 어떤 원인을 찾아서 봉쇄할 수 없이, 그냥 발생해버리고 마는 것...

(en-US인 분들은 전혀 체감이 안될테고...)

 

즉석 바로가기로 키보드를 제거할 수 있는 방법도 마련해뒀지만,

저처럼 근본 원인을 찾는 분들도 계셔서 연구 상황을 올립니다.

 

 

 

이제 아래의 실험단계를 진행했습니다.

1. 가상 머신으로 Windows 10을 설치한다.

2. 설치시 초반 단계에서 키보드 레이아웃 설정 직전에 그 상태를 본뜬다.

3. US 키보드를 설정하지 않은채 진행하고, 레지스트리 전체 값(1)을 내보낸 후, 가상머신 밖으로 보존해둔다.

4. 재부팅 후, 레지스트리 전체 값(2)을 내보낸 후, 가상머신 밖으로 보존해둔다.

5. 언어 설정에서 직접 US 키보드를 추가하고, 레지스트리 전체 값(3)을 내보낸 후, 가상머신 밖으로 보존해둔다.

6. 재부팅 후, 레지스트리 전체 값(4)을 내보낸 후, 가상머신 밖으로 보존해둔다.

7. 직접 US 키보드를 제거하고, 레지스트리 전체 값(5)을 내보낸 후, 가상머신 밖으로 보존해둔다.

8. 재부팅 후, 레지스트리 전체 값(6)을 내보낸 후, 가상머신 밖으로 보존해둔다.

9. 2에서 본뜬 단계로 돌아간다.

10. US 키보드를 두번째 레이아웃으로 설정하고, 레지스트리 전체 값(7)을 내보낸 후, 가상머신 밖으로 보존해둔다.

11. 재부팅 후, 레지스트리 전체 값(8)을 내보낸 후, 가상머신 밖으로 보존해둔다.

12. 직접 US 키보드를 제거하고, 레지스트리 전체 값(9)을 내보낸 후, 가상머신 밖으로 보존해둔다.

13. 재부팅 후, 레지스트리 전체 값(10)을 내보낸 후, 가상머신 밖으로 보존해둔다.

 

이 10개의 레지스트리 전체 값을 비교해본다.

(비교는 WinMerge로 진행)

(1)완전 말끔한 단계

(2)완전 말끔한 단계 + 재부팅

(3)직접 추가한 단계

(4)직접 추가한 단계 + 재부팅

(5)직접 추가했지만, 직접 제거한 단계

(6)직접 추가했지만, 직접 제거한 단계 + 재부팅

(7)초반에 설정을 해둔 단계

(8)초반에 설정을 해둔 단계 + 재부팅

(9)초반에 설정했지만, 직접 제거한 단계

(10)초반에 설정했지만, 직접 제거한 단계 + 재부팅

 

(1-2)로 재부팅시 뭔가 fix하는게 있는지 확인

(3-4)로 재부팅시 뭔가 fix하는게 있는지 확인

(5-6)로 재부팅시 뭔가 fix하는게 있는지 확인

(7-8)로 재부팅시 뭔가 fix하는게 있는지 확인

(9-10)로 재부팅시 뭔가 fix하는게 있는지 확인

 

(2-4)로 직접 추가했을 때 무엇들이 바뀌는지 확인

(4-6)로 직접 제거했을 때 무엇들이 바뀌는지 확인

(2-6)로 말끔할 때와 직접 추가 후 제거했을 때 깔끔하게 제거되는지, 남는게 있는지 확인

 

(8-10)로 첫 설정 후 직접 제거했을 때 무엇들이 바뀌는지 확인

 

(2-8)로 첫 설정시와 말끔할 때의 차이를 확인

(4-8)로 첫 설정시와 직접 추가했을 때의 차이를 확인

(6-10)로 첫 설정 후 제거와, 직접 추가 후 제거의 차이를 확인

 

 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SystemProtectedUserData\*\AnyoneRead\LanguageProfile]

에서,

"Profile"의 값에 en-US 및 몇몇 문자열이 끼어들어감.

조심스럽게 없던 상태처럼 SYSTEM 권한으로 수정했으나, 2의 현상은 막지 못함.

(부팅시 방지법 포스트에서 찌꺼기 관련하여 따로 기술함)

 

[HKEY_CURRENT_USER\Software\Microsoft\CTF\SortOrder\AssemblyItem\0x00000409]

혹은 전체로 보면

[HKEY_USERS\*\Software\Microsoft\CTF\SortOrder\AssemblyItem\0x00000409]

이 생겨남.

통째로 지워도, en-US를 추가했다가 지울 때마다 생겨져있음.

(추가할 때 생겨나고, 지울 때 지워지지 않음)

 

그 외 생기는 값들은 지울 때 착실히 지워졌음.

 

 

제가 내리는 결론은,

2의 현상을 막을 근본적인 해결책은 없고(찌꺼기 값으로 인한 것이 아님),

그냥 해당 프로그램이 어떻게 입력기기를 훑는지는 몰라도

개발자가 그 방식을 바꾸지 않는 한 피할 수 없는 것으로 생각됨.

(그냥 단발성 제거 바로가기를 애용해야할 듯...)

 

 

 

혹시 연구를 더 해보실 분들을 위해 파일을 공유합니다.

1~10.reg은 위에서 설명한 상태의 레지스트리 내보내기 전체값들이고,

01.reg는 말끔한 상태에서 언어 추가 직전

02.reg는 말끔한 상태에서 언어 추가시 모든 항목 선택(언어팩 포함)하여 설치한 상태

03.reg는 말끔한 상태에서 언어 추가시 최소한의 항목만으로 설치한 상태

입니다.

Registry.7z.001
10.00MB
Registry.7z.002
10.00MB
Registry.7z.003
10.00MB
Registry.7z.004
10.00MB
Registry.7z.005
10.00MB
Registry.7z.006
10.00MB
Registry.7z.007
10.00MB
Registry.7z.008
10.00MB
Registry.7z.009
10.00MB
Registry.7z.010
7.62MB

확장자를 txt로 바꾸셔서 사용하시는걸 추천.

(괜히 실행돼서 레지스트리에 값을 쓰지 않도록)

 

 

Comments

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

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

감사합니다. -현록

후원해주실 분은 여기로→