【问题标题】:How to get the state of the keyboard in AHK script?如何在 AHK 脚本中获取键盘状态?
【发布时间】:2018-01-14 01:51:15
【问题描述】:

在AHK中,如何获取表示键盘上每个键状态的布尔值数组?

【问题讨论】:

    标签: keyboard autohotkey


    【解决方案1】:

    不同的键盘布局带有不同的按键。您必须知道键的名称才能检查它们,并且必须逐个键完成。 你基本上会使用GetKeyState("KeyName","P")

    如果您有一个要检查的键数组,您可以循环提供该键数组,检查每个键并将结果存储在另一个数组中:

    keysToCheck = ["q","w","e","r","t","y","u","i","o","p"]
    keyStates = {}
    for i, key in keysToCheck
    {
        keyState := GetKeyState("KeyName","P")
        keyStates.Insert(key,keyState)
    }
    
    ; keyStates now contains all the key states
    
    MsgBox % keyStates["q"]
    MsgBox % keyStates["w"]
    

    (未经测试)

    【讨论】:

      【解决方案2】:

      我确实找到了一个很棒的 AHK 脚本,它可以监控你所有的按键键盘快捷键组合鼠标点击,脚本很长但是你可以得到所有键盘动作的状态。

      如果您查看 KeypressOSD.ahk 脚本中的代码行 GuiControl, , HotkeyText, %HotkeyStr% - 那么这个 %HotkeyStr% 是您收到所按的值的变量。

      如果您稍微更改代码 - 并删除一些 Gui 的代码行 + 写下这个 %HotkeyStr% 值 到 Windows 注册表,然后您可以使用一条代码行从注册表中获取每次按键值并使用它,然后在任何类型的 ahk 脚本中。

      您可以替换它并删除一些 GUI 代码行。

      RegWrite, REG_SZ, HKEY_CURRENT_USER,software\GetKeypressValue,KeypressValue,%HotkeyStr%
      

      现在您可以通过一个代码行在任何 ahk 脚本中使用它。 (注意 - 与 KeypressOSD.ahk 脚本一起运行)

       RegRead, KeypressValue, HKEY_CURRENT_USER,software\GetKeypressValue,KeypressValue ; read KeypressValue
      

      如果您观看此 Youtube 视频,您会看到它的功能。

      Detect Keypress Value From Windows Registry key.

      注意!!该程序由作者 RaptorX 创建。 它适用于 Windows 10 系统。

      KeypressOSD.ahk

      ; KeypressOSD.ahk
      ; Open this Script in Wordpad and For Changelog look to the Bottom of the script. 
      ;This code works with a getkeyname from a Dllcall (See Bottom Script- by Lexikos)
      ;you can press the esc key to exit.
      
      #SingleInstance force
      #NoEnv
      SetBatchLines, -1
      ListLines, Off
      
      ; Settings
          global TransN                := 200      ; 0~255
          global ShowSingleKey         := True
          global ShowMouseButton       := True
          global ShowSingleModifierKey := True
          global ShowModifierKeyCount  := true
          global ShowStickyModKeyCount := false
          global DisplayTime           := 2000     ; In milliseconds
          global GuiPosition           := "Bottom" ; Top or Bottom
          global FontSize              := 50
          global GuiHeight             := 115
      
      CreateGUI()
      CreateHotkey()
      return
      
      OnKeyPressed:
          try {
              key := GetKeyStr()
              ShowHotkey(key)
              SetTimer, HideGUI, % -1 * DisplayTime
          }
      return
      
      OnKeyUp:
      return
      
      _OnKeyUp:
          tickcount_start := A_TickCount
      return
      
      
      CreateGUI() {
          global
      
          Gui, +AlwaysOnTop -Caption +Owner +LastFound +E0x20
          Gui, Margin, 0, 0
          Gui, Color, Black
          Gui, Font, cWhite s%FontSize% bold, Arial
          Gui, Add, Text, vHotkeyText Center y20
      
          WinSet, Transparent, %TransN%
      }
      
      CreateHotkey() {
          Loop, 95
          {
              k := Chr(A_Index + 31)
              k := (k = " ") ? "Space" : k
      
              Hotkey, % "~*" k, OnKeyPressed
              Hotkey, % "~*" k " Up", _OnKeyUp
          }
      
          Loop, 24 ; F1-F24
          {
              Hotkey, % "~*F" A_Index, OnKeyPressed
              Hotkey, % "~*F" A_Index " Up", _OnKeyUp
          }
      
          Loop, 10 ; Numpad0 - Numpad9
          {
              Hotkey, % "~*Numpad" A_Index - 1, OnKeyPressed
              Hotkey, % "~*Numpad" A_Index - 1 " Up", _OnKeyUp
          }
      
          Otherkeys := "WheelDown|WheelUp|WheelLeft|WheelRight|XButton1|XButton2|Browser_Forward|Browser_Back|Browser_Refresh|Browser_Stop|Browser_Search|Browser_Favorites|Browser_Home|Volume_Mute|Volume_Down|Volume_Up|Media_Next|Media_Prev|Media_Stop|Media_Play_Pause|Launch_Mail|Launch_Media|Launch_App1|Launch_App2|Help|Sleep|PrintScreen|CtrlBreak|Break|AppsKey|NumpadDot|NumpadDiv|NumpadMult|NumpadAdd|NumpadSub|NumpadEnter|Tab|Enter|Esc|BackSpace"
                     . "|Del|Insert|Home|End|PgUp|PgDn|Up|Down|Left|Right|ScrollLock|CapsLock|NumLock|Pause|sc145|sc146|sc046|sc123"
          Loop, parse, Otherkeys, |
          {
              Hotkey, % "~*" A_LoopField, OnKeyPressed
              Hotkey, % "~*" A_LoopField " Up", _OnKeyUp
          }
      
          If ShowMouseButton {
              Loop, Parse, % "LButton|MButton|RButton", |
                  Hotkey, % "~*" A_LoopField, OnKeyPressed
          }
      
          for i, mod in ["Ctrl", "Shift", "Alt"] {
              Hotkey, % "~*" mod, OnKeyPressed
              Hotkey, % "~*" mod " Up", OnKeyUp
          }
          for i, mod in ["LWin", "RWin"]
              Hotkey, % "~*" mod, OnKeyPressed
      }
      
      ShowHotkey(HotkeyStr) {
          WinGetPos, ActWin_X, ActWin_Y, ActWin_W, ActWin_H, A
          if !ActWin_W
              throw
      
          text_w := (ActWin_W > A_ScreenWidth) ? A_ScreenWidth : ActWin_W
          GuiControl,     , HotkeyText, %HotkeyStr%
          GuiControl, Move, HotkeyText, w%text_w% Center
      
          if (GuiPosition = "Top")
              gui_y := ActWin_Y
          else
              gui_y := (ActWin_Y+ActWin_H) - 115 - 50
      
          Gui, Show, NoActivate x%ActWin_X% y%gui_y% h%GuiHeight% w%text_w%
      }
      
      GetKeyStr() {
          static modifiers := ["Ctrl", "Shift", "Alt", "LWin", "RWin"]
          static repeatCount := 1
      
          for i, mod in modifiers {
              if GetKeyState(mod)
                  prefix .= mod " + "
          }
      
          if (!prefix && !ShowSingleKey)
              throw
      
          key := SubStr(A_ThisHotkey, 3)
      
          if (key ~= "i)^(Ctrl|Shift|Alt|LWin|RWin)$") {
              if !ShowSingleModifierKey {
                  throw
              }
              key := ""
              prefix := RTrim(prefix, "+ ")
      
              if ShowModifierKeyCount {
                  if !InStr(prefix, "+") && IsDoubleClickEx() {
                      if (A_ThisHotKey != A_PriorHotKey) || ShowStickyModKeyCount {
                          if (++repeatCount > 1) {
                              prefix .= " ( * " repeatCount " )"
                          }
                      } else {
                          repeatCount := 0
                      }
                  } else {
                      repeatCount := 1
                  }
              }
          } else {
              if ( StrLen(key) = 1 ) {
                  key := GetKeyChar(key, "A")
              } else if ( SubStr(key, 1, 2) = "sc" ) {
                  key := SpecialSC(key)
              } else if (key = "LButton") && IsDoubleClick() {
                  key := "Double-Click"
              }
              _key := (key = "Double-Click") ? "LButton" : key
      
              static pre_prefix, pre_key, keyCount := 1
              global tickcount_start
              if (prefix && pre_prefix) && (A_TickCount-tickcount_start < 300) {
                  if (prefix != pre_prefix) {
                      result := pre_prefix pre_key ", " prefix key
                  } else {
                      keyCount := (key=pre_key) ? (keyCount+1) : 1
                      key := (keyCount>2) ? (key " (" keyCount ")") : (pre_key ", " key)
                  }
              } else {
                  keyCount := 1
              }
      
              pre_prefix := prefix
              pre_key := _key
      
              repeatCount := 1
          }
          return result ? result : prefix . key
      }
      
      SpecialSC(sc) {
          static k := {sc046: "ScrollLock", sc145: "NumLock", sc146: "Pause", sc123: "Genius LuxeMate Scroll"}
          return k[sc]
      }
      
      ; by Lexikos - https://autohotkey.com/board/topic/110808-getkeyname-for-other-languages/#entry682236
      GetKeyChar(Key, WinTitle:=0) {
          thread := WinTitle=0 ? 0
              : DllCall("GetWindowThreadProcessId", "ptr", WinExist(WinTitle), "ptr", 0)
          hkl := DllCall("GetKeyboardLayout", "uint", thread, "ptr")
          vk := GetKeyVK(Key), sc := GetKeySC(Key)
          VarSetCapacity(state, 256, 0)
          VarSetCapacity(char, 4, 0)
          n := DllCall("ToUnicodeEx", "uint", vk, "uint", sc
              , "ptr", &state, "ptr", &char, "int", 2, "uint", 0, "ptr", hkl)
          return StrGet(&char, n, "utf-16")
      }
      
      IsDoubleClick(MSec = 300) {
          Return (A_ThisHotKey = A_PriorHotKey) && (A_TimeSincePriorHotkey < MSec)
      }
      
      IsDoubleClickEx(MSec = 300) {
          preHotkey := RegExReplace(A_PriorHotkey, "i) Up$")
          Return (A_ThisHotKey = preHotkey) && (A_TimeSincePriorHotkey < MSec)
      }
      
      HideGUI() {
          Gui, Hide
      }
      
      esc::exitapp    
      ;---------------------------------------------
      ; ChangeLog : v2.22 (2017-02-25) - Now pressing the same combination keys continuously more than 2 times,
      ;                                  for example press Ctrl+V 3 times, will displayed as "Ctrl + v (3)"
      ;             v2.21 (2017-02-24) - Fixed LWin/RWin not poping up start menu
      ;             v2.20 (2017-02-24) - Added displaying continuous-pressed combination keys.
      ;                                  e.g.: With CTRL key held down, pressing K and U continuously will shown as "Ctrl + k, u"
      ;             v2.10 (2017-01-22) - Added ShowStickyModKeyCount option
      ;             v2.09 (2017-01-22) - Added ShowModifierKeyCount option
      ;             v2.08 (2017-01-19) - Fixed a bug
      ;             v2.07 (2017-01-19) - Added ShowSingleModifierKey option (default is True)
      ;             v2.06 (2016-11-23) - Added more keys. Thanks to SashaChernykh.
      ;             v2.05 (2016-10-01) - Fixed not detecting "Ctrl + ScrollLock/NumLock/Pause". Thanks to lexikos.
      ;             v2.04 (2016-10-01) - Added NumpadDot and AppsKey
      ;             v2.03 (2016-09-17) - Added displaying "Double-Click" of the left mouse button.
      ;             v2.02 (2016-09-16) - Added displaying mouse button, and 3 settings (ShowMouseButton, FontSize, GuiHeight)
      ;             v2.01 (2016-09-11) - Display non english keyboard layout characters when combine with modifer keys.
      ;             v2.00 (2016-09-01) - Removed the "Fade out" effect because of its buggy.
      ;                                - Added support for non english keyboard layout.
      ;                                - Added GuiPosition setting.
      ;             v1.00 (2013-10-11) - First release.
      ;--------------------------------------------
      

      【讨论】:

        猜你喜欢
        • 2011-04-08
        • 2021-02-22
        • 2011-08-11
        • 2011-11-02
        • 1970-01-01
        • 2017-12-27
        • 1970-01-01
        • 2014-08-19
        相关资源
        最近更新 更多