Advertisement
AZJIO

Double Ctrl, Двойной Ctrl

Apr 30th, 2012
707
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 9.69 KB | None | 0 0
  1. #include <WinAPI.au3>
  2. #include <WindowsConstants.au3>
  3. #include <StructureConstants.au3>
  4.  
  5.  
  6.  
  7. Global $vkCode[256]
  8. _vkCodeToArray()
  9.  
  10. Global $hHook, $hStub_KeyProc, $buffer = '', $buffer_up = '', $iEditLog, $Gui
  11.  
  12. Global Const $LLKHF_UP2         = 0x81 ; $LLKHF_DOWN
  13. Global Const $MOD_CONTROL           = 0x2
  14.  
  15.  
  16. _Main()
  17.  
  18. Func _Main()
  19.     OnAutoItExitRegister("Cleanup")
  20.  
  21.     Local $hmod
  22.  
  23.     $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
  24.     $hmod = _WinAPI_GetModuleHandle(0)
  25.     $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
  26.  
  27.     ; Esc - для закрытия скрипта
  28.  
  29.     $Gui=GUICreate('Пример перехвата с помощю хука', 700, 260, -1 , -1, $WS_OVERLAPPEDWINDOW)
  30.     $iEdit = GUICtrlCreateEdit('', 5, 5, 290, 250)
  31.     $iEditLog = GUICtrlCreateEdit('', 300, 5, 390, 250)
  32.     GUISetState()
  33.  
  34.     Do
  35.     Until GUIGetMsg()=-3
  36. EndFunc
  37. ;===========================================================
  38. ; callback function
  39. ;===========================================================
  40. Func _KeyProc($nCode, $wParam, $lParam)
  41.     Local $tKEYHOOKS
  42.     $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
  43.     If $nCode < 0 Then
  44.         Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam) ; переход к следующей цепочки хуков в очереди
  45.     EndIf
  46.     Local $n=DllStructGetData($tKEYHOOKS, "vkCode")
  47.     ; WinSetTitle($Gui, '', $n)
  48.     If $wParam = $WM_KEYDOWN Then ; если ввод с клавиатуры
  49.         _key_down($n) ; срабатывает при удерживании
  50.         GUICtrlSetData($iEditLog, "DOWN: scanCode - " & DllStructGetData($tKEYHOOKS, "scanCode") & @TAB & "vkCode - " & $vkCode[$n]& ' ('&$n&')' & @CRLF, 1)
  51.     Else
  52.         Local $flags = DllStructGetData($tKEYHOOKS, "flags")
  53.         Switch $flags
  54.             Case $LLKHF_ALTDOWN
  55.                 GUICtrlSetData($iEditLog, "$LLKHF_ALTDOWN" & @CRLF, 1) ; Нажатие и удерживание Alt
  56.             Case $LLKHF_EXTENDED ; расширенные клавиши
  57.                 GUICtrlSetData($iEditLog, "$LLKHF_EXTENDED" & @CRLF, 1)
  58.             Case $LLKHF_INJECTED ; наверно программное нажатие клавиши (не с клавиатуры)
  59.                 GUICtrlSetData($iEditLog, "$LLKHF_INJECTED" & @CRLF, 1)
  60.             Case $LLKHF_UP ; отжатие клавиши
  61.                 GUICtrlSetData($iEditLog, "$LLKHF_UP: scanCode - " & DllStructGetData($tKEYHOOKS, "scanCode") & @TAB & "vkCode - " & $vkCode[$n]& ' ('&$n&')' & @CRLF, 1)
  62.                 _Key_UP($n) ; срабатывает при отпуске. То есть удерживание не работает
  63.             Case $LLKHF_UP2 ; отжатие клавиши, дублирующие справа и специальные
  64.                 GUICtrlSetData($iEditLog, "$LLKHF_UP2: scanCode - " & DllStructGetData($tKEYHOOKS, "scanCode") & @TAB & "vkCode - " & $vkCode[$n]& ' ('&$n&')' & @CRLF, 1)
  65.             Case $MOD_CONTROL
  66.                 GUICtrlSetData($iEditLog, "$MOD_CONTROL: scanCode - " & DllStructGetData($tKEYHOOKS, "scanCode") & @TAB & "vkCode - " & $vkCode[$n]& ' ('&$n&')' & @CRLF, 1)
  67.         EndSwitch
  68.     EndIf
  69.     Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam) ; переход к следующей цепочки хуков в очереди
  70. EndFunc
  71.  
  72. Func _Key_UP($keycode)
  73.     If $keycode = 162 Then ; Ctrl
  74.         $buffer_up &= $keycode&','
  75.         AdlibRegister('_Reset_buffer_up', 700) ; сброс буфера, чтобы при интервале более 0.7 сек между нажатиями хук уже не срабатывал
  76.         Switch $buffer_up
  77.             Case "162,162,"
  78.                 ToolTip("Двойной левый Ctrl") ; срабатывает по отжатию
  79.                 AdlibRegister('_ToolTipClose', 2000)
  80.                 $buffer_up='' ; сброс буфера чтобы возможность повторного вызова сразу
  81.         EndSwitch
  82.     Else
  83.         $buffer_up = ''
  84.     EndIf
  85. EndFunc
  86.  
  87. Func _Reset_buffer_up()
  88.     AdlibUnRegister('_Reset_buffer_up')
  89.     $buffer_up = ''
  90. EndFunc
  91.  
  92. Func _key_down($keycode)
  93.     ; If (($keycode > 64) And ($keycode < 91)) _ ; a - z
  94.             ; Or (($keycode > 96) And ($keycode < 123)) _ ; A - Z
  95.             ; Or (($keycode > 47) And ($keycode < 58)) Then ; 0 - 9
  96.         ; $buffer &= Chr($keycode)
  97.         ; Switch $buffer
  98.             ; Case "Jon"
  99.                 ; ToolTip("Что вы ещё скажете?")
  100.             ; Case "AutoIt"
  101.                 ; ToolTip("AutoIt это круто")
  102.         ; EndSwitch
  103.     If ($keycode = 162) Or ($keycode = 81) Then ; Ctrl + Q
  104.         $buffer &= $keycode&','
  105.         ; If StringLen($buffer)>7 Then ; вариант сброса буфера при переполнении
  106.             ; $buffer = ""
  107.             ; Return
  108.         ; EndIf
  109.         Switch $buffer
  110.             Case "162,81,"
  111.                 ToolTip("Это типа хоткей Ctrl + Q")
  112.                 AdlibRegister('_ToolTipClose', 2000)
  113.                 $buffer='' ; сброс буфера чтобы возможность повторного вызова сразу
  114.             Case "162,"
  115.                 Return
  116.             Case Else ; сброс буфера при
  117.                 $buffer=''
  118.         EndSwitch
  119.     ; ElseIf ($keycode > 159) And ($keycode < 164) Then
  120.         ; Return
  121.     ; ElseIf ($keycode = 27) Then ; esc key
  122.         ; Exit
  123.     Else
  124.         $buffer = ""
  125.     EndIf
  126.     WinSetTitle($Gui, '', '$buffer = '&$buffer)
  127. EndFunc
  128.  
  129. Func _ToolTipClose()
  130.     AdlibUnRegister('_ToolTipClose')
  131.     ToolTip("")
  132. EndFunc
  133.  
  134. Func Cleanup()
  135.     _WinAPI_UnhookWindowsHookEx($hHook)
  136.     DllCallbackFree($hStub_KeyProc)
  137. EndFunc
  138.  
  139.  
  140. Func _vkCodeToArray()
  141. Local $vkCodeTmp[197][2]=[ _
  142. ['VK_LBUTTON', 1], _
  143. ['VK_RBUTTON', 2], _
  144. ['VK_CANCEL', 3], _
  145. ['VK_MBUTTON', 4], _
  146. ['VK_XBUTTON1', 5], _
  147. ['VK_XBUTTON2', 6], _
  148. ['VK_BACK', 8], _
  149. ['VK_TAB', 9], _
  150. ['VK_CLEAR', 12], _
  151. ['VK_RETURN', 13], _
  152. ['VK_PAUSE', 19], _
  153. ['VK_CAPITAL', 20], _
  154. ['VK_KANA', 21], _
  155. ['VK_JUNJA', 23], _
  156. ['VK_FINAL', 24], _
  157. ['VK_KANJI', 25], _
  158. ['VK_ESCAPE', 27], _
  159. ['VK_CONVERT', 28], _
  160. ['VK_NONCONVERT', 29], _
  161. ['VK_ACCEPT', 30], _
  162. ['VK_MODECHANGE', 31], _
  163. ['VK_SPACE', 32], _
  164. ['VK_PRIOR', 33], _
  165. ['VK_NEXT', 34], _
  166. ['VK_END', 35], _
  167. ['VK_HOME', 36], _
  168. ['VK_LEFT', 37], _
  169. ['VK_UP', 38], _
  170. ['VK_UP', 38], _
  171. ['VK_RIGHT', 39], _
  172. ['VK_DOWN', 40], _
  173. ['VK_SELECT', 41], _
  174. ['VK_PRINT', 42], _
  175. ['VK_EXECUTE', 43], _
  176. ['VK_SNAPSHOT', 44], _
  177. ['VK_INSERT', 45], _
  178. ['VK_DELETE', 46], _
  179. ['VK_HELP', 47], _
  180. ['VK_KEY_0', 48], _
  181. ['VK_KEY_1', 49], _
  182. ['VK_KEY_2', 50], _
  183. ['VK_KEY_3', 51], _
  184. ['VK_KEY_4', 52], _
  185. ['VK_KEY_5', 53], _
  186. ['VK_KEY_6', 54], _
  187. ['VK_KEY_7', 55], _
  188. ['VK_KEY_8', 56], _
  189. ['VK_KEY_9', 57], _
  190. ['VK_KEY_A', 65], _
  191. ['VK_KEY_B', 66], _
  192. ['VK_KEY_C', 67], _
  193. ['VK_KEY_D', 68], _
  194. ['VK_KEY_E', 69], _
  195. ['VK_KEY_F', 70], _
  196. ['VK_KEY_G', 71], _
  197. ['VK_KEY_H', 72], _
  198. ['VK_KEY_I', 73], _
  199. ['VK_KEY_J', 74], _
  200. ['VK_KEY_K', 75], _
  201. ['VK_KEY_L', 76], _
  202. ['VK_KEY_M', 77], _
  203. ['VK_KEY_N', 78], _
  204. ['VK_KEY_O', 79], _
  205. ['VK_KEY_P', 80], _
  206. ['VK_KEY_Q', 81], _
  207. ['VK_KEY_R', 82], _
  208. ['VK_KEY_S', 83], _
  209. ['VK_KEY_T', 84], _
  210. ['VK_KEY_U', 85], _
  211. ['VK_KEY_V', 86], _
  212. ['VK_KEY_W', 87], _
  213. ['VK_KEY_X', 88], _
  214. ['VK_KEY_Y', 89], _
  215. ['VK_KEY_Z', 90], _
  216. ['VK_LWIN', 91], _
  217. ['VK_RWIN', 92], _
  218. ['VK_APPS', 93], _
  219. ['VK_SLEEP', 95], _
  220. ['VK_NUMPAD0', 96], _
  221. ['VK_NUMPAD1', 97], _
  222. ['VK_NUMPAD2', 98], _
  223. ['VK_NUMPAD3', 99], _
  224. ['VK_NUMPAD4', 100], _
  225. ['VK_NUMPAD5', 101], _
  226. ['VK_NUMPAD6', 102], _
  227. ['VK_NUMPAD7', 103], _
  228. ['VK_NUMPAD8', 104], _
  229. ['VK_NUMPAD9', 105], _
  230. ['VK_MULTIPLY', 106], _
  231. ['VK_ADD', 107], _
  232. ['VK_SEPARATOR', 108], _
  233. ['VK_SUBTRACT', 109], _
  234. ['VK_DECIMAL', 110], _
  235. ['VK_DIVIDE', 111], _
  236. ['VK_F1', 112], _
  237. ['VK_F2', 113], _
  238. ['VK_F3', 114], _
  239. ['VK_F4', 115], _
  240. ['VK_F5', 116], _
  241. ['VK_F6', 117], _
  242. ['VK_F7', 118], _
  243. ['VK_F8', 119], _
  244. ['VK_F9', 120], _
  245. ['VK_F10', 121], _
  246. ['VK_F11', 122], _
  247. ['VK_F12', 123], _
  248. ['VK_F13', 124], _
  249. ['VK_F14', 125], _
  250. ['VK_F15', 126], _
  251. ['VK_F16', 127], _
  252. ['VK_F17', 128], _
  253. ['VK_F18', 129], _
  254. ['VK_F19', 130], _
  255. ['VK_F20', 131], _
  256. ['VK_F21', 132], _
  257. ['VK_F22', 133], _
  258. ['VK_F23', 134], _
  259. ['VK_F24', 135], _
  260. ['VK_NUMLOCK', 144], _
  261. ['VK_SCROLL', 145], _
  262. ['VK_OEM_FJ_JISHO', 146], _
  263. ['VK_OEM_FJ_MASSHOU', 147], _
  264. ['VK_OEM_FJ_TOUROKU', 148], _
  265. ['VK_OEM_FJ_LOYA', 149], _
  266. ['VK_OEM_FJ_ROYA', 150], _
  267. ['VK_LSHIFT', 160], _
  268. ['VK_RSHIFT', 161], _
  269. ['VK_LCONTROL', 162], _
  270. ['VK_RCONTROL', 163], _
  271. ['VK_LMENU', 164], _
  272. ['VK_RMENU', 165], _
  273. ['VK_BROWSER_BACK', 166], _
  274. ['VK_BROWSER_FORWARD', 167], _
  275. ['VK_BROWSER_REFRESH', 168], _
  276. ['VK_BROWSER_STOP', 169], _
  277. ['VK_BROWSER_SEARCH', 170], _
  278. ['VK_BROWSER_FAVORITES', 171], _
  279. ['VK_BROWSER_HOME', 172], _
  280. ['VK_VOLUME_MUTE', 173], _
  281. ['VK_VOLUME_DOWN', 174], _
  282. ['VK_VOLUME_UP', 175], _
  283. ['VK_MEDIA_NEXT_TRACK', 176], _
  284. ['VK_MEDIA_PREV_TRACK', 177], _
  285. ['VK_MEDIA_STOP', 178], _
  286. ['VK_MEDIA_PLAY_PAUSE', 179], _
  287. ['VK_LAUNCH_MAIL', 180], _
  288. ['VK_LAUNCH_MEDIA_SELECT', 181], _
  289. ['VK_LAUNCH_APP1', 182], _
  290. ['VK_LAUNCH_APP2', 183], _
  291. ['VK_OEM_1', 186], _
  292. ['VK_OEM_PLUS', 187], _
  293. ['VK_OEM_COMMA', 188], _
  294. ['VK_OEM_MINUS', 189], _
  295. ['VK_OEM_PERIOD', 190], _
  296. ['VK_OEM_2', 191], _
  297. ['VK_OEM_3', 192], _
  298. ['VK_ABNT_C1', 193], _
  299. ['VK_ABNT_C2', 194], _
  300. ['VK_OEM_4', 219], _
  301. ['VK_OEM_5', 220], _
  302. ['VK_OEM_6', 221], _
  303. ['VK_OEM_7', 222], _
  304. ['VK_OEM_8', 223], _
  305. ['VK_OEM_AX', 225], _
  306. ['VK_OEM_102', 226], _
  307. ['VK_ICO_HELP', 227], _
  308. ['VK_ICO_00', 228], _
  309. ['VK_PROCESSKEY', 229], _
  310. ['VK_ICO_CLEAR', 230], _
  311. ['VK_PACKET', 231], _
  312. ['VK_OEM_RESET', 233], _
  313. ['VK_OEM_JUMP', 234], _
  314. ['VK_OEM_PA1', 235], _
  315. ['VK_OEM_PA2', 236], _
  316. ['VK_OEM_PA3', 237], _
  317. ['VK_OEM_WSCTRL', 238], _
  318. ['VK_OEM_CUSEL', 239], _
  319. ['VK_OEM_ATTN', 240], _
  320. ['VK_OEM_FINISH', 241], _
  321. ['VK_OEM_COPY', 242], _
  322. ['VK_OEM_AUTO', 243], _
  323. ['VK_OEM_ENLW', 244], _
  324. ['VK_OEM_BACKTAB', 245], _
  325. ['VK_ATTN', 246], _
  326. ['VK_CRSEL', 247], _
  327. ['VK_EXSEL', 248], _
  328. ['VK_EREOF', 249], _
  329. ['VK_PLAY', 250], _
  330. ['VK_ZOOM', 251], _
  331. ['VK_NONAME', 252], _
  332. ['VK_PA1', 253], _
  333. ['VK_OEM_CLEAR', 254], _
  334. ['VK__none_', 255]]
  335.  
  336. For $i = 0 To 196
  337.     $vkCode[ $vkCodeTmp[$i][1] ] = $vkCodeTmp[$i][0]
  338. Next
  339. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement