/SampleTOAPIA/DeskShare/HumSketch.Core/HookKeyboard.cs

https://github.com/Wiladams/NewTOAPIA · C# · 235 lines · 116 code · 34 blank · 85 comment · 11 complexity · 9f78d3c1b28e79f3c773fbe915d64caa MD5 · raw file

  1. using System;
  2. using System.Threading;
  3. using System.Reflection;
  4. using System.Windows.Forms;
  5. using System.ComponentModel;
  6. using System.Diagnostics;
  7. using System.Runtime.InteropServices;
  8. using TOAPI.Types;
  9. using TOAPI.User32;
  10. namespace NewTOAPIA.UI
  11. {
  12. public class HookKeyboardInput
  13. {
  14. #region Structs and Variables
  15. [StructLayout(LayoutKind.Sequential)]
  16. private class MouseHookStruct
  17. {
  18. public POINT pt;
  19. public int hwnd;
  20. public int wHitTestCode;
  21. public int dwExtraInfo;
  22. }
  23. //http://msdn.microsoft.com/en-us/library/ms644970(VS.85).aspx
  24. [StructLayout(LayoutKind.Sequential)]
  25. private class MouseLLHookStruct
  26. {
  27. public POINT pt;
  28. public int mouseData;
  29. public int flags;
  30. public int time;
  31. public int dwExtraInfo;
  32. }
  33. [StructLayout(LayoutKind.Sequential)]
  34. private class KeyboardHookStruct
  35. {
  36. public int vkCode;
  37. public int scanCode;
  38. public int flags;
  39. public int time;
  40. public int dwExtraInfo;
  41. }
  42. public event KeyboardActivityEventHandler KeybdEvent;
  43. private IntPtr hKeyboardHook = IntPtr.Zero;
  44. private static User32.HOOKPROC KeyboardHookProcedure;
  45. //private static KEYBDDATA hookCallbackKeybdData = new KEYBDDATA();
  46. private static bool realData = true;
  47. private long lastSwitchKey1;
  48. private long lastSwitchKey2;
  49. private bool lastSwitchKey = true;
  50. private bool winDown, ctrlDown, altDown;
  51. public static bool RealData
  52. {
  53. get { return HookKeyboardInput.realData; }
  54. set { HookKeyboardInput.realData = value; }
  55. }
  56. #endregion
  57. public HookKeyboardInput()
  58. {
  59. Start();
  60. }
  61. ~HookKeyboardInput()
  62. {
  63. Stop();
  64. }
  65. #region Hooks
  66. public void Start()
  67. {
  68. // Install Keyboard Hook
  69. KeyboardHookProcedure = new User32.HOOKPROC(KeyboardHookProc);
  70. hKeyboardHook = User32.SetWindowsHookEx(
  71. User32.WH_KEYBOARD_LL,
  72. KeyboardHookProcedure,
  73. Marshal.GetHINSTANCE(
  74. Assembly.GetExecutingAssembly().GetModules()[0]),
  75. 0);
  76. if (IntPtr.Zero == hKeyboardHook)
  77. {
  78. //Common.Log("Error installing keyboard hook: " + Marshal.GetLastWin32Error().ToString());
  79. Stop();
  80. }
  81. }
  82. public void Stop()
  83. {
  84. if (IntPtr.Zero != hKeyboardHook)
  85. {
  86. bool retKeyboard = User32.UnhookWindowsHookEx(hKeyboardHook) != 0;
  87. hKeyboardHook = IntPtr.Zero;
  88. if (retKeyboard == false)
  89. {
  90. int errorCode = Marshal.GetLastWin32Error();
  91. //throw new Win32Exception(errorCode);
  92. //Common.Log("Exception uninstalling keyboard hook, error code: " + errorCode.ToString());
  93. }
  94. }
  95. }
  96. #endregion
  97. #region Hook Callbacks
  98. private IntPtr KeyboardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
  99. {
  100. //Common.InputEventCount++;
  101. if (!realData)
  102. {
  103. return User32.CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
  104. }
  105. if ((nCode >= 0) && (KeybdEvent != null))
  106. {
  107. KeyboardHookStruct keydbHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
  108. KeyboardActivityArgs kbda = KeyboardActivityArgs.CreateFromKeyboardHookProc(wParam, lParam);
  109. KeybdEvent(this, kbda);
  110. //ProcessKeyEx(keydbHookStruct.vkCode, wParam.ToInt32());
  111. }
  112. //if (Common.DesMachineIP == IP.NONE || Common.DesMachineIP == IP.ALL || Common.DesMachineIP == Common.MachineIP)
  113. //{
  114. return User32.CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
  115. //}
  116. //else
  117. {
  118. return new IntPtr(1) ;
  119. }
  120. }
  121. //private void ProcessKeyEx(int vkCode, int flags)
  122. //{
  123. // if (flags == MSG.WM_KEYUP)
  124. // {
  125. // switch (vkCode)
  126. // {
  127. // case User32.VK_LWIN:
  128. // case User32.VK_RWIN:
  129. // winDown = false;
  130. // break;
  131. // case User32.VK_LCONTROL:
  132. // ctrlDown = false;
  133. // if ((Common.GetTick() - lastSwitchKey1 < 500) && (Common.GetTick() - lastSwitchKey2 < 500) &&
  134. // (Common.GetTick() - Common.IJustGotAKey) > 1000)
  135. // {
  136. // Common.SwitchToMultipleMode(Common.DesMachineIP != IP.ALL);
  137. // Common.MainForm.UpdateMultipleModeIconAndMenu();
  138. // lastSwitchKey = true;
  139. // lastSwitchKey1 = lastSwitchKey2 = 0;
  140. // break;
  141. // }
  142. // if (lastSwitchKey)
  143. // lastSwitchKey1 = Common.GetTick();
  144. // else
  145. // lastSwitchKey2 = Common.GetTick();
  146. // lastSwitchKey = !lastSwitchKey;
  147. // break;
  148. // case User32.VK_RCONTROL:
  149. // ctrlDown = false;
  150. // break;
  151. // case User32.VK_LMENU:
  152. // case User32.VK_RMENU:
  153. // altDown = false;
  154. // break;
  155. // default:
  156. // break;
  157. // }
  158. // }
  159. // else
  160. // {
  161. // switch (vkCode)
  162. // {
  163. // case User32.VK_LWIN:
  164. // case User32.VK_RWIN:
  165. // winDown = true;
  166. // break;
  167. // case User32.VK_LCONTROL:
  168. // case User32.VK_RCONTROL:
  169. // ctrlDown = true;
  170. // break;
  171. // case User32.VK_LMENU:
  172. // case User32.VK_RMENU:
  173. // altDown = true;
  174. // break;
  175. // case User32.VK_DELETE:
  176. // if (ctrlDown && altDown)
  177. // {
  178. // if (Common.DesMachineIP != IP.ALL)
  179. // Common.SwitchToMachine(Common.MachineName.Trim());
  180. // }
  181. // break;
  182. // case 'L':
  183. // if (winDown)
  184. // {
  185. // if (Common.DesMachineIP != IP.ALL)
  186. // Common.SwitchToMachine(Common.MachineName.Trim());
  187. // }
  188. // break;
  189. // default:
  190. // break;
  191. // }
  192. // }
  193. //}
  194. internal bool CtrlDown
  195. {
  196. get { return ctrlDown; }
  197. set { ctrlDown = value; }
  198. }
  199. #endregion
  200. }
  201. }