WPF 프로젝트 진행 중 필요에 의해 만들게 된 한/영 가상 키보드입니다.
키 이벤트 발생은 Windows Input Simulator 를 사용하였고 XP에서는 한글 조합이 되지 않는 경우가 발생하여 키보드와 마우스를 훅킹하여 특정 이벤트에 대한 예외처리를 하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | private static IntPtr KeyboardProc( int nCode, IntPtr wParam, IntPtr lParam) { if (nCode == Win32Api.HC_ACTION) { uint wParamValue = ( uint )wParam; long lParamValue = ( long )lParam; // 229 ( 0xE5 ) : VK_PROCESSKEY ( IME PROCESS key ) if ((wParamValue == 229 && lParamValue == -2147483647) || (wParamValue == 229 && lParamValue == -2147483648)) { if (IsHookingArea()) { return (IntPtr)1; } } } return Win32Api.CallNextHookEx(_keyboardId, nCode, wParam, lParam); } private static IntPtr MouseProc( int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0) { _mouseParam = (Win32Api.MOUSEHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof (Win32Api.MOUSEHOOKSTRUCT)); var mouseMessage = (Win32Api.MouseMessages)wParam; if (UseGlobal) { if (mouseMessage == Win32Api.MouseMessages.WM_LBUTTONDOWN || mouseMessage == Win32Api.MouseMessages.WM_LBUTTONUP) { var onMouseClickEvent = MouseClickEvent; if (onMouseClickEvent != null ) { onMouseClickEvent(_mouseParam.pt, mouseMessage); } if (mouseMessage == Win32Api.MouseMessages.WM_LBUTTONDOWN && IsHookingArea()) { return (IntPtr)1; } } } } return Win32Api.CallNextHookEx(_mouseId, nCode, wParam, lParam); } |
프로젝트에 필요한 키 배열만 갖추고 있으니 필요한 키는 만들어 사용하시기 바랍니다.
source: https://github.com/daeyeol/wpf-virtual-keyboard
- 영문
- 한글
- 키패드
'Window > WPF' 카테고리의 다른 글
VisualStudio 2017에 .NET 4.0 Bootstrapper 설정 (0) | 2018.02.21 |
---|---|
Custom Button (2) | 2016.01.29 |
Pixel Shader Effect in WPF (0) | 2015.02.26 |
[ WPF ] Word Cloud (0) | 2014.02.23 |
[ WPF ] VisualTree FindChild (0) | 2012.08.17 |