Jump to content

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

LastKey


  • Please log in to reply
1 reply to this topic
Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Hallo,

 

AHK bietet ja die Variable "A_LastKey", allerdings werden da nicht alle Tasten berücksichtigt (z.B. Tab, ...).

 

Das folgende Script enthält Auszüge/Zeilen von Lexikos.

 

Diese Variable beinhaltet alle gängigen Tasten und gibt den Namen dieser zurück (z.B. 1 , 2 , 3 , a , A , / , ß , Enter , Tab , F1 , usw.).

-Bei den Buchstaben wird zwischen Groß-/Kleinschreibung unterschieden (Shift oder Caps aktiv).

-Bei den Zahlen wird bei aktivem Shift/Caps das entsprechende Zeichen ausgegeben

-Bei den Steuertasten wird eine aktiv gedrückte Shift-Taste berücksichtigt (z.B. Tab und +Tab), da dieses oft einen Einfluss auf die Funktion hat (z.B. Tab = nächstes Feld , Shift-Tab = "vorheriges Feld"  , usw.)

Bei Bedarf kann die Funktion welche ich bei Shift verwende auch bei Alt oder Control eingesetzt werden. Das habe ich bisher nicht gemacht weil mir bisher kein Nutzen dafür bekannt ist.

 

Hier ist der Code:

 

LastKey.ahk

#InstallKeybdHook
OnMessage(0x100, "LastKey") ; WM_KEYDOWN / WM_KEYFIRST
OnMessage(0x201, "LastKey") ; WM_LBUTTONDOWN
OnMessage(0x204, "LastKey") ; WM_RBUTTONDOWN

LastKey(key)
{
    global LastKey
    ;folgende Zeilen stammen von Lexikos
    ;-------------------------------
    if !hwndEdit
    {
        dhw := A_DetectHiddenWindows
        DetectHiddenWindows, On
        Process, Exist
        ControlGet, hwndEdit, Hwnd,, Edit1, ahk_class AutoHotkey ahk_pid %ErrorLevel%
        DetectHiddenWindows, %dhw%
       
        astr := A_IsUnicode ? "astr":"str"
        ptr := A_PtrSize=8 ? "ptr":"uint"
        hmod := DllCall("GetModuleHandle", "str", "user32.dll")
        pSFW := DllCall("GetProcAddress", ptr, hmod, astr, "SetForegroundWindow")
        pSW := DllCall("GetProcAddress", ptr, hmod, astr, "ShowWindow")
        DllCall("VirtualProtect", ptr, pSFW, ptr, 8, "uint", 0x40, "uint*", 0)
        DllCall("VirtualProtect", ptr, pSW, ptr, 8, "uint", 0x40, "uint*", 0)
        bkpSFW := NumGet(pSFW+0, 0, "int64")
        bkpSW := NumGet(pSW+0, 0, "int64")
    }

    if (A_PtrSize=8)
    {
        NumPut(0x0000C300000001B8, pSFW+0, 0, "int64")  ; return TRUE
        NumPut(0x0000C300000001B8, pSW+0, 0, "int64")   ; return TRUE
    }
    else
    {
        NumPut(0x0004C200000001B8, pSFW+0, 0, "int64")  ; return TRUE
        NumPut(0x0008C200000001B8, pSW+0, 0, "int64")   ; return TRUE
    }

    KeyHistory ; KeyHistory aufrufen

    NumPut(bkpSFW, pSFW+0, 0, "int64")
    NumPut(bkpSW, pSW+0, 0, "int64")
   
    ControlGetText, text,, ahk_id %hwndEdit%  ; Den Inhalt der KeyHistory in der Variable "text" speichern.
    ;---------------------

    ;Letzte Taste herausfiltern
    loop, parse, text, `n
    {
        if A_LoopField contains Press [F5] to refresh.  ; letzte "gelesene" Zeile
            break
        Zeile := A_LoopField ; letzte "gemerkte" Zeile
    }
    LastKey := RegExMatch(Zeile,"^.*[0-9]+\.[0-9]+\s+(\S+)",hit)
    LastKey := hit1
    
    ;~ Taste bei AlrGr (RAlt) anpassen ...
    if GetKeyState("RAlt", "P")  ; AltGr (RAlt) wird gehalten...
        if (LastKey = "ß")
            LastKey = \
        
    ;Taste bei Shift oder CapsLock anpassen...
    if !(GetKeyState("Shift", "P") || GetKeyState("CapsLock", "T"))  ; Kleinschreibung (Shift und CAPS) nicht aktiv
    {
        if RegExMatch(LastKey,"^[A-Z]$") ; Buchstaben A-Z
            StringLower, LastKey, hit1
    }
    else ; Großschreibung (Shift oder CAPS) aktiv
    {
        ShiftCapsListe := "1-!|2-""|3-§|4-$|5-%|6-&|7-/|8-(|9-)|0-=|ä-Ä|ü-Ü|ö-Ö|ß-?|#-'|+-*|<->|^-°|.-:|,-;"
        Loop, parse, ShiftCapsListe, |
        {
            RegExMatch(A_LoopField,"^(.)\-(.)$",hit)
            if (LastKey = hit1)
                LastKey := hit2
        }
        
        if GetKeyState("Shift", "P") ; Nur wenn Shift gehalten wird (unabhängig von CAPS)
            ShiftListe := "LButton|RButton|LControl|RControl|Enter|Tab|CapsLock|Escape|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12"
        Loop, parse, ShiftListe, |
        {
            If (LastKey = A_LoopField)
                LastKey := "+" . LastKey
        }        
    }
return
}

 

 

Eingebunden wird Lastkey per Include (alternativ den Code direkt mit ins Script kopieren)

#Include Lastkey.ahk

 

 

Wichtig:

Bei Verwendung mit gLabels muss ein Delay verwendet werden, da der Thread ansonsten wahrscheinlich noch nicht fertig ist und man dementsprechend nicht Taste in LastKey sieht welche das gLabel ausgelöst hat. Ein Delay von 10 ms sollte ausreichen, wer sicher gehen will kann ja 50 ms verwenden.

z.B.

Vom_gLabel_gestartet:
    ohneDelay := LastKey
    Sleep, 20
    mitDelay := LastKey
    Msgbox, ohneDelay (kann falsch sein) = %ohneDelay%`nmitDelay (sollte stimmen) = %mitDelay%
return

 

Um LastKey in einer Funktion zu verwenden muss man LastKey als globale Variable deklarieren:

Funktion()
{
    global LastKey
    ; hier kommt der Funktionsinhalt hin
return
}

 

 

Ich hoffe ihr könnt es gebrauchen :-)

 

Gruß,

Holle


Edited by Dr_Holle, 28 March 2013 - 12:58 AM.


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

Ich habe das ganze OT gesplittet, siehe hier. - Bitte beschränkt die Diskussion hier auf das Skript LastKey. :)