메시지 필터를 이용하여 F1, F2, F3 .. 키 입력을 후킹하기.
public class MessageFilter : System.Windows.Forms.IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
switch(m.Msg)
{
case 256 : // WM_KEYDOWN <==== windows message 를 C# 형태로 쓰고 싶었지만.. 딱히 만들어져있는게 없더군요 그래서
// 인터넷에서 windows.h 파일을 검색해서 찾았습니다. WM_KETDOWN = 256 번이더군요.
System.Console.WirteLine(m.LParam.ToInt32()); // 이걸로 F1 부터 여러가지 키를 차례데로 눌러본 값들이
if( m.LParam.ToInt32() == 3866625 ) // F1 Key // <=== 이 값들입니다. 3866625 가 F1 이군요.. 이런식으로 Key 값을 찾아서
{ // 계속 추가하면 키보드 후킹.. 그다지 어려운건 아닐거 같군요 ^^;;
System.Console.WriteLine("F1 Press");
return true;
}
else if( m.LParam.ToInt32() == 3932161 ) // F2 Key
{
System.Console.WriteLine("F2 Press");
return true;
}
else if( m.LParam.ToInt32() == 3997697 ) // F3 Key
{
System.Console.WriteLine("F3 Press");
return true;
}
break;
}
return false;
}
}
//
// 만들어 놓은 MessageFilter 는 반드시 AddMessageFilter 메서드를 통해 추가해줘야 합니다.
// static void Main 함수는 기본 Form 에 포함되어 있습니다. :) 아시죠?
static void Main()
{
Application.AddMessageFilter(new MessageFilter());
Application.Run(new JapExamples());
}
아래 있는 것은 windows.h 파일에 정의된 windos message 들입니다. windows.h 파일은 visual studio 안에 INCLUDE_ROOT 에 있습니다.
어딘지는 아시죠?
WA_ACTIVE | 1 |
WA_CLICKACTIVE | 2 |
WA_INACTIVE | 0 |
WM_ACTIVATE | 6 |
WM_ACTIVATEAPP | 28 |
WM_AFXFIRST | 864 |
WM_AFXLAST | 895 |
WM_APP | 32768 |
WM_ASKCBFORMATNAME | 780 |
WM_CANCELJOURNAL | 75 |
WM_CANCELMODE | 31 |
WM_CAPTURECHANGED | 533 |
WM_CHANGECBCHAIN | 781 |
WM_CHAR | 258 |
WM_CHARTOITEM | 47 |
WM_CHILDACTIVATE | 34 |
WM_CLEAR | 771 |
WM_CLOSE | 16 |
WM_COMMAND | 273 |
WM_COMMNOTIFY | 68 |
WM_COMPACTING | 65 |
WM_COMPAREITEM | 57 |
WM_CONTEXTMENU | 123 |
WM_COPY | 769 |
WM_COPYDATA | 74 |
WM_CREATE | 1 |
WM_CTLCOLORBTN | 309 |
WM_CTLCOLORDLG | 310 |
WM_CTLCOLOREDIT | 307 |
WM_CTLCOLORLISTBOX | 308 |
WM_CTLCOLORMSGBOX | 306 |
WM_CTLCOLORSCROLLBAR | 311 |
WM_CTLCOLORSTATIC | 312 |
WM_CUT | 768 |
WM_DEADCHAR | 259 |
WM_DELETEITEM | 45 |
WM_DESTROY | 2 |
WM_DESTROYCLIPBOARD | 775 |
WM_DEVICECHANGE | 537 |
WM_DEVMODECHANGE | 27 |
WM_DISPLAYCHANGE | 126 |
WM_DRAWCLIPBOARD | 776 |
WM_DRAWITEM | 43 |
WM_DROPFILES | 563 |
WM_ENABLE | 10 |
WM_ENDSESSION | 22 |
WM_ENTERIDLE | 289 |
WM_ENTERMENULOOP | 529 |
WM_ENTERSIZEMOVE | 561 |
WM_ERASEBKGND | 20 |
WM_EXITMENULOOP | 530 |
WM_EXITSIZEMOVE | 562 |
WM_FONTCHANGE | 29 |
WM_GETDLGCODE | 135 |
WM_GETFONT | 49 |
WM_GETHOTKEY | 51 |
WM_GETICON | 127 |
WM_GETMINMAXINFO | 36 |
WM_GETOBJECT | 61 |
WM_GETTEXT | 13 |
WM_GETTEXTLENGTH | 14 |
WM_HANDHELDFIRST | 856 |
WM_HANDHELDLAST | 863 |
WM_HELP | 83 |
WM_HOTKEY | 786 |
WM_HSCROLL | 276 |
WM_HSCROLLCLIPBOARD | 782 |
WM_ICONERASEBKGND | 39 |
WM_IME_CHAR | 646 |
WM_IME_COMPOSITION | 271 |
WM_IME_COMPOSITIONFULL | 644 |
WM_IME_CONTROL | 643 |
WM_IME_ENDCOMPOSITION | 270 |
WM_IME_KEYDOWN | 656 |
WM_IME_KEYLAST | 271 |
WM_IME_KEYUP | 657 |
WM_IME_NOTIFY | 642 |
WM_IME_REQUEST | 648 |
WM_IME_SELECT | 645 |
WM_IME_SETCONTEXT | 641 |
WM_IME_STARTCOMPOSITION | 269 |
WM_INITDIALOG | 272 |
WM_INITMENU | 278 |
WM_INITMENUPOPUP | 279 |
WM_INPUTLANGCHANGE | 81 |
WM_INPUTLANGCHANGEREQUEST | 80 |
WM_KEYDOWN | 256 |
WM_KEYFIRST | 256 |
WM_KEYLAST | 264 |
WM_KEYUP | 257 |
WM_KILLFOCUS | 8 |
WM_LBUTTONDBLCLK | 515 |
WM_LBUTTONDOWN | 513 |
WM_LBUTTONUP | 514 |
WM_MBUTTONDBLCLK | 521 |
WM_MBUTTONDOWN | 519 |
WM_MBUTTONUP | 520 |
WM_MDIACTIVATE | 546 |
WM_MDICASCADE | 551 |
WM_MDICREATE | 544 |
WM_MDIDESTROY | 545 |
WM_MDIGETACTIVE | 553 |
WM_MDIICONARRANGE | 552 |
WM_MDIMAXIMIZE | 549 |
WM_MDINEXT | 548 |
WM_MDIREFRESHMENU | 564 |
WM_MDIRESTORE | 547 |
WM_MDISETMENU | 560 |
WM_MDITILE | 550 |
WM_MEASUREITEM | 44 |
WM_MENUCHAR | 288 |
WM_MENUCOMMAND | 294 |
WM_MENUDRAG | 291 |
WM_MENUGETOBJECT | 292 |
WM_MENURBUTTONUP | 290 |
WM_MENUSELECT | 287 |
WM_MOUSEACTIVATE | 33 |
WM_MOUSEFIRST | 512 |
WM_MOUSEHOVER | 673 |
WM_MOUSELEAVE | 675 |
WM_MOUSEMOVE | 512 |
WM_MOUSEWHEEL | 522 |
WM_MOVE | 3 |
WM_MOVING | 534 |
WM_NCACTIVATE | 134 |
WM_NCCALCSIZE | 131 |
WM_NCCREATE | 129 |
WM_NCDESTROY | 130 |
WM_NCHITTEST | 132 |
WM_NCLBUTTONDBLCLK | 163 |
WM_NCLBUTTONDOWN | 161 |
WM_NCLBUTTONUP | 162 |
WM_NCMBUTTONDBLCLK | 169 |
WM_NCMBUTTONDOWN | 167 |
WM_NCMBUTTONUP | 168 |
WM_NCMOUSEMOVE | 160 |
WM_NCPAINT | 133 |
WM_NCRBUTTONDBLCLK | 166 |
WM_NCRBUTTONDOWN | 164 |
WM_NCRBUTTONUP | 165 |
WM_NEXTDLGCTL | 40 |
WM_NEXTMENU | 531 |
WM_NOTIFY | 78 |
WM_NOTIFYFORMAT | 85 |
WM_NULL | 0 |
WM_PAINT | 15 |
WM_PAINTCLIPBOARD | 777 |
WM_PAINTICON | 38 |
WM_PALETTECHANGED | 785 |
WM_PALETTEISCHANGING | 784 |
WM_PARENTNOTIFY | 528 |
WM_PASTE | 770 |
WM_PENWINFIRST | 896 |
WM_PENWINLAST | 911 |
WM_POWER | 72 |
WM_POWERBROADCAST | 536 |
WM_PRINT | 791 |
WM_PRINTCLIENT | 792 |
WM_QUERYDRAGICON | 55 |
WM_QUERYENDSESSION | 17 |
WM_QUERYNEWPALETTE | 783 |
WM_QUERYOPEN | 19 |
WM_QUEUESYNC | 35 |
WM_QUIT | 18 |
WM_RBUTTONDBLCLK | 518 |
WM_RBUTTONDOWN | 516 |
WM_RBUTTONUP | 517 |
WM_RENDERALLFORMATS | 774 |
WM_RENDERFORMAT | 773 |
WM_SETCURSOR | 32 |
WM_SETFOCUS | 7 |
WM_SETFONT | 48 |
WM_SETHOTKEY | 50 |
WM_SETICON | 128 |
WM_SETREDRAW | 11 |
WM_SETTEXT | 12 |
WM_SETTINGCHANGE | 26 |
WM_SHOWWINDOW | 24 |
WM_SIZE | 5 |
WM_SIZECLIPBOARD | 779 |
WM_SIZING | 532 |
WM_SPOOLERSTATUS | 42 |
WM_STYLECHANGED | 125 |
WM_STYLECHANGING | 124 |
WM_SYNCPAINT | 136 |
WM_SYSCHAR | 262 |
WM_SYSCOLORCHANGE | 21 |
WM_SYSCOMMAND | 274 |
WM_SYSDEADCHAR | 263 |
WM_SYSKEYDOWN | 260 |
WM_SYSKEYUP | 261 |
WM_TCARD | 82 |
WM_TIMECHANGE | 30 |
WM_TIMER | 275 |
WM_UNDO | 772 |
WM_UNINITMENUPOPUP | 293 |
WM_USER | 1024 |
WM_USERCHANGED | 84 |
WM_VKEYTOITEM | 46 |
WM_VSCROLL | 277 |
WM_VSCROLLCLIPBOARD | 778 |
WM_WINDOWPOSCHANGED | 71 |
WM_WINDOWPOSCHANGING | 70 |
WM_WININICHANGE | 26 |
출처
[출처] [C#] 메시지 후킹하는 방법 |작성자 섬광매냐