Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

[Funktion] KeyName - Namen von Tasten ermitteln


  • Please log in to reply
8 replies to this topic
Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

AHK 1.1 hat bereits BuildIn-Funktionen dafür...

http://www.autohotke...tteln/?p=570678

                                                   

 

Hallo,

 

Schreibe gerade an einem neuen Projekt und hab dafür eine Funktion benötigt, mit der man anhand des VK (Virtual Keycode) einer Taste den Namen dieser in der Systemsprache rausfinden kann.

Selbstverständlich wollte ich ja schließlich nicht extra dafür ganze Tabellen schreiben wink.png

Hier also die Funktion:

KeyName(vk)
{
  VarSetCapacity(b, 256, 0)
  sc := (DllCall("MapVirtualKey", "uint", vk, "uint", 0, "uint")<<16)|(0x1<<25)
  if (!((vk<=32) ? 1 : ((vk!=0x6F) ? DllCall("ToAscii", "uint", vk, "uint", sc, "ptr", &b, "ushort*", tmp, "uint", 1) : 0)))
    sc |= 0x1<<24
  DllCall("GetKeyNameTextW", "uint", sc, "ptr", &b, "int", 128)
  return StrGet(&b, 128, "utf-16")
}

Einfach für den Parameter "vk" den Virtuellen Keycode eintragen und zurückgegeben wird der Name



Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

Noch ein kleines Script mit dem Ihr die Keycodes rausfinden könnt, das auch den Namen der Taste zeigt.

 

Gui, add, text, x5 y5 w200 h200 vTxt, Any key...
Gui, margin, 5, 5
Gui, show,, Any key
OnMessage(0x100, "Keydown")
OnMessage(0x101, "Keyup")
return

Keydown(wParam, lParam)
{
  s := "VK:`t" wParam "`n"
  s .= "SC:`t" ((lParam>>16)&((1<<12)-1)) "`n"
  s .= "Name:`t" KeyName(wParam)
  GuiControl,, Txt, % s
}

KeyUp(wParam, lParam)
{
  GuiControl,, Txt
}

KeyName(vk)
{
  VarSetCapacity(b, 256, 0)
  sc := (DllCall("MapVirtualKey", "uint", vk, "uint", 0, "uint")<<16)|(0x1<<25)
  if (!((vk<=32) ? 1 : ((vk!=0x6F) ? DllCall("ToAscii", "uint", vk, "uint", sc, "ptr", &b, "ushort*", tmp, "uint", 1) : 0)))
    sc |= 0x1<<24
  DllCall("GetKeyNameTextW", "uint", sc, "ptr", &b, "int", 128)
  return StrGet(&b, 128, "utf-16")
}

 

 



IsNull
  • Moderators
  • 990 posts
  • Last active: May 15 2014 11:56 AM
  • Joined: 10 May 2007

Nice! Gerade für spezielle Tasten / Keyboards ist das sicher nützlich. (Oder wenn man wie ich bei nem Mac etwas unbeholfen in der VM gewisse Shortcuts adaptieren will, aber durch die 10 Layer die Keys sehr komisch gemapt werden. (Mac Keyboard-->OS X Shortcuts-->VM-Mapping--> Windows)) confused.png



Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

Hab das Ganze noch etwas verbessert...

 

VK(key)
{
  static k := {space:32, tab:9, enter:13, return:13, esc:27, escape:27, backspace:8, bs:8, delete:46, del:46
  , insert:45, ins:45, home:36, end:35, pgup:33, pgdn:34, up:38, down:40, left:37, right:39, scrolllock:145
  , capslock:20, numlock:144, appskey:93, lwin:91, rwin:92, control:17, ctrl:17, alt:18, shift:16, lcontrol:162
  , lctrl:162, rcontrol:163, rctrl:163, lshift:160, rshift:161, lalt:164, ralt:165, printscreen:42, ctrlbreak:3
  , pause:19, break:19, help:47, sleep:95, lbutton:1, rbutton:2, mbutton:4, xbutton1:5, xbutton2:6}
  static n := {0:96, 1:97, 2:98, 3:99, 4:100, 5:101, 6:102, 7:103, 8:104, 9:105, dot:110, div:111, mult:106
  , add:107, sub:109, enter:13, ins:45, end:35, down:40, pgdn:34, left:37, clear:12, right:39, home:36, up:38
  , pgup:33, del:46}
  static b := {back:166, forward:167, refresh:168, stop:169, search:170, favorites:171, home:172}
  static v := {mute:173, down:174, up:175}
  static m := {next:176, prev:177, stop:178, pause_play:179}
  static l := {mail:180, media:181, app1:182, app2:183}
  StringLower, key, key
  if (regexmatch(key, "i)^vk([0-9a-fA-F]*)", m))
    return substr("0x" m1, 1, 0xff)+0
  if (regexmatch(key, "i)^sc([0-9]*)", m))
    return DllCall("MapVirtualKey", "uint", m1, "uint", 1, "uint")
  if (k[key])
    return k[key]
  for k,o in {numpad:n, browser:b, volume:v, media:m, launch:l}
  {
    if (regexmatch(key, "i)^" k "_(.*)", m) && o[m1])
      return o[m1]
  }
  if (regexmatch(key, "i)^f([0-9]{1,2})$", m))
    return 121+m1
  StringUpper, key, key
  if (regexmatch(key, "^[0-9A-Z]$"))
    return asc(key)
}

