Advertisement
Guest User

LowLevelKeyboardProcを使って入力を破棄する方法

a guest
Apr 9th, 2020
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #NoEnv
  2. ; #Persistent
  3. SetBatchLines, -1
  4. OnExit, Unhook
  5.  
  6. Hook_Key := SetWindowsHookEx(WH_KEYBOARD_LL:=13, RegisterCallback("LowLevelKeyboardProc"))
  7. if !Hook_Key
  8.     ExitApp
  9. Gui, Add, Edit, w280 r16
  10. Gui, +AlwaysOnTop
  11. Gui, Show
  12. return
  13.  
  14. F12::
  15. tooltip % WASD := !WASD
  16. KeyWait %A_ThisHotkey%
  17. return
  18.  
  19. #If WASD
  20. w::
  21. a::
  22. s::
  23. d::
  24. tooltip %A_ThisHotkey%
  25. return
  26. #If
  27.  
  28. Esc::
  29. GuiClose:
  30. ExitApp
  31.  
  32. Unhook:
  33. UnhookWindowsHookEx(Hook_Key)
  34. ExitApp
  35.  
  36. SetWindowsHookEx(idHook, pfn) { ; https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowshookexa
  37.     return DllCall("SetWindowsHookEx"
  38.                     , "Int", idHook
  39.                     , "Ptr", pfn
  40.                     , "Ptr", DllCall("GetModuleHandle", "UInt", 0, "Ptr")
  41.                     , "UInt", 0
  42.                     , "Ptr")
  43. }
  44.  
  45. UnhookWindowsHookEx(hHook) { ; https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-unhookwindowshookex
  46.     return DllCall("UnhookWindowsHookEx", "Ptr", hHook)
  47. }
  48.  
  49. CallNextHookEx(nCode, wParam, lParam, hHook = 0) { ; https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-callnexthookex
  50.     return DllCall("CallNextHookEx", "UInt", hHook, "Int", nCode, "UInt", wParam, "UInt", lParam)
  51. }
  52.  
  53. LowLevelKeyboardProc(nCode, wParam, lParam) { ; https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-kbdllhookstruct?redirectedfrom=MSDN
  54.     global WASD
  55.     Critical
  56.     if (nCode = 0) {
  57.         if (WASD && !(GetKeyName(Format("vk{:02x}", NumGet(lParam+0, "Int"))) ~= "^(Escape|F12|w|a|s|d|)$")) ; keyName
  58.         ; if (WASD && !(Format("{:02X}", NumGet(lParam+0, "Int")) ~= "^(1B|7B|57|41|53|44)$")) ; vkCode
  59.             return 1 ; 入力を破棄する
  60.     }
  61.     return CallNextHookEx(nCode, wParam, lParam)
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement