/// <summary> /// 마우스 프로시저 처리하기 /// </summary> /// <param name="code">코드</param> /// <param name="wordParameter">WORD 매개 변수</param> /// <param name="longParameter">LONG 매개 변수</param> /// <returns>처리 결과</returns> private static IntPtr MouseProc(int code, IntPtr wordParameter, IntPtr longParameter) { if (code >= 0) { _mouseHookStructure = (MOUSEHOOKSTRUCT)Marshal.PtrToStructure ( longParameter, typeof(MOUSEHOOKSTRUCT) ); MouseMessage mouseMessage = (MouseMessage)wordParameter; if (UseGlobal) { if (mouseMessage == MouseMessage.WM_LBUTTONDOWN || mouseMessage == MouseMessage.WM_LBUTTONUP) { MouseClick?.Invoke(_mouseHookStructure.Location, mouseMessage); if (mouseMessage == MouseMessage.WM_LBUTTONDOWN && IsHookingArea()) { return((IntPtr)1); } } } } return(WIN32Helper.CallNextHookEx(_mouseHookHandle, code, wordParameter, longParameter)); }
/// <summary> /// 키보드 프로시저 처리하기 /// </summary> /// <param name="code">코드</param> /// <param name="wordParameter">WORD 매개 변수</param> /// <param name="longParameter">LONG 매개 변수</param> /// <returns>처리 결과</returns> private static IntPtr KeyboardProc(int code, IntPtr wordParameter, IntPtr longParameter) { if (code == WIN32Helper.HC_ACTION) { uint wordParameterValue = (uint)wordParameter; long longParamererValue = (long)longParameter; if (wordParameterValue == 256) { KEYBOARDHOOKSTRUCT keyboardHookStructure = (KEYBOARDHOOKSTRUCT)Marshal.PtrToStructure ( longParameter, typeof(KEYBOARDHOOKSTRUCT) ); KeyClick?.Invoke(keyboardHookStructure.VirtualKeyCode); } if ((wordParameterValue == 229 && longParamererValue == -2147483647) || (wordParameterValue == 229 && longParamererValue == -2147483648)) { if (IsHookingArea()) { return((IntPtr)1); } } } return(WIN32Helper.CallNextHookEx(_keyboardHookHandle, code, wordParameter, longParameter)); }
//////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 시작하기 - Start() /// <summary> /// 시작하기 /// </summary> public static void Start() { if (!IsRun) { uint threadID = WIN32Helper.GetCurrentThreadId(); using (Process process = Process.GetCurrentProcess()) { using (ProcessModule processModule = process.MainModule) { _handle = process.MainWindowHandle; _moduleHandle = WIN32Helper.GetModuleHandle(processModule.ModuleName); _keyboardHookHandle = WIN32Helper.SetWindowsHookEx ( (int)HookType.WH_KEYBOARD_LL, _keyboardProc, _moduleHandle, 0 ); _mouseHookHandle = WIN32Helper.SetWindowsHookEx ( (int)HookType.WH_MOUSE_LL, _mouseProc, _moduleHandle, 0 ); IsRun = true; } } } }
/// <summary> /// 중단하기 /// </summary> public static void Stop() { if (IsRun) { WIN32Helper.UnhookWindowsHookEx(_keyboardHookHandle); WIN32Helper.UnhookWindowsHookEx(_mouseHookHandle); IsRun = false; } }