Sooo....
Ich weiß, das wurde schon 3 Millionen mal gefragt, aber ich habe nichts wirklich hilfreiches gefunden.
Ich möchte nähmlich, dass beim Drücken einer vom Benutzer vorher durch eine Inputbox festgelegte Tastenkombination eine Funktion ausgeführt wird.
Ich bekomme das einfach nicht hin.
Und mit _IsPressed wüsste ich nicht wie ich die Buchstaben etc. in Hex konvertieren könnte, damit man sie mit _IsPressed benutzen könnte.
Bitte helfen!
Danke...
Tastenkombination !?
-
- [ offen ]
-
Hugbert -
28. August 2011 um 14:37 -
Geschlossen -
Erledigt
-
-
_isPressed() ist gaaanz einfach, guck mal in der Hilfedatei nach, da stehen die Nummern dafür.
-
Ja klar, IsPressed ist einfach, aber ich kann ja in die InputBox nicht "364+124+342" reinschreiben, sondern "a+b+c".
Und a+b+c müssten dann ja iwie in die Zahlen konvertiert werden. -
-
Hmm, aber IsPressed ist auch nicht so ideal, da die Funktion sofort ausgeführt werden soll, daher müsse ich eine While Schleife ohne Sleeps nehmen, und dann is der PC so langsam
-
hm, stimmt, versuchs mal mit HotKeySet()
-
Ja, aber damit kann man nicht gleichzeitig "a+b" machen, sondern nur eine Kombination mit Strg, Alt und Shift + Buchstabe.
-
Hm, normale Tastenkombinationen basieren eigentlich auf einer Kombination aus {Shift;Alt;Win;Strg} + belibige Taste.
Und solche Kombinationen lassen sich recht einfach mit Hotkeyset übersetzen:Spoiler anzeigen
[autoit]#include <ComboConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>Global $hk = ""
[/autoit] [autoit][/autoit] [autoit]
Guicreate("Tastenkombination", 200, 100)
$Check1 = GUICtrlCreateCheckbox("Shift", 0, 0, 100, 25)
$Check2 = GUICtrlCreateCheckbox("Strg", 0, 25, 100, 25)
$Check3 = GUICtrlCreateCheckbox("Win", 0, 50, 100, 25)
$Check4 = GUICtrlCreateCheckbox("Alt", 0, 75, 100, 25)
GuiCtrlCreateLabel("+", 100, 0)
$Combo1 = GuiCtrlCreateCombo("a", 150, 0, 50, 25, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))
GUICtrlSetData(-1, "b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|1|2|3|4|5|6|7|8|9|0")
$Button1 = GuiCtrlCreateButton("Übernehmen", 100, 50, 100, 50)
Guisetstate()While 1
[/autoit] [autoit][/autoit] [autoit]
sleep(40)
$msg = GuiGetMsg()
Switch $msg
Case -3
ExitCase $Button1
[/autoit] [autoit][/autoit] [autoit]
_SetHk()
EndSwitch
WEndFunc _SetHk()
[/autoit] [autoit][/autoit] [autoit]
HotkeySet($hk)
$hk = ""
If GUICtrlRead($Check1) = $GUI_CHECKED Then $hk &= "+"
If GUICtrlRead($Check2) = $GUI_CHECKED Then $hk &= "^"
If GUICtrlRead($Check3) = $GUI_CHECKED Then $hk &= "#"
If GUICtrlRead($Check4) = $GUI_CHECKED Then $hk &= "!"
$hk &= GuiCtrlRead($Combo1)
HotkeySet($hk, "_test")
EndFuncFunc _test()
[/autoit]
MsgBox(0, "test", "test")
EndFuncMfG,
FresaporeEdit: Letzten Post übersehen :pinch:
Aber ich sehe den Sinn auch nicht so ganz..Edit2:
Wenn es sich nur um Buchstaben handelt: Man kann dann aber mit asc() den Ascii-Wert jedes Buchstabens erhalten, den mittels Hex() umrechnen, welcher dem "_Ispressed"-Code entspricht. -
Sry, aber das hilft mir nicht so wirklich
Das wusste ich ja schon, wie man es anwendet auch. -
Du kannst doch einen Sleep einbauen?
ein sleep(10) merkt man doch nicht?
-
Ist jetzt nur so hingeklatscht, aber vllt ist ess das was du meinst:
Spoiler anzeigen
[autoit]#include <ComboConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <misc.au3>Global $hex = "", $hex2 = ""
[/autoit] [autoit][/autoit] [autoit]
Guicreate("Tastenkombination", 200, 100)
$Combo1 = GuiCtrlCreateCombo("a", 0, 0, 50, 25, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))
GUICtrlSetData(-1, "b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z")
GuiCtrlCreateLabel("+", 100, 0)
$Combo2 = GuiCtrlCreateCombo(" ", 150, 0, 50, 25, BitOR($CBS_DROPDOWNLIST, $WS_VSCROLL))
GUICtrlSetData(-1, "a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z")
$Button1 = GuiCtrlCreateButton("Übernehmen", 0, 50, 200, 50)
Guisetstate()While 1
[/autoit] [autoit][/autoit] [autoit]
sleep(40)
$msg = GuiGetMsg()
Switch $msg
Case -3
ExitCase $Button1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_SetHk()
EndSwitch
If Not $hex = "" Then
If _Ispressed($hex) Then
If Not $hex2 = "" Then
If _IsPressed($hex2) Then _test()
Else
_test()
EndIf
EndIf
EndIf
WEndFunc _SetHk()
[/autoit] [autoit][/autoit] [autoit]
$let = GuiCtrlRead($Combo1)
$asc = Asc($let) - 32
$hex = Hex($asc)
$let = GuiCtrlRead($Combo2)
If $let = " " Then
$hex2 = ""
Return
EndIf
$asc = Asc($let) - 32
$hex2 = Hex($asc)
EndFuncFunc _test()
[/autoit]
MsgBox(0, "test", "test")
EndFuncIch glaub ich seh den Wald vor lauter Bäumen nicht..:D
-
Ich erkläre es mal so:
[autoit]
Ich habe eine Funktion:Func _Show
[/autoit]
"Blablabla"
EndFunc
Und eine Inputbox, in die ich z.B. "g+a+e" reinschreibe, oder "d+a", sowas halt.
Nun möchte ich, dass wenn g,a und e oder halt d und a gleichzeitig gedrückt werden, die Funktion _Show ausgeführt wird. -
Macht mein letztes doch, ausser dass du die Buchstaben nicht in ne Inputbox schreiben kannst, sondern in ner Combo auswählen kannst.
Das sollte aber ja nicht so schwer zu verändern sein. -
Schreib ein Array mit allen Zahlen und Nummern und der jeweiligen _isPressed ID, dann lässt du den Inhalt des Iputs nach + Splitten und im Array durchlaufen welches was ist.
Bsp:
a+b+c
(Splitten)
a
b
cSind:
41
42
43PS: Ein 2D Array wäre am sinnvollsten
-
Ich glaube da wäre eine UDF ganz gut für so "unnormale" tastenkombis wie halt a+b+c oder so.
Wenn ich dem nächst zeit hab kann ich mal sowas EVT. ( !!! ) anfangen.
mfg
Hauke -
Das hätte keinen Sinn, da Sleeps unter 10 ms sowieso auf 10 gesetzt werden, da es unter 10 nicht mehr möglich ist.
@ Fresapore
Wie schon gesagt geht es nicht mit _IsPressed, da es absolut keine Verzögerung haben darf.Und für die die es wissen wollen, nein, es ist KEIN BOT!
Es ist ein Programm, um unseren Lehrer ein bisschen auszutricksen Durch die Tastenkombination wird eine Funktion ausgelöst, in der Das ausgewählte Fenster komplett verschwindet, und wenn man wieder drückt, ist es wieder da. Nur auf Sachen wie "Alt+a" kommt er schon, der drückt einfach alles bis was passiert. Das ist uns nähmlich schonmal passiert Und darum will ich es etwas umschreiben. -
also jetzt mal langsam....
Das gleichzeitige drücken von "normalen" Tasten ist gar nicht möglich
Eben dazu gibt es ja Funktionstasten wie Shift, Strg, Alt, etc ...
Der Controller in der Tastatur kann diese Tasten kombinationen gar nicht darstellen.
D.h. sobald Du eine der "normalen" Tasten drückst wird diese auch schon an den PC geschickt.Deine Idee ist meines Erachtens nach gar nicht umsetzbar.
Jetzt hab ich doch noch eine Idee...
Die Auslösung der Funktion benötigt nacheinander 2 Tastenkombinationen
erste Kombination = Shift + Strg
zweite Kombination = Shift + SpaceSpoiler anzeigen
[autoit]#include <Misc.au3>
[/autoit] [autoit][/autoit] [autoit]$dll = DllOpen("user32.dll")
[/autoit] [autoit][/autoit] [autoit]While Sleep (10)
[/autoit] [autoit][/autoit] [autoit]
If _IsPressed("10", $dll) And _IsPressed("11", $dll) Then
While Sleep(10)
If _IsPressed("10", $dll) And _IsPressed("20", $dll) Then
MsgBox(0,"_IsPressed", "End Key Pressed")
ExitLoop 2
EndIf
WEnd
EndIf
WEndDllClose($dll)
[/autoit] -
Ah gute Idee Schnuffel!
Werde ich mal versuchein einzubauen, allerdings mit HotKeySets. -
Warum soll das nicht gehen? ist wie ein makro z.b. ActivAid hat sowas da schreibt man mfg# und er schreibt dir das dann aus jetzt muss man ihn nur sagen das er stattdessen das fenster versteckt. Bin mir nicht sicher aber eventuell bekommste es damit hin: http://de.autohotkey.com/
Ansonsten hätteste glaub ich keine andere wahl als _isPressed zu nehmen oder dir die HotKeySet umzuschreiben.
Gruss DevFly
-
hab den Ansatz nochmal umgebaut für Erweiterung...
Spoiler anzeigen
[autoit]#include <Misc.au3>
[/autoit] [autoit][/autoit] [autoit]$dll = DllOpen("user32.dll")
[/autoit] [autoit][/autoit] [autoit]
Global $code = "", $timer = TimerInit()
While Sleep (10)If _IsPressed("10", $dll) And _IsPressed("11", $dll) And $code <> "1" Then $code &= 1 ; erster Code als Tastenkombination
[/autoit] [autoit][/autoit] [autoit]
If _IsPressed("10", $dll) And _IsPressed("20", $dll) And $code = "1" Then $code &= 2 ; zweiter Code als Tastenkombination
; beliebig erweiterbar ...
If TimerDiff($timer) > 3000 And $code <> "" Then ; maximale Zeitdauer zum Eingeben des Codes als Tastenkombination
$code = ""
$timer = TimerInit()
EndIf
If $code = "12" Then ExitLoop ; beenden, wenn Code stimmt
WEndMsgBox(0,"_IsPressed", "End Key Pressed")
[/autoit]
DllClose($dll)DevFly, für Deine Lösung brauchst Du einen Keyboard Hook.
Das ist bei uns aber nicht gern gesehen, da das auch mißbraucht werden kann. -