:: 진공에 대해 알려주마.

윈도우 Ctrl+Alt+Del 본문

카테고리 없음

윈도우 Ctrl+Alt+Del

하이백 2023. 2. 19. 22:52

요즘 고객사에서 설비 셋업 중이다. 

S사 혹은 L사등 업계에서는 안전을 최우선으로 강조하고 있다. (참고로 왜 아직도 S사, L사라고 부르는지 모르겠다.) 그러다 보니 설비 내부 작업에 대한 안전을 매우 까다롭게 관리한다.

설비 내부에 진입하는 경우에는 화면을 사용할 수 없어야 하며 도어키를 항상 소지하여야 한다. 펜던트만 사용해야 한다. 안전 관리자가 있어야 한다. 등 까다롭기 그지없다.

 

WINDOWS

 

PC 관련하여 구현해야 하는 기능도 여러 가지 있다. Teach key관련, Maint 화면 표시와 암호 설정, 그리고 Maint 화면 표시중 각종 윈도키를 막아야 한다. 이번에 이것 때문에 생각보다 많은 시간을 투자했다. 특히 Window10에서는 보안이 강화되어 윈도우 관련 기능을 제어가 쉽지가 않다.

설비 내부에 진입하기 위해서는 화면에 Maint 지정 화면을 표시하고 그 어떠한 키도 동작하면 안된다. 특히 윈도우키와 조합으로 동작하는 기능키를 무효화해야 한다. 윈도우 관련키를 무효화하는 경우는 생각보다 쉽게 구현하였다. 하지만 Ctrl+Alt+Del을 무효화는 쉽지가 않다. 

아래는 설비에 적용된 코드이다. 구글 여기저기서 뒤져 테스트하였으나 한 번에 적용되지 않아 몇 가지 추가 적용하여 결국 아래와 같이 적용하였다. 인터넷을 뒤져 보면 비슷한 코드가 너무 많아 출처를 표기하기에는......

 

HHOOK g_hKeyboardHook;

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
   if (nCode < 0 || nCode != HC_ACTION)
      return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
   auto p = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
   switch (nCode)
   {
   case HC_ACTION:
   {
      PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
         // CTRL+ESC
      if (p->vkCode == VK_ESCAPE && (GetAsyncKeyState(VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1)))
         return 1;
	  // ALT+F4
      if (p->vkCode == VK_F4 && p->flags & LLKHF_ALTDOWN)
         return 1;
	  // ALT+ESC
      if (p->vkCode == VK_ESCAPE && p->flags & LLKHF_ALTDOWN)
         return 1;
	  // ALT+TAB
      if (p->vkCode == VK_TAB && p->flags & LLKHF_ALTDOWN)
         return 1;
	  // Left WINDOW KEY, Right WINDOW KEY
      if ((p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN))
         return 1;
   }
   default:
      break;
   }   
   return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
}

BOOL CDialogSafetyScreen::OnInitDialog()
{
   // 함수 정의 (OnInitDialog 함수에 추가) 
   g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(nullptr), 0);
}

void CDialogSafetyScreen::ProtectWinKey()
{
   // 윈도우키 비활성화
   g_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(nullptr), 0);
}

void CDialogSafetyScreen::ReleaseWinKey()
{
   // 윈도우키 복구
   UnhookWindowsHookEx(g_hKeyboardHook);
   g_hKeyboardHook = nullptr;
}

 

위의 코드를 잘 동작한다. 헤더 파일에 정의하고 OnInitDiallog()는 적당한 곳에 추가하면 된다. 그리고 ProtechWinKey()를 호출하면 해당 윈도우 키가 무효화된다. 해제하기 위해서는 ReleaseWinKey를 호출하면 된다.

 


 

그리고 어렵게 구현한 CAD(Ctrl+Alt+Del) 키의 무효화는 아래와 같다.

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,03,00,00,00,38,00,5B,E0,5B,E0,38,00,00,00,00,00

 위의 코드를 원하는 이름으로 저장하고 확장자를 .reg로 한다. 

이를 실행하면 윈도우 레지스트리 메시지 상자가 나타나며 계속하겠는지 묻는다. 이를 실행하고 PC를 재 부팅하면 CAD(Ctrl+Alt+Del) 키가 무효화된다. 

다시 이를 복구하지 위해서는 아래 코드를 저장하고 확장자를. reg로 하고 실행하면 된다. 그리고 PC를 재부팅 한다.

Windows Registry Editor Version 5.00

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

 

[추가내용]

하지만 위에서 구현한 기능은 약간의 문제가 있다. 위에서 설정한 레지스트리는 키보의 키값을 리맵핑(re-mapping)하는 방법이다. 특정키가 누르거나(key-down, make), 뗄 때(key-up, break) 이를 설정한 다른 키값으로 변경하여 전달하는 기능을 가진다.

위에서 예제로 든 것은 키보드의 left-window키와 left-alt키를 서로 치환한 예이다. 설정하면 alt키와 window키가 바뀌어 동작한다.

아래 사이트를 참고하시라.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=choo5160&logNo=220245213810
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=linuxchannel&logNo=221351543821

특정키를 키보드에 없는 키값으로 변경하면 해당 키는 사용하지 못하게 된다. 설정후 PC를 재부팅 해야 효과를 발생한다. 한번 설정후 쭉 사용할 키만 적용해야 할것이다. 이를 이용하여 CAD(Alt+Ctrl+Del)키를 막는데 응용하기 바란다. 

위의 레지스트리에 설정한 내용을 아래와 같이 자세히 적어본다. 다음과 같은 내용으로 선언하면 원하는 키를 다른 키로 변경할 수 있다.

위의 기능이 동작하지 않으면 키보드 마다 키값이 조금씩 달라서 생기는 문제일수 있다. 표준 101키 보드로 테스트 해 보기 바란다.

레지스트리에 선언된 아래 내용을 설명한다. 
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,38,00,5B,E0,5B,E0,38,00,00,00,00,00

Registry의 Scancode Map

 

Comments