SC(key)
{
  VarSetCapacity(b, 256, 0)
  sc := (DllCall("MapVirtualKey", "uint", vk := VK(key), "uint", 0, "uint")<<16)|(0x1<<25)
  if (!((vk<=32) ? 1 : ((vk!=0x6F) ? DllCall("ToAscii", "uint", vk, "uint", sc, "ptr", &b, "ushort*", tmp, "uint", 1) : 0)))
    sc |= 0x1<<24
  return sc
}

KeyName(key, T=1)
{
  vk := VK(key)
  if (vk>=112 && vk<=135)
    return "F" vk-121
  VarSetCapacity(b, 256, 0)
  s := StrGet(&b, DllCall("GetKeyNameTextW", "uint", SC(key), "ptr", &b, "int", 128), "utf-16")
  if (T)
    StringUpper, s, s, T
  return s
}

VK(key) - Ermittelt den Virtuellen Keycode (VK)

SC(key) - Ermittelt den Scancode (SC) der Taste

KeyName(key) - Ermittelt den Namen der Taste

 

Für den Parameter key sind nur noch Angaben, wie in den AHK-Funktionen (bsp.: GetKeyState) möglich.

Einige Tasten die vom Keyboard-layout abhängig sind (ä, ö, ü, ß, ?, ...) funktionieren nicht.

Diese müssten mit vkXX (zB "vkDE" für "Ä") oder scXXX, wie in der AHK-Dokumentation beschrieben (key list -> Special Keys) angegeben werden.



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Wie stehts mit den SCs und VKs für Alt und Windows tasten? Ich wusste zwar noch nicht das du mit der Gameengine -OpenGL Lib kann man es bei dem Umfang wirklich nicht nennen- so weit bist. Aber die Tasten wirst du für Spiele auch benötigen. Aber wirklich Prima Arbeit. EDIT: Damit Ihr nicht wie ich in die Falle lauft und die Werte 1:1 übertragt hab ich das Skript so verändert , dass es jetzt auch die Hexzahlen ausgibt.

#Persistent
Gui, add, text, x5 y5 w200 h200 vTxt, Any key...
Gui, margin, 5, 5
Gui, show,, Any key
OnMessage(0x100, "Keydown")
OnMessage(0x101, "Keyup")
hiddenFolder := "C:\test\7154~1"
return
SC273::
If varPostS1:=!varPostS1
DllCall( "DefineDosDevice", UInt,0, Str,"X:", Str,hiddenFolder )
Else
DllCall( "DefineDosDevice", UInt,1|2, Str,"X:", Int,0 )
return

Keydown(wParam, lParam)
{
  s := "VK:`t" wParam  "  Hex:`t" Hex(wParam,2)  "`n" 
  s .= "SC:`t" ((lParam>>16)&((1<<12)-1))"  Hex:`t" Hex((lParam>>16)&((1<<12)-1),3)  "`n" 
  s .= "Name:`t" KeyName(wParam)
  GuiControl,, Txt, % s
}

KeyUp(wParam, lParam)
{
  GuiControl,, Txt
}

Hex(nr,n=8)
{
static k:={"10":"A","11":"B","12":"C","13":"D","14":"E","15":"F"}

var:=16**(n-1)
str:=""
loop , % n
{
str.=(v:=nr//var)>9 ? k[(v<16 ? v : 15) . ""] : v . ""
nr-=var*v
var:=var//16
}
return str
}

KeyName(vk)
{
  VarSetCapacity(b, 256, 0)
  sc := (DllCall("MapVirtualKey", "uint", vk, "uint", 0, "uint")<<16)|(0x1<<25)
  if (!((vk<=32) ? 1 : ((vk!=0x6F) ? DllCall("ToAscii", "uint", vk, "uint", sc, "ptr", &b, "ushort*", tmp, "uint", 1) : 0)))
    sc |= 0x1<<24
  DllCall("GetKeyNameTextW", "uint", sc, "ptr", &b, "int", 128)
  return StrGet(&b, 128, "utf-16")
}

 


Visit the new forum ahkscript.org.

http://ahkscript.org


Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

Wer sagt, dass das für die Game-Engine ist?

Die Gameengine wird ja sowieso ein längerfristigeres Projekt.wink.png



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

GetKeyName(), GetKeySC(), GetKeyVK()

 

#NoEnv
MsgBox, % GetWinKeyName("Numpad5")
ExitApp

GetWinKeyName(Key) { ; http://l.autohotkey.net/docs/KeyList.htm -> Keyboard
   VarSetCapacity(Name, 256, 0)
   DllCall("User32.dll\GetKeyNameText", "UInt", (GetKeySC(Key) << 16), "Str", Name, "Int", 128)
   Return Name
}

Prefer ahkscript.org for the time being.


Bentschi
  • Moderators
  • 120 posts
  • Last active: Sep 05 2014 02:12 AM
  • Joined: 26 Nov 2008

Haha, die kannte ich noch nicht shy.png



garry
  • Spam Officer
  • 3219 posts
  • Last active: Sep 20 2018 02:47 PM
  • Joined: 19 Apr 2005

danke Bentschi,

wie sieht ein GUI zu Deinem 2.-tem Beispiel aus ?