Falls ich eine UDF vorschlagen dürfte^^
http://www.autoitscript.com/forum/topic/96…sctls-hotkey32/
Beiträge von Schnitzel
-
-
Du hast also eher ein Problem mit Arrays?^^
mit inireadsection bekommst du ein array. Wieviele inhalte das array hat steht im $array[0][0] oder du bekommst es mit ubound() herraus
dann lässt du das array mit einer for schleife durchlaufen und erstellst für jeden index ein listviewitemBin leider grad unterwegs aber nachher könnt ich ein beispiel posten wenns sonst noch niemand getan hat
Edit: blödes funkloch
-
Dann am besten eine ganze Section auslesen (mit IniReadSection)
Und für jedes Element im Array ein Control anlegen (Guictrlcreatelistviewitem) -
Kein Problem
Dann Debuggen wir mal bisschen^^
Ist der Fenstertitel wirklich richtig so? Zum Beispiel das doppelte Leerzeichen da drin: "2011.2.0 \[CREW"
Am besten nochmal mit dem WindowInfo Tool ermitteln und kopieren
(und natürlich vor jeder eckigen Klammer wieder den Backslash einfügen)Was gibt dir das folgende aus?
[autoit]$sWe = WinExists("\[AUTO\] SkyCrew 2011.2.0 \[CREW DUTY on skbe-sql01\]")
[/autoit]
MsgBox(0,"", $sWe)
$sCc = ControlClick("\[AUTO\] SkyCrew 2011.2.0 \[CREW DUTY on skbe-sql01\]","","[CLASS:Button;INSTANCE:63]")
MsgBox(0,"", $sCc) -
Ach klar, die eckigen Klammern im Fenstertitel machen Probleme^^
[autoit]
Probiers mal so:WinWait("\[AUTO\] SkyCrew 2011.2.0 \[CREW DUTY on skbe-sql01\]")
[/autoit]
ControlClick("\[AUTO\] SkyCrew 2011.2.0 \[CREW DUTY on skbe-sql01\]","","[CLASS:Button;INSTANCE:63]") -
Dir fehlt die schließende eckige Klammer
[autoit]
Außerdem steht left an der Falschen stelle, da Left aber sowieso Standard ist kannst dus auch weglassen.
Genauso wie den Text des Buttons. Durch Class und Instance ist er ja bereits eindeutig beschrieben
Probiers mal so:ControlClick("[AUTO] SkyCrew 2011.2.0 [CREW DUTY on skbe-sql01]","","[CLASS:Button;INSTANCE:63]")
[/autoit]Edit: was ich vergessen hatte^^
Im Normalfall muss ein Fenster nicht aktiv sein um einen Controlclick ausführen zu können. Deshalb würde ich das Winwaitactive lieber durch Winwait ersetzten. Dann ist dein Script nicht so fehleranfällig -
Ich seh zwar nur den Link weil die Seite bei uns in der Arbeit gesperrt ist aber:
Nö ich bin nicht bei AutoitBotEdit: ups ich war nicht gemeint
-
Ahh jetz check ich erst richtig wie das alles läuft. Im Drüberschauen geht das einfach nicht so gut, deswegen isses gerade bei etwas größeren Scripten gut diese lauffähig zu posten
Also Problem ist das beim GSladen der Grundriss immer im Vordergrund ist, sehe ich das richtig?
[autoit]
Wenn ja wäre die Lösung wie bereits gesagt das Control erst zu erstellen und dann das Bild zu setzen (nachdem alle anderen Bilder erstellt wurden)
also in Zeile 102 einfach so:$grundriss = GUICtrlCreatePic("", 20, 25, 0, 0)
[/autoit]
[autoit]
Und dann am ende des Cases (also Beispielsweise zwischen For Schleife und FileDelete Zeile 133) das einfügen:GUICtrlSetImage($grundriss, @ScriptDir & "\Grundrisse\" & $GSauswahl & ".jpg")
[/autoit]
Dann denke ich wird es so erstellt wie du willst.2 Probleme die ich auch noch sehe ist dass:
1. Beim verschieben eines Objektes im Hintergrund die Bilder die darüberliegen mitverschoben werden ( also die Überlagerungen)
Auch das dürfte sich lösen lassen indem du einfach das bild nochmal mit SetImage setzt
2. Sich auch andere Controls verschieben lassen, ist zwar lustig aber wohl kaum gewünscht^^GSladen kann man ja nicht öfters aufrufen weil du beim ersten Aufruf disables, das hatte ich überlesen
Also: Ich nehme alles zurück was ich vorhin sagte: Es ist schön sauber
Nur halt nicht unbedingt gleich verständlich wenn man nur Quellcode und wenig Zeit hat, aber da kannst du nix dafürIch hoffe jetz konnt ich dir vernünftiger weiterhelfen als vorhin
-
Nur sehe ich nicht wirklich wo dein Problem liegt^^
Anhand des geposteten Script erkenne ich es zumindest nichtEdit: Juhu ich bin nicht allein^^
-
Naja Problem finde ich halt, dass "unendlich" Controls erstellt werden.
Drückt ein User 10 mal auf den Button haste da schon mehrere hundert Controls.
Das ist es was ich unsauber finde und ich denke die meisten werden mir da zustimmen.Natürlich kannst du deine vorgeschlagene Mischung verwenden. Ich würde das so machen:
Einmal das $grundriss Control, das würde ich am Anfang erstellen (und falls nicht benötigt vorrübergehend ausblenden)
Und einmal ein Array mit den "dynamischen" Controls wie dus ja eh schon hast.
ABER: dann auch immer die veralteten Controls mit Guictrldelete löschen.Wenn du mir Bilder und aktuellen Quellcode postest überarbeit ichs vllt kurz so wie ich mein
(Natürlich nur als Alternativvorschlag, in erster Linie muss ein Script natürlich funktionieren^^ ) -
Problem in diesem Fall ist dein unsauberer Programmierstil.
Jedes mal wenn auf den GSladen Button gedrückt wird erstellst du einige neue Controls.
Erstell die Controls die du benötigst am anfang und setz die Bilder dann mit Guictrlsetdata.
Dann kannst du sie auch am besten in der richtigen Reihenfolge erstellen, was in deinem Fall ja wichtig ist da manche Bilder im Vordergrund und einige im Hintergrund sein sollen. -
Dazu kannst du ne einfache Kombination aus _ArrayToString und Stringreplace verwenden
Beispiel
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]Dim $aArray1[2] = ["Sonne", "Mond"]
[/autoit] [autoit][/autoit] [autoit]
$sString1 = _ArrayToString($aArray1, ", ")
$sString1_formatiert = StringReplace($sString1, ", ", " und ", -1)
ConsoleWrite($sString1_formatiert & @CRLF)Dim $aArray2[3] = ["Sonne", "Mond", "Sterne"]
[/autoit] [autoit][/autoit] [autoit]
$sString2 = _ArrayToString($aArray2, ", ")
$sString2_formatiert = StringReplace($sString2, ", ", " und ", -1)
ConsoleWrite($sString2_formatiert & @CRLF)Dim $aArray3[6] = ["Sonne", "Mond", "Sterne", "Gasnebel", "Staubwolken", "Galaxien"]
[/autoit]
$sString3 = _ArrayToString($aArray3, ", ")
$sString3_formatiert = StringReplace($sString3, ", ", " und ", -1)
ConsoleWrite($sString3_formatiert & @CRLF) -
Bots werden hier nicht unterstützt Siehe Forenregeln
Und PixelSearch wird nunmal fast aussschließlich für Bots verwendet -
Bitte bei Problemen die erledigt sind den Thread auch auf gelöst setzen
Einfach den ersten Post bearbeiten, Präfix gelöst wählen und Absenden -
Wie auch in der Hilfe steht musst du das Bild auf $GUI_DISABLE setzen und die Listview auf $GUI_ONTOP
Hilfe lesenUnd das
[autoit]EndSwitch
[/autoit]
For $i = 0 To UBound($aLV) - 1
If $nMsg = $aLV[$i] Then
$iCurNum = $i
_Anzeige($aDaten[$i][0])
EndIf
Nextwürde ich durch das
[autoit]Case $aLV[0] To $aLV[Ubound($aLV)-1]
[/autoit]
_Anzeige(GUICtrlRead($nMsg))
EndSwitch
ersetzen -
Für die COM-Kommunikation gibt es einige .dll's und auch UDF's
Beispiel hier: http://www.autoitscript.com/forum/topic/80…g-kernel32-dll/Falls du mit der nicht zurecht kommst einfach mal googln
-
Das Proble in deinem Script ist dass du zweimal abfrägst ob das Fenster maximiert ist
Wenn es nun am Anfang maximiert ist wird es wiederhergestellt. Dann frägst du mit der zweiten If nochmal ab ob es maximiert ist, und falls nicht wird es maximiert.
Du stellst das Fenster quasi wieder her um es gleich anschließend wieder zu maximieren^^Die If Abfrage muss in etwa so aussehn:
[autoit]
[/autoit]
If BitAnd($State, 32) Then
WinSetState($title,"",@SW_RESTORE)
Else
WinSetState($title,"",@SW_MAXIMIZE)
EndIfAußerdem denke ich dass die Sleeps überflüssig sind und deine Fenstertitelabfrage auch^^
Allgmeiner Verbesserungsvorschlag wäre auch HotKeySet statt _IsPressed zu verwenden.
Is in deinem Fall viel praktischer -
Lass das Programm als Service laufen, dann wird es nicht beendet wenn du die Sitzung trennst.
Einfach die Suche benutzen. Zu dem Thema "als service" gibts schon einige Threads
-
Wie Jam00 bereits sagte musst du das Control auslesen. (Guictrlread)
Und natürlich wird standardmäßig der Fenstertitel verwendet.
Du könntest auch die Class verwenden (in dem Falle wäre es "notepad"), allerdings ist das von Programm zu Programm unterschiedlich.In deinem Beispiel benötigst du nur das eine Include.
[autoit]
[/autoit][autoit][/autoit][autoit]
#include <GUIConstantsEx.au3>$FORM1 = GUICreate("", 200, 70)
[/autoit][autoit][/autoit][autoit]
$BUTTON1 = GUICtrlCreateButton("min", 5, 10, 80, 50)
$e1 = GUICtrlCreateEdit("", 100, 20, 80, 20, 0)
GUICtrlSetData($e1, "Client")
GUISetState(@SW_SHOW)While 1
[/autoit][autoit][/autoit][autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $BUTTON1
$sEdit = GUICtrlRead($e1)
min($sEdit)
EndSwitch
WEndFunc min($sTitle)
[/autoit]
WinSetState($sTitle, "", @SW_MINIMIZE)
EndFunc ;==>minZitat1. Ordentliche Formatierung deines Scrites bitte, das erhöht die leserlichkeit um einiges d.h. bei einer Schleife einrücken usw.
2. Was soll 4 mal eine #include-Anweisung ohne Parameter? Das gibt zum einen keinen Sinn und zum andern führ es zu einem Fehler!
4. Hast du dir schonmal $e1 mit einer MsgBox o.a. ausgeben lassen? Du bekommst nur ein Handle ausgegeben! Du musst GuiCtrlRead einsetzen umd das Edit-Feld auszulesen
1.
Kann am Browser (oder dessen Einstellungen) liegen.2.
Forumsbug4.
Grundsätzlich richtig, aber es ist eine ID und kein Handle -
Wie Jam00 bereits sagte verbindet sich im Normalfall der Client zum Server.
Die ServerIP ist ja auch bekannt und immer gleichFalls du es wirklich andersrum benötigen würdest, müsstest du NAT verwenden (Network Address Translation)
Kannst ja mal dannach googeln.
Wichtig ist aber:
Alle "Offenen Türen" die dein Programm hat, haben dann auch andere.Deshalb bin ich generell eher dagegen wenn Leute am Router rumbasteln.