Jump to content

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

Mehrere Tasten mit 'long-press' doppelt belegen



  • Please log in to reply
21 replies to this topic
stormi
  • Members
  • 17 posts
  • Last active: Mar 26 2014 01:09 AM
  • Joined: 25 Nov 2012

Hallo,

habe Probleme meine Tastenumbelegung zum laufen zu bekommen.

 

Zum einen will ich diese von einem Treiber ausgelösten von 'echten' Tasten unterscheiden was hiermit schonmal funktioniert:

$Volume_Down::
state := GetKeyState("Volume_Down", "P")
if state=0
	MsgBox test  ; 'unechte' Taste
else
	Send {Volume_Down}  ; echte Taste
return

Jetzt möchte ich diese unechte Taste noch mit einer 'gedrückt-halten' Aktion doppelt belegen. Allgemein sieht der funktionierende Code hier so aus:

$Volume_Down::
  KeyWait, Volume_Down, T.5
  if ErrorLevel
	MsgBox test 1
  else
	MsgBox test 2
Return

Zum einen hab ich jetzt das Problem, sobald ich allein mit dem 2. Codeteil die MsgBox mit 'Send {Volume_Down}' ersetze, nur noch 'Send {Volume_Down}' ausgeführt wird, egal ob kurz oder lang gedrückt wird.

Und zweitens würde ich gerne wissen, wie man beides miteinander kombiniert, sprich:

 

Vol_Down echt -> Vol_Down

Vol_Down unecht -> kurz -> Vol_Down

                            -> lang -> andere Aktion



nnnik
  • Members
  • 1625 posts
  • Last active: Apr 11 2017 02:13 PM
  • Joined: 28 Jul 2012
Wie wird denn die unechte Taste gedrückt?

Visit the new forum ahkscript.org.

http://ahkscript.org


strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

vllt sowas


$Volume_Down::

    state := GetKeyState("Volume_Down", "P")

    if (state = 0)

        {

        KeyWait, Volume_Down, T.5

        if ErrorLevel

            MsgBox test 1

        else

            MsgBox test 2

        }

    else

        {

        MsgBox test 3

        }

return


Regards,
Babba

stormi
  • Members
  • 17 posts
  • Last active: Mar 26 2014 01:09 AM
  • Joined: 25 Nov 2012

@nnnik: Die 'echten' Tasten sind die von der Tastatur, die 'unechten' Tasten befinden sich am Display von meinem Convertible. Unecht daher, da sie von AHK als 'Artificial' erkannt werden. Gedrückt werden beide natürlich von Hand ;)

 

