본문 바로가기

업무 채널

[MFC] HotKey(핫키)를 사용하여 키보드 막기 예제소스

키보드나 마우스의 제한, 혹은 입력정보를 컨트롤(정보조작 등) 하기위해 메시지후킹을 많이 사용한다.

하지만 특정키에 대해 컨트롤 하기위해서는 WM_HOTKEY를 사용하는 것이 훨씬 간편하게 구현가능하며 이해하기도 쉽다.

 

그럼 프린트스크린 키(Print Screen Key)의 입력을 막는 프로그램의 소스를 살펴보자.

 

[MainFrm.cpp]

 

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}

if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}

// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);

m_nHotKeyPrint = ::GlobalAddAtom("PrintScreenKey"); //m_nHotKeyPrint 라는 HotKey ID를 생성한다. GlobalAddAtom() 함수는 문자를 수치로 변경하는 것 이라고 생각하면 된다. 해당ID의 중복을 막기위해 용이하게 사용할 수 있다.

RegisterHotKey(m_hWnd, m_nHotKeyPrint, 0, VK_SNAPSHOT); //레지스터에 핫키를 등록한다. 현재 소스는 VK_SNAPSHOT(프린트스크린 키) 등록하며 조합키를 등록하기 위해서는 세번째 인자를 MOD_ALT, MOD_CONTROL, MOD_SHIFT 등을 입력하여 사용 가능하다.
TRACE("OnCreate::RegisterHotKey \n");

return 0;
}

 

void CMainFrame::OnDestroy()
{
CFrameWnd::OnDestroy();

// TODO: Add your message handler code here
UnregisterHotKey(m_hWnd, m_nHotKeyPrint); //종료시 등록된 m_nHotKeyPrint를 제거한다.
TRACE("OnDestroy:UnregisterHotKey \n");
}

 

LRESULT CMainFrame::OnHotKey(WPARAM wp, LPARAM)
{
UNREFERENCED_PARAMETER(wp);
MessageBox("Can not use the Print Screen key."); //등록한 핫키 입력시 수행할 작업 입력한다.
return 0; // ignore
}

 

 

HotKey.zip

예제의 프린트스크린 키(Print Screen Key)의 입력을 막는 프로그램을 첨부한다.