-
[WinAPI] Alt키 제어하기 (WM_SYSCOMMAND)C++/미분류 2024. 6. 18. 16:46
지난 Direct2D글에서 점프를 구현했고, 해당 기능을 Alt키에 할당했습니다.
[Direct2D] 점프 구현
하지만 방향키와 Alt키를 동시에 조작할 경우 정상적으로 조작이 되지 않을 수 있습니다.
이는 버그가 아니라 기능으로, Alt키는 기본적으로 메뉴 탭을 활성화하는 기능이 있습니다.
해당 기능은 정상적인 조작에 악영향을 끼치므로, 해당 기능을 제거해보도록 하겠습니다.
이번 글에서는 Alt키의 기본 기능을 핸들링하는 방법을 살펴보도록 하겠습니다.
이번 글은 지난 글에서 코드가 이어집니다.
1. Alt키 메시지 살펴보기
더보기키보드 입력은 기본적으로 WM_KEYDOWN, KEYUP메시지를 전달합니다.
하지만 Alt키는 입력 시 일반적인 키보드 입력과는 다른 메시지를 전달합니다.
Alt키 뿐만 아니라 F10키도 이와 같이 특수한 메시지를 전달하며, 그 메시지는 WM_SYSKEY메시지 입니다.
코드로 살펴보도록 하겠습니다.
// Window Procedure LRESULT MyApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { ... switch(message) { case WM_SYSKEYDOWN: case WM_SYSKEYUP: switch (wParam) { case VK_MENU: if (lParam & 0x80000000) std::cout << "Alt Up\n"; else std::cout << "Alt Down\n"; break; } result = 0; wasHandled = true; break; } ... }
Alt와 같은 시스템 키 메시지의 핸들링은 위와 같이 할 수 있습니다.
이와 별개로, Alt키는 입력 시 추가적인 메시지를 전달합니다.
WM_SYSCOMMAND메시지가 전달되며, 파라미터에 메뉴 탭을 활성화시키는 SC_KEYMENU가 전달됩니다.
SYSCOMMAND메시지는 키 입력 외에, 여러 시스템 명령을 전달하는 메시지입니다.
창을 닫는 SC_CLOSE, 창을 최대화, 최소화 하는 SC_MAXIMIZE및 MINIMIZE 등의 메시지가 있습니다.
SYSCOMMAND메시지의 여러 파라미터에 관한 내용은 아래 MSDN에 자세하게 기술되어 있습니다.
WM_SYSCOMMAND message (Winuser.h) - Win32 apps | Microsoft Learn
2. Alt 메시지 무효화하기
더보기이전 문단에서 WM_SYSCOMMAND메시지가 원인임을 알 수 있었습니다.
따라서, SYSCOMMAND메시지에 MENU가 전달될 때의 처리 방법을 수정하는 방법을 생각해볼 수 있습니다.
코드는 다음과 같습니다.
// Window Procedure LRESULT MyApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { ... switch(message) { case WM_SYSCOMMAND: switch (wParam) { case SC_KEYMENU: result = 0; wasHandled = true; break; } break; } ... }
위와 같이, KEYMENU메시지에 대해 아무런 처리도 하지 않을 경우, 메뉴 탭이 활성화 되지 않습니다.
그 외의 다른 메시지는 기본 처리를 할 수 있도록 wasHandled 플래그를 수정하지 않습니다.
시스템 메시지를 핸들링하는 방법에 대해 살펴보았습니다.
이번 글에서 사용된 코드의 전문은 아래 Github에서 확인하실 수 있습니다.
이번 글이 도움이 되셨기를 바랍니다.
감사합니다.
'C++ > 미분류' 카테고리의 다른 글
[Direct2D] 점프 구현 (1) 2024.06.13 [Direct2D] 충돌 및 지형 구현 (0) 2024.05.31 [Direct2D] 등속 운동, 등가속 운동, 중력 구현 (0) 2024.05.17 [Direct2D] ID2D1Effect : Chroma key (1) 2024.04.22 [Direct2D] ID2D1Effect : Edge detection (0) 2024.04.17