@strobo: So hab ich es auch schon versucht nur funktioniert so der lange Tastendruck wieder nicht mehr und ich bekomme immer nur 'test 2' ausgegeben :(



stormi
  • Members
  • 17 posts
  • Last active: Mar 26 2014 01:09 AM
  • Joined: 25 Nov 2012

Hmm kann keiner weiterhelfen?



nnnik
  • Members
  • 1625 posts
  • Last active: Apr 11 2017 02:13 PM
  • Joined: 28 Jul 2012
Das Problem ist soweit ich das sehe das Dollar Zeichen.
GetKeyState("Volume_Down", "P") gibt dann in diesem Label immer 0 zurück, sogar wenn man die Taste richtig drückt.
Der KeyWait Befehl reagiert anders aber halt auch nicht richtig.
 
Also muss man das $ Zeichen entfernen, das ist aber auch nur die Hälfte der Lösung.
Wenn wir einfach das Dollar Zeichen entfernen, wird dein Hotkey nicht richtig funktionieren, da du ja die Taste selber senden wirst, und dadurch nur wieder den Hotkey auslösen würdest und nicht das gewünschte Ereignis auslösen würdest.
 
Also was könnte man tun?
Man könnte während der Hotkey ausgeführt wird, den Hotkey selber deaktivieren und danach wieder aktivieren.
Dafür könnte man einfach den Suspend-Befehl benutzen, der einfach alle Hotkeys deaktiviert und danach aktiviert:
Volume_Down::
    Suspend,On
    if (GetKeyState("Volume_Down", "P") = 0)
        {
        KeyWait, Volume_Down, T.5
        if ErrorLevel
            MsgBox test 1
        else
            MsgBox test 2
        }
    else
        {
        MsgBox test 3
        }
Suspend,Off
return

Visit the new forum ahkscript.org.

http://ahkscript.org


stormi
  • Members
  • 17 posts
  • Last active: Mar 26 2014 01:09 AM
  • Joined: 25 Nov 2012

Klappt leider auch nicht, so kommt egal wie ich interagiere jedesmal nur 'test 3' bei raus :/



nnnik
  • Members
  • 1625 posts
  • Last active: Apr 11 2017 02:13 PM
  • Joined: 28 Jul 2012
Willst du eigentlich nur die Sondertaste neu belegen?

Visit the new forum ahkscript.org.

http://ahkscript.org


stormi
  • Members
  • 17 posts
  • Last active: Mar 26 2014 01:09 AM
  • Joined: 25 Nov 2012

Jup, wäre schön wenn das funktionieren würde.



nnnik
  • Members
  • 1625 posts
  • Last active: Apr 11 2017 02:13 PM
  • Joined: 28 Jul 2012
Gut die Taste wird soweit ich es von Hier ablesen kann nicht als Artificial erkannt.
Das getKeyState("Volume_Down","P") 0 ausgibt liegt daran, dass du wieder einen Hotkey mit $ benutzt hast.
 
Die einzige Möglichkeit mit Autohotkey internen Befehlen die beiden Tasten jetzt noch auseinander zu halten ist per Scancode und VirtualKey.
Es kann sein, dass es klappt muss aber nicht. -.-
Aber einen Versuch ist es wert. :D
 
Zuerst musst du den Scancode sowie den Virtualkey von beiden Tasten auslesen.
Hier gibt es dazu eine Anleitung:
http://ragnar-f.gith...htm#SpecialKeys

Visit the new forum ahkscript.org.

http://ahkscript.org


stormi
  • Members
  • 17 posts
  • Last active: Mar 26 2014 01:09 AM
  • Joined: 25 Nov 2012

Das ist es ja, Scancode und VirtualKey sind für beide Tasten gleich, sie lassen sich nur durch Artificial unterscheiden.



nnnik
  • Members
  • 1625 posts
  • Last active: Apr 11 2017 02:13 PM
  • Joined: 28 Jul 2012
Nein sie sind exakt gleich es sei den du hättest ein i bei dem einen stehen.

Visit the new forum ahkscript.org.

http://ahkscript.org


garry
  • Spam Officer
  • 3219 posts
  • Last active: Feb 06 2016 09:32 PM
  • Joined: 19 Apr 2005

habe kein Volume_down Knopf, hier 2 Beispiele mit :

F11 = kurz oder langdrücken

F12 = einmal oder 2-mal drücken

;------------ hotkeyx ----------------
;- http://www.autohotkey.com/board/topic/15574-morse-find-hotkey-press-and-hold-patterns/
;- http://www.autohotkey.com/board/topic/9166-fkee3/
;- http://www.autohotkey.com/board/topic/35566-rapidhotkey/


;-- example-1   longpress F11
$F11::
a:=a_tickcount
KeyWait, F11
delta:=a_tickcount - a
if (delta<500)
        msgbox, 262144, F11-Key,kleiner als 500 msec %delta% msec,2
else
        msgbox, 262144, F11-Key,greater  500 msec %delta% msec,2
return
esc::exitapp
;====================================

;-- example-2   F12 2* drücken
$F12::
   p := Morse()
   If (p = "00")
        msgbox, 262144, F12-Key, F12 Doppelt gedrückt,2
      else
        msgbox, 262144, F12-Key, F12 Einmal  gedrückt,2
return

Morse(timeout = 400)
{
   tout := timeout/1000
   key := RegExReplace(A_ThisHotKey,"[\*\~\$\#\+\!\^]")
   Loop
       {
      t := A_TickCount
      KeyWait %key%
      Pattern .= A_TickCount-t > timeout
      KeyWait %key%,DT%tout%
      If (ErrorLevel)
         Return Pattern
       }
}
return
;===============================



stormi
  • Members
  • 17 posts
  • Last active: Mar 26 2014 01:09 AM
  • Joined: 25 Nov 2012

@nnnik: Hier ein Screenshot was Autohotkey sagt:

unbenannt3gdny.png

 

Bin mit meinem Problem leider immer noch nicht weitergekommen :(



strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012

zum durchtesten:

volume_down::
    hotkey, volume_down, off
    state := GetKeyState("Volume_Down", "P")
    traytip,% state ? "phys" : "art"
    KeyWait, Volume_Down, T.5
    if (ErrorLevel)
        MsgBox test 1
    else
        Send {Volume_Down}
    hotkey, volume_down, on
return

Regards,
Babba