gleiches _IsPressed für verschiedene Inputfeldern

  • Hey Leute...
    ich wollte mal fragen ob es möglich ist, dass die selben _IsPressed die für $Input1 gelten
    auch für $Input2 geltend zu machen?
    Jedoch soll es so sein, dass das Programm (vielleicht durch Koordinatenerkennung der Maus) erkennt über welchem $Input die Maus sich gerade befindet?!

    Hier mal mein bisheriger Code:

    Spoiler anzeigen
    [autoit]

    #include
    #include

    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Form1", 635, 449, 265, 182)
    $Input1 = GUICtrlCreateInput("", 39, 6, 175, 19)
    $Input2 = GUICtrlCreateInput("", 40, 40, 177, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Select
    Case _IsPressed(01)
    sleep(1)
    GUICtrlSetData($Input1,"MOUSE1")
    EndSelect
    WEnd

    [/autoit]

    Nun besteht das Problem, dass egal wo ich auf dem GUI einen MOUSE1 klick mache er mir das ins Inputfeld schreibt...
    Hoffe ich habs einiger maßen verständlich rübergebracht? :) </Misc.au3></GUIConstants.au3>

    Und würde mich über eine kleine hilfestellung sehr freuen.
    Bin echt am verzweifeln.

    PS. Habe mir die Funktion mit der Mausposition schon mal angeschaut, jedoch konnte man meiner meinung nach da kein "Rahmen" eingeben an Koordinaten um einen bestimmten Bereich abzustecken... :)

  • Hast du dir das etwa so vorgestellt?:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Form1", 635, 449, 265, 182)
    $Input1 = GUICtrlCreateInput("", 39, 6, 175, 19)
    $Input2 = GUICtrlCreateInput("", 40, 40, 177, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    $data=GUICtrlRead($Input2)
    ToolTip($data)
    GUICtrlSetData($Input1,$data)
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    sleep(1)
    WEnd

    [/autoit]

    Oder liege ich da jetzt total daneben? ^^

  • Bei GUIGetCursorInfo ist die ID unter der Maus schon im Array dabei :)

    Also:

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Form1", 635, 449, 265, 182)
    $Input1 = GUICtrlCreateInput("", 39, 6, 175, 19)
    $Input2 = GUICtrlCreateInput("", 40, 40, 177, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    $mouse = GUIGetCursorInfo()
    If $mouse[2] Then
    $Class = _ControlGetClass(GUICtrlGetHandle($mouse[4]))
    If StringInStr($Class,"Edit") Then GUICtrlSetData($mouse[4],"CTRLID: " & $mouse[4] & " | Class: " & $Class)
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _ControlGetClass($hwnd)
    $Class = DllCall("user32.dll","long","GetClassName","long",$hwnd,"str","","long",128)
    If $Class[0] = 0 Then Return SetError(1,0,0)
    Return $Class[2]
    EndFunc ; <== _ControlGetClass

    [/autoit]

    Einmal editiert, zuletzt von progandy (29. Januar 2008 um 19:23)

  • also schonmal danek für die Antworten.

    Nightraven... Mmhhh... keine Ahnung inwiefern das meine Idee unterstützt mit dem _IsPressed aber danke fürs zeigen mit dem Tooltip ;)
    Trotzdem danke

    Vielleicht hab ich es auch einfach nur doof beschrieben ^^

    Es soll ein cfgMaker werden.
    Ich klicke auf ein Inputfeld (was noch disbaled ist) einmal mit der maus drauf und dann kann ich eine Taste drücken (egal welche)
    Und dann soll in dieses Inputfeld (nur in dieses eine wo ich gerade drauf geklickt habe) der Input vollzogen werden :)

    Daher hilft mir progandys Code glaub ich auch nicht.
    Vielleicht hab ich mich nur schwer verständlich ausgedrückt ;9
    Aber trotzdem danke für die Bemühungen.

    • Offizieller Beitrag
    Zitat

    ich wollte mal fragen ob es möglich ist, dass die selben _IsPressed die für $Input1 gelten
    auch für $Input2 geltend zu machen?


    Der Funktion _IsPressed() ist es sowas von egal, in welches Input du deine Eingaben machst :D
    Mit der Funktion wird eine Eingabe eines bestimmten Zeichens abgewartet. Wo dies erfolgt spielt keine Rolle.

  • das weiß ich ja, aber wenn ich alles einmal bennene also
    _IsPresse(01) Then
    _IsPressed(41) Then

    usw.

    und ich will ein Klick in $Input1 machen dann schreibt er es in alle inputs rein bei denen ich _IsPressed deklariert habe...
    und das muss ich ja so machen für mein cfgMaker oder gibts auch ne andere Möglichkeit?

    • Offizieller Beitrag

    Ich verstehe nicht, warum da irgendeine Taste gedrückt werden soll. _IsPressed brauchst du doch überhaupt nicht.
    Wenn du ein Input anklickst, schreibst du doch automatisch da drin. Und um die Eingabe zu übernehmen kannst du ja für die Inputs das Event 'InputChange' ausnutzen. Das tritt ein, wenn der Inhalt des Inputs sich verändert hat und wird überprüft bei Betätigung der Entertaste.
    Bsp.:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Form1", 633, 454, 193, 115)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    $Input1 = GUICtrlCreateInput("Input1", 88, 96, 145, 21)
    GUICtrlSetOnEvent(-1, "Input1Change")
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Form1Close()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Input1Change()
    MsgBox(0, '', 'Inhalt geändert')
    EndFunc

    [/autoit]
  • Es ist ja so, dass nicht jeder jeden Namen der tasten kennt.

    Also dann werden sicherlich einige in das Inputfeld in den cfgMaker reinschreiben bei schießen
    Linkemaustaste oder sowas...

    CounterStrike versteht aber nicht Linkemaustaste
    sondern nur MOUSE1

    hoffe jetzt ist es verständlich :)
    und damit man eben nicht selbst eintippen muss MOUSE1 soll das tool es selber erkennen und reinschreiben
    Natürlich das reinschreiben was ich vorher definiert habe damit es CS konform ist :)

  • Da hilft mein Code doch. Du musst nur das verändern, was in die Boxen rein geschrieben wird.

    Mein Code prüft, ob die linke Maustaste gedrückt wurde, dann ob es ein Edit/Inputfeld ist, über dem die Maus steht und schribt dann einen Text in das angeklickte Feld.

    Willst du es so?

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Form1", 635, 449, 265, 182)
    $Input1 = GUICtrlCreateInput("", 39, 6, 175, 19)
    GuictrlSetState(-1,$GUI_DISABLE)
    $Input2 = GUICtrlCreateInput("", 40, 40, 177, 21)
    GuictrlSetState(-1,$GUI_DISABLE)
    $Input2 = GUICtrlCreateLabel("Label, hier wird nichts geändert", 40, 140, 177, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    $mouse = GUIGetCursorInfo()
    If $mouse[2] Then
    $Class = _ControlGetClass(GUICtrlGetHandle($mouse[4]))
    If StringInStr($Class,"Edit") Then GUICtrlSetData($mouse[4],"MOUSE1")
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _ControlGetClass($hwnd)
    $Class = DllCall("user32.dll","long","GetClassName","long",$hwnd,"str","","long",128)
    If $Class[0] = 0 Then Return SetError(1,0,0)
    Return $Class[2]
    EndFunc ; <== _ControlGetClass

    [/autoit]
  • also entweder bin ich zu doof das umzuschreiben oder ich stell mich nur doof an :)

    Das Script funzt auch für alle weiteren tasten ja?
    Beim 1. Mausklick soll er eben hinschreiben Taste eingeben und dann EGAL welche Taste ich drücke soll er den Namen der Taste hinschreiben.

    Bsp.:

    Mausklick auf $Input1
    GUISetData ($Input1,"Bitte Taste drücken")
    Wenn linke Maustaste gedrückt wird schreibt er MOUSE1
    Wenn a gedrückt wird schreibt er eben a rein
    Wenn Enter gedrückt wird schreibt er ENTER rein
    usw.
    (Aber immer nur eine Eingabe darf genommen werden. danach ist schluss und ich müsste erneut draufdrücken.)

    Und die Texte die er reinschreiben soll muss ich selbst angeben können.
    Werd noch weiter versuchen das umzuschreiben ^^
    Aber bin eben noch nich so gebildet in AutoIt

    //EDIT:
    Mein Code mal bisher umgeschrieben aber klappt nicht ^^

    Spoiler anzeigen
    [autoit]


    #include <Misc.au3>
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Form1", 635, 449, 265, 182)
    $Input1 = GUICtrlCreateInput("", 39, 6, 175, 19)
    GuictrlSetState(-1,$GUI_DISABLE)
    $Input2 = GUICtrlCreateInput("", 40, 40, 177, 21)
    GuictrlSetState(-1,$GUI_DISABLE)
    $Input2 = GUICtrlCreateLabel("Label, hier wird nichts geändert", 40, 140, 177, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    $mouse = GUIGetCursorInfo()
    If $mouse[2] Then
    $Class = _ControlGetClass(GUICtrlGetHandle($mouse[4]))
    If StringInStr($Class,"Edit") Then GUICtrlSetData($mouse[4],"Bite Taste eingeben")
    Sleep(2000)
    _IsPressed(41)
    GUICtrlSetData($mouse[4],"A")
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _ControlGetClass($hwnd)
    $Class = DllCall("user32.dll","long","GetClassName","long",$hwnd,"str","","long",128)
    If $Class[0] = 0 Then Return SetError(1,0,0)
    Return $Class[2]
    EndFunc ; <== _ControlGetClass

    [/autoit]

    4 Mal editiert, zuletzt von Fredooo (30. Januar 2008 um 17:44)

  • Isoliere doch erst mal die GetKeyPressed() Funktion von MacroGamer
    Dazu baruchst du auch noch die LoadKeyBoardLayout() daraus.
    Danach kannst du noch die Maus-Buttons hinzufügen!

  • habe es jetzt mal anders versucht zu lösen würde auch klappen nur leider
    gibt es bei mir einen unerklärlichen Input, wenn ich den Focus auf ein label übergeben will...
    da steht dann ständig reingeschrieben 256 :)

    Aber nur wenn ich _IsPressed(41) habe...
    hier mal der Codeteil mit dem A:

    Spoiler anzeigen
    [autoit]

    Case _IsPressed(41)
    GUICtrlSetData($input, "a")
    Sleep(1)
    GUICtrlSetData($moveduck, $GUI_FOCUS)

    [/autoit]
  • Ich habs hier mit den Funktionen von MacroGamer:
    Du musst nur noch die scancodes.dat an die Daten für dein Spiel anpassen.
    Evtl auch deutsche Tastaturbelegung verwenden (ist noch US)

    //Edit: Im Anhang ist ein Fehler. Folgender Code geht:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <Misc.au3>
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    FileInstall ( "scancodes.dat", @ScriptDir & "\", 1) ;Installs if these dont exist
    LoadKeyBoardLayout("scancodes.dat")
    ;MsgBox(0, '', GetKeyPressed())
    Global $CTRLID = -1

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Form1", 635, 449, 265, 182)
    $Input1 = GUICtrlCreateInput("", 39, 6, 175, 19)
    GuictrlSetState(-1,$GUI_DISABLE)
    $Input2 = GUICtrlCreateInput("", 40, 40, 177, 21)
    GuictrlSetState(-1,$GUI_DISABLE)
    $Input2 = GUICtrlCreateLabel("Label, hier wird nichts geändert", 40, 140, 177, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    Select
    Case $CTRLID = -1
    $mouse = GUIGetCursorInfo()
    If $mouse[2] Then
    $Class = _ControlGetClass(GUICtrlGetHandle($mouse[4]))
    If StringInStr($Class,"Edit") Then
    GUICtrlSetData($mouse[4],"Bitte Taste eingeben")
    $CTRLID = $mouse[4]
    While _IsPressed(01)
    Sleep(10)
    WEnd
    EndIf
    EndIf
    Case Else
    GUICtrlSetData($CTRLID,GetKeyPressed())
    $CTRLID = -1
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _ControlGetClass($hwnd)
    $Class = DllCall("user32.dll","long","GetClassName","long",$hwnd,"str","","long",128)
    If $Class[0] = 0 Then Return SetError(1,0,0)
    Return $Class[2]
    EndFunc ; <== _ControlGetClass

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #region MacroGamer
    ;=============================================
    ; Author: Toady (Josh Bolton)
    ; Email: [email='itoady@gmail.com'][/email]
    ; Website: http://www.itoady.com
    ; Language: Autoit3
    ; Version: 2.7.5
    ; Date Created: Jan. 25, 2007
    ; Last Updated: Jun. 22, 2007
    ; Requirements:
    ; Standard Keyboard US/UK (QWERTY)
    ; Terms of Use:
    ; Source code is open to use.
    ; Please give credit where its due.
    ; Code is provided "As is", any alteration
    ; will void ANY warranty.
    ;==============================================

    [/autoit] [autoit][/autoit] [autoit]

    ;=============================================================================
    ; Returns the key that is pressed
    ; Uses the KeyBoard Layout
    ;=============================================================================
    Func GetKeyPressed()
    Local $dll = DllOpen("user32.dll")
    while 1
    Local $mouse = GUIGetCursorInfo()
    If $mouse[2] Then
    DllClose($dll)
    While _IsPressed(01)
    Sleep(10)
    WEnd
    Return ("MOUSE1")
    ElseIf $mouse[3] Then
    DllClose($dll)
    While _IsPressed(02)
    Sleep(10)
    WEnd
    Return ("MOUSE2")
    EndIf
    for $i = 8 to 222 ;Accept 102 Standard KeyBoard Input (US)
    If _IsPressed(hex($i,2),$dll) Then ;And StringRegExp($keyboardLayout[$i],"(CTRL)|(ALT)|(WIN)|(SHIFT)") <> 1 Then
    DllClose($dll)
    Return $keyboardLayout[$i]
    EndIf
    Next
    wend
    DllClose($dll)
    Return -1
    EndFunc ;GetKeyPressed()==>

    ;=============================================================================
    ; Reads the keyboard layout file OMFG! WTF! HAX! 102 standard keyboard
    ; Using an external INI file in case scancodes not compatible with keyboard
    ; This allows updates to scancodes to be simple, even user can modify it.
    ;=============================================================================
    Func LoadKeyBoardLayout($file)
    Local $ini = IniReadSection($file,"keyboard")
    Global $keyboardLayout = _ArrayCreate($ini[1][1])
    For $i = 2 To $ini[0][0]
    _ArrayAdd($keyboardLayout,$ini[$i][1])
    Next
    EndFunc ;LoadKeyBoardLayout($file)==>
    #endregion

    [/autoit]
  • habs jetz mal anders gelöst :)

    hab einfach so gemacht:

    Im Fall des drücken des SetzenButtons:

    Spoiler anzeigen
    [autoit]

    Case $miscteamchatbtn
    GUICtrlSetData($miscteamchat, "Taste drücken")
    GUICtrlSetState(-1, $GUI_FOCUS)
    $input = $miscteamchat

    [/autoit]

    Dann wenn die Taste gedrückt wird:

    Spoiler anzeigen
    [autoit]

    Case _IsPressed(41) GUICtrlSetData($input, "A") $input = ""

    [/autoit]