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

Wow vielen dank, macht größtenteils genau was ich will :)

 

Jetzt muss nur noch implementiert werden, dass "Volume_Down" nach der Aktion für den langen Tastendruck nicht weiter gesendet wird, sondern die Taste erst einmal wieder losgelassen werden muss.

 

Edit:

 

So funktioniert es nun größtenteils, nur manchmal wird noch einmal vor dem Loslassen "Volume_Down" gesendet?:

Volume_Down::
    hotkey, Volume_Down, off
    state := GetKeyState("Volume_Down", "P")
    keywait, Volume_Down, T.5
    if (ErrorLevel)
        Send {Media_Prev}
    else
        Send {Volume_Down}
    hotkey, Volume_Down, on
    keywait, Volume_Down, L
return

Edit 2:

 

Ok merkwürdige Sache, sobald ich noch ne andere Taste ins Script packe, funktioniert plötzlich nix mehr:

Volume_Down::
    hotkey, Volume_Down, off
    state := GetKeyState("Volume_Down", "P")
    keywait, Volume_Down, T.5
    if (ErrorLevel)
        msgbox Volume_Down lang
    else
        msgbox Volume_Down kurz
    hotkey, Volume_Down, on
    keywait, Volume_Down, L
return

<#F14::
    keywait, F14, T.5
    if (ErrorLevel)
	msgbox test lang
    else
	msgbox test kurz
return

Die Taste mit F14 macht genau was sie soll aber die "Volume_Down" gibt nur noch die kurze Aktion aus und unterscheidet plötzlich nichtmehr zwischen der 'künstlichen' und normalen "Volume_Down"-Taste...



nnnik
  • Members
  • 1625 posts
  • Last active: Apr 11 2017 02:13 PM
  • Joined: 28 Jul 2012

Ich glaube da bin ich jetzt überfragt.

Es kann sein, dass dies ein Fall ist der bei dem Design von Autohotkey oder den zugrundeliegenden Windowsfunktionen nie bedacht wurde.

Es wäre einfacher wenn man beide Tasten doppelt belegt.


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

Überfragt mit beiden Fällen, also auch warum manchmal trotzdem noch vor dem loslassen ein Tastendruck gesendet wird?

Und was meinst du genau mit doppelt belegen? Ist ja eigentlich genau das was ich erreichen will.

 

Immerhin kann ich das notfalls in einem extra Script laufen lassen, funktioniert dann ja komischerweise auch mit 2 auf die gleiche weise neubelegten Tasten:

Volume_Down::
    hotkey, Volume_Down, off
    state := GetKeyState("Volume_Down", "P")
    keywait, Volume_Down, T.5
    if (ErrorLevel)
        msgbox Volume_Down lang
    else
        msgbox Volume_Down kurz
    hotkey, Volume_Down, on
    keywait, Volume_Down, L
return

Volume_Up::
    hotkey, Volume_Up, off
    state := GetKeyState("Volume_Up", "P")
    keywait, Volume_Up, T.5
    if (ErrorLevel)
        msgbox Volume_Up lang
    else
        msgbox Volume_Up kurz
    hotkey, Volume_Up, on
    keywait, Volume_Up, L
return


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

Ok, hier ist mein Workaround für das Problem mit der Funktion mit langen Druck. Aus irgeneinem Grund wird nämlich zusätzlich noch einmal die originale Tastenfunktion gesendet.

t=1

Volume_Down::
if (t=1) {
    t=0
    state := GetKeyState("Volume_Down", "P")
    keywait, Volume_Down, T.5
    if (ErrorLevel)
        Send {Media_Prev}
    else {
	hotkey, Volume_Down, off
        Send {Volume_Down}
	hotkey, Volume_Down, on
	}
    t=1
    keywait, Volume_Down, L
    return
    }
else
    return

Außerdem verliert das Script beim Versuch #UseHook oder '$' einzubauen seine Funktion und auch einige Modifier wie '*', '~' oder '#' funktioneren scheinbar nicht...

 

 

Z.B. Strg & F14 funktioniert:

t=1

Volume_Down::
if (t=1) {
    t=0
    state := GetKeyState("Volume_Down", "P")
[...]

^F14::
    keywait, F14, T.5
    if (ErrorLevel)
	msgbox test lang
    else
	msgbox test kurz
return

Mit Win & F14 oder Strg & Win & F14 verliert das ganze Script seine Funktion:

t=1

Volume_Down::
if (t=1) {
    t=0
    state := GetKeyState("Volume_Down", "P")
[...]

#F14::
    keywait, F14, T.5
    if (ErrorLevel)
	msgbox test lang
    else
	msgbox test kurz
return

Edit: Zu früh gefreut, eine Unterscheidung zwischen künstlicher und echter Taste findet plötzlich wieder nicht statt......



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

So hier ist nun endlich der Code, der für mich funktioniert. Ein etwas anderer Ansatz, der sich einfach die Anzahl an gesendeten 'Tastenschläge' und dessen Verzögerung zunutze macht und so zwischen kurzem, langen und doppeltem Tastendruck unterscheidet :)

#NoEnv
SendMode Input
#Singleinstance force


$Volume_Down::
state := GetKeyState("Volume_Down", "P")
if state=0
	{
	if voldown_presses > 0
		{
		voldown_presses += 1
		return
		}
	voldown_presses = 1
	SetTimer, VolDown, 550	; Zeit die benötigt wird, bis sich die Taste min. 2x wiederholt hat (Volume_Down + Delay + Volume_Down + Volume Down = langer Tastendruck)
	return
	}
else
	Send {Volume_Down}	; Aktion echte Taste
return


VolDown:	; Aktionen 'unechte' Taste
SetTimer, VolDown, off
if voldown_presses = 1
	{
	Send a	; kurz
	}
else if voldown_presses = 2
	{
	Send b	; doppel
	}
else if voldown_presses > 2
	{
	Send c	; lang
	Sleep 600	; Zeit von Settimer + ein paar ms
	}
voldown_presses = 0
return


nnnik
  • Members
  • 1625 posts
  • Last active: Apr 11 2017 02:13 PM
  • Joined: 28 Jul 2012
Toll das du es noch geschafft hast ohne Hilfe.
Glückwunsch.

Visit the new forum ahkscript.org.

http://ahkscript.org


schwarzgrau
  • Members
  • 1 posts
  • Last active: Nov 11 2015 01:39 PM
  • Joined: 01 Nov 2015

Ich weiß nicht ob in diesen alten Thread noch jemand schaut, aber sorgt

else if voldown_presses > 2
    {
    Send c    ; lang
    Sleep 600    ; Zeit von Settimer + ein paar ms
    }

nicht einfach dafür, dass er einen dreifach-druck statt einem langen tastendruck erkennt? Zumindest bei mir funktioniert es leider nur mit einem dreifach-druck.

Ich suche nämlich leider verzweifelt nach einer Möglichkeit einen der Express-Keys an meinem Wacom-Tablet so zu belegen, dass eine andere Funktion aufgerufen wird, wenn man einfach, doppelt oder lange drückt. An sich habe ich auch einen script, der bei der normalen Tastatur funktioniert, nur leider nutzt dieser Errorlevel, was scheinbar bei den Tasten des Tablets nicht funktioniert. Dein Ansatz mit Settimer funktioniert was den einfachen und den doppelten Tastendruck angeht, nur leider nicht beim langen Druck.