티스토리 뷰
======================================================
안녕하세요 Doridori 입니다.
또 다시 간만에 돌아온듯한 Doridori 입니다. ~!!
12월 부터 새로운 곳으로 가서 새로 적응 한다고 오래 걸렸습니다.
10년만에 완전 새로운 일을 하느라 적응이 매우 힘들 기는 하지만 댓글들 보면서 힘을 내고 있습니다.
새로운 해도 밝았으니 올해도 힘내서 열심히 달려봐야 하지 않을까 싶습니다.!!!
개발에 뜻이 있는 많은 분들이 힘내시는데 도움이 되었으면 좋겠습니다. ^^
======================================================
39. User32.dll (Keyboard Hook)
Source UI) Study_39_User32.dll Keyboard Hook (UI).zip
Soruce 전체) Study_39_User32.dll Keyboard Hook.zip
교재) 39. User32.dll (Keyboard Hooking).pdf
Keyboard Hook은 현재 실행 되고 있는 Program 내에서의 event가 아닌 window 전역에서 발생 하고 있는 Keyboard 동작에 대한 event를 받아오는 작업이라고 보면 될 것 같습니다.
보통 게임 메크로 프래그램을 많들때 많이 사용 되었는데 다른 작업들을 할 때도 충분히 사용 할 수 있습니다. ^^
사용시에는 user32라고 하는 window api를 사용해서 event를 받아오면 됩니다.
이번 강의를 진행 할 Program의 경우 크게
- user32 window api를 이용하여 window keyboard event를 받아온다
- windwo clipboard에 있는 text를 불러오거나 저장 한다
- 프로그램을 개발하는 순서에 대해 고민해 본다
정도로 생각하시면 될 것 같습니다.
(UI)
UI는 이번 시간에 뭘 한게 없어서 애기 할게 없네요 ^^;;;
Listbox 1개만 추가한 간단한 UI 입니다.
이번 시간에는 Core Code를 구현 하였고, 다음 시간에는 UI 위주로 진행이 될것 같습니다. ^^;;
강의)
Source)
KeyboardHook 부분의 경우 CGlobalKeyboardHook Class로 분리 하였기때문에 통으로 사용하시면 편할 듯 합니다.
CGlobalKeyboardHook.cs)
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CopyAndPaste { class CGlobalKeyboardHook { [DllImport("user32.dll")] static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId); [DllImport("user32.dll")] static extern bool UnhookWindowsHookEx(IntPtr hInstance); [DllImport("user32.dll")] static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct IParam); [DllImport("user32.dll")] static extern short GetKeyState(int nCode); [DllImport("kernel32.dll")] static extern IntPtr LoadLibrary(string IpFileName); // 라이브러리 등록 public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct IParam); // callback Delegate // keyboardHookStruct 구조체 정의 public struct keyboardHookStruct { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } // 정의 되어 있는 상수 값 const int VK_SHIFT = 0x10; const int VK_CONTROL = 0x11; const int VK_MENU = 0x12; const int WH_KEYBOARD_LL = 13; const int WM_KEYDOWN = 0x100; const int WM_KEYUP = 0x101; const int WM_SYSKEYDOWN = 0x104; const int WM_SYSKEYUP = 0x105; private keyboardHookProc khp; IntPtr hhook = IntPtr.Zero; public event KeyEventHandler KeyDown; public event KeyEventHandler KeyUp; public CGlobalKeyboardHook() { khp = new keyboardHookProc(hookproc); } public void hook() { IntPtr hInstance = LoadLibrary("User32"); hhook = SetWindowsHookEx(WH_KEYBOARD_LL, khp, hInstance, 0); } public void unhook() { UnhookWindowsHookEx(hhook); } public int hookproc(int code, int wParam, ref keyboardHookStruct IParam) { if (code >= 0) { Keys key = (Keys)IParam.vkCode; if ((GetKeyState(VK_CONTROL) & 0x80) != 0) key |= Keys.Control; if ((GetKeyState(VK_MENU) & 0x80) != 0) key |= Keys.Alt; if ((GetKeyState(VK_SHIFT) & 0x80) != 0) key |= Keys.Shift; KeyEventArgs kea = new KeyEventArgs(key); if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null)) { KeyDown(this, kea); } else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null)) { KeyUp(this, kea); } if (kea.Handled) return 1; } return CallNextHookEx(hhook, code, wParam, ref IParam); } } } | cs |
Main Form)
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 48 49 50 51 52 53 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace CopyAndPaste { public partial class Form1 : Form { CGlobalKeyboardHook _kbdHook = new CGlobalKeyboardHook(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, System.EventArgs e) { _kbdHook.hook(); _kbdHook.KeyDown += _kbdHook_KeyDown; } private void _kbdHook_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.C) { Thread.Sleep(400); lboxTestSave.Items.Add(Clipboard.GetData(System.Windows.Forms.DataFormats.UnicodeText).ToString()); } } private void LboxTestSave_SelectedIndexChanged(object sender, System.EventArgs e) { if (lboxTestSave.SelectedIndex != -1) { Clipboard.SetData(System.Windows.Forms.DataFormats.UnicodeText, lboxTestSave.SelectedItem.ToString()); } } } } | cs |
'C# > C# 강좌 Winform' 카테고리의 다른 글
Doridori C# 강의 2) 41. User32.dll (3) (Menu Control) (0) | 2020.02.23 |
---|---|
Doridori C# 강의 2) 40. User32.dll (2) (Copy&Paste) (6) | 2020.02.09 |
Doridori C# 강의 2) 38. Lock (8) | 2019.11.27 |
Doridori C# 강의 2) 37. 재귀 함수 (Recursion Function) (6) | 2019.11.14 |
Doridori C# 강의 2) 36. LinkedList, SortedList (18) | 2019.05.05 |
- Total
- Today
- Yesterday
- 프로그램 강의
- 증류주
- 모바일
- 아이랑
- 소주
- 칵테일
- 막걸리
- 가볼만한 곳
- 하이볼
- 전통주
- C# 기초 강의
- 술
- C# 강의
- 서울
- 맛집
- 나들이
- Visual Studio
- 가볼만한곳
- 위스키
- 맥주
- C#
- WinForm
- 게임
- C# 강좌
- 광저우
- 보드카
- 도리도리 C#
- 주말
- 도리도리
- 와인
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |