Wirklich sinnvoll ist das ganze trotzdem nicht, wie auch schon im Ursprungsthread erwähnt wurde wäre ein Screencapture Programm wie Camtasia wesentlich besser geeignet.
Schon alleine deshalb, weil das Programm niemals auf allen heute gängigen Betriebssystemen korrekt arbeiten würde. Es gibt durchaus Unterschiede zwischen den Paint Versionen von Win98/XP/Vista/7.
Beiträge von misterspeed
-
-
Wozu brauchst du mouseclick() unbedingt? Die meisten Dinge kann man auch ohne mouseclick() erreichen, gerade Mausklicks rein nach Koordinaten sind extremst fehleranfällig und in der Regel nicht auf fremden Systemen nutzbar.
Wenn du wie in deinem Beispiel ein Programm starten willst nimm doch einfach run().
Wenn du In einem Fenster einen bestimten Button oder Ähnliches anklicken willst dann benutz statt dem normalen Mausklick mit Koordinaten lieber controlclick() und ermittle zuvor mit Au3Info alle relevanten Infos um das richtige Elemnt im Fenster anzuklicken.
Wenn du Elemente auf Webistes ansteuern willst benutz die dafür gedachten Funktionen der IE.au3 oder FF.au3, die ebenfalls anhand des Quellcodes sehr viel exakter sein können. -
-
So hab nochmal einiges geändert, funktioniert nun
Spoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#Include <Array.au3>Global $listviewitem[1]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $listviewitemClone[1]
$listviewitem[0]=0
$listviewitemClone[0]=0#Region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit]; GUI Main:
[/autoit] [autoit][/autoit] [autoit]$MainGUI = GUICreate("Main GUI", 502, 200, 50, 124)
[/autoit] [autoit][/autoit] [autoit]
$ListView1 = GUICtrlCreateListView("ListViewMain", 88, 32, 185, 113,"",$LVS_EX_CHECKBOXES)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 336, 64, 105, 25)
$Button1 = GUICtrlCreateButton("add ListView Value", 336, 32)
GUISetState(@SW_SHOW); GUI Clone:
[/autoit] [autoit][/autoit] [autoit]$CloneGUI = GUICreate("Clone GUI", 502, 200, 600, 124)
[/autoit] [autoit][/autoit] [autoit]
$ListView2 = GUICtrlCreateListView("ListViewClone", 88, 32, 185, 113,"",$LVS_EX_CHECKBOXES)
$Checkbox2 = GUICtrlCreateCheckbox("CheckboxClone", 336, 64, 105, 25)
GUISetState(@SW_SHOW)#EndRegion ### END Koda GUI section ###
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
addListViewItem()
Case $Checkbox1
CloneCheckboxState()
Case $Checkbox2
CloneCheckboxState()
EndSwitchcloneListViewItemState()
[/autoit] [autoit][/autoit] [autoit]WEnd
[/autoit] [autoit][/autoit] [autoit]Func addListViewItem()
[/autoit] [autoit][/autoit] [autoit]
$add = InputBox("Inhalt zur ListView hinzufügen", "Gib was ein")
$item = GUICtrlCreateListViewItem($add,$ListView1)
$itemclone = GUICtrlCreateListViewItem($add,$ListView2)
_ArrayAdd($listviewitem,$item)
_ArrayAdd($listviewitemClone,$itemclone)
$listviewitem[0]=$listviewitem[0] + 1
$listviewitemClone[0]=$listviewitemClone[0] + 1
EndFuncFunc cloneListViewItemState()
[/autoit] [autoit][/autoit] [autoit]if WinActive ( $MainGUI ) Then
[/autoit] [autoit][/autoit] [autoit]
$counter = 1
While $counter <= $listviewitem[0]
If BitAnd(GUICtrlRead($listviewitem[$counter],1),$GUI_CHECKED ) = $GUI_CHECKED Then
GUICtrlSetState($listviewitemClone[$counter],$GUI_CHECKED )
Else
GUICtrlSetState($listviewitemClone[$counter],$GUI_UNCHECKED )
EndIf
$counter = $counter + 1
WEnd
EndIfif WinActive ( $CloneGUI ) Then
[/autoit] [autoit][/autoit] [autoit]
$counter = 1
While $counter <= $listviewitemClone[0]
If BitAnd(GUICtrlRead($listviewitemClone[$counter],1),$GUI_CHECKED) = $GUI_CHECKED Then
GUICtrlSetState($listviewitem[$counter],$GUI_CHECKED)
Else
GUICtrlSetState($listviewitem[$counter],$GUI_UNCHECKED)
EndIf
$counter = $counter + 1
WEnd
EndIfEndFunc
[/autoit] [autoit][/autoit] [autoit]Func CloneCheckboxState()
[/autoit] [autoit][/autoit] [autoit]if WinActive ( $MainGUI ) Then
[/autoit] [autoit][/autoit] [autoit]
If BitAnd(GUICtrlRead($Checkbox1),$GUI_CHECKED) = $GUI_CHECKED Then
GUICtrlSetState($Checkbox2,$GUI_CHECKED)
Else
GUICtrlSetState($Checkbox2,$GUI_UNCHECKED)
EndIf
EndIfif WinActive ( $CloneGUI ) Then
[/autoit] [autoit][/autoit] [autoit]
If BitAnd(GUICtrlRead($Checkbox2),$GUI_CHECKED) = $GUI_CHECKED Then
GUICtrlSetState($Checkbox1,$GUI_CHECKED)
Else
GUICtrlSetState($Checkbox1,$GUI_UNCHECKED)
EndIf
EndIfEndFunc
[/autoit] -
Also ich hab mal was gebastelt, allerdings funktioniert das nicht ganz so wie es soll. Die Inhalte der listviews werden jeweils gecloned, auch der Status der Checkbox wird korrekt gecloned. Allerdings funktioniert das Cloning des ListviewItem Status noch nicht. Habe aber auch noch nie mit Listviews gearbeitet. Vielleicht hilft dir das Beispiel ja und du kannst den Fehler beheben:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#Include <Array.au3>Global $listviewitem[1]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $listviewitemClone[1]
$listviewitem[0]=0
$listviewitemClone[0]=0#Region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit]; GUI Main:
[/autoit] [autoit][/autoit] [autoit]$Form1 = GUICreate("Main GUI", 502, 200, 50, 124)
[/autoit] [autoit][/autoit] [autoit]
$ListView1 = GUICtrlCreateListView("ListViewMain", 88, 32, 185, 113)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 336, 64, 105, 25)
$Button1 = GUICtrlCreateButton("add ListView Value", 336, 32)
GUISetState(@SW_SHOW); GUI Clone:
[/autoit] [autoit][/autoit] [autoit]$Form2 = GUICreate("Clone GUI", 502, 200, 600, 124)
[/autoit] [autoit][/autoit] [autoit]
$ListView2 = GUICtrlCreateListView("ListViewClone", 88, 32, 185, 113)
$Checkbox2 = GUICtrlCreateCheckbox("CheckboxClone", 336, 64, 105, 25)
GUISetState(@SW_SHOW)#EndRegion ### END Koda GUI section ###
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
addListViewItem()
Case $ListView1 ; eigtl müsste statt der listviewcontrol das listviewitem als case abgefragt werden
cloneListViewItemState($ListView1)
Case $ListView2
cloneListViewItemState($ListView2)
Case $Checkbox1
CloneCheckboxState($Checkbox1)
Case $Checkbox2
CloneCheckboxState($Checkbox2)EndSwitch
[/autoit] [autoit][/autoit] [autoit]
WEndFunc addListViewItem()
[/autoit] [autoit][/autoit] [autoit]
$add = InputBox("Inhalt zur ListView hinzufügen", "Gib was ein")
$item = GUICtrlCreateListViewItem($add,$ListView1)
$itemclone = GUICtrlCreateListViewItem($add,$ListView2)
_ArrayAdd($listviewitem,$item)
_ArrayAdd($listviewitemClone,$itemclone)
$listviewitem[0]=$listviewitem[0] + 1
$listviewitemClone[0]=$listviewitemClone[0] + 1
EndFuncFunc cloneListViewItemState($listview) ; funktioniert nicht
[/autoit] [autoit][/autoit] [autoit]if $listview = $ListView1 Then
[/autoit] [autoit][/autoit] [autoit]
$counter = 1
While $counter <= $listviewitem[0]
If BitAnd(GUICtrlRead($listviewitem[$counter]),$GUI_CHECKED ) = $GUI_CHECKED Then
GUICtrlSetState($listviewitemClone[$counter],$GUI_CHECKED )
Else
GUICtrlSetState($listviewitemClone[$counter],$GUI_UNCHECKED )
EndIf
$counter = $counter + 1
WEnd
EndIfif $listview = $ListView2 Then
[/autoit] [autoit][/autoit] [autoit]
$counter = 1
While $counter <= $listviewitemClone[0]
If BitAnd(GUICtrlRead($listviewitemClone[$counter]),$GUI_CHECKED) = $GUI_CHECKED Then
GUICtrlSetState($listviewitem[$counter],$GUI_CHECKED)
Else
GUICtrlSetState($listviewitem[$counter],$GUI_UNCHECKED)
EndIf
$counter = $counter + 1
WEnd
EndIfEndFunc
[/autoit] [autoit][/autoit] [autoit]Func CloneCheckboxState($check)
[/autoit] [autoit][/autoit] [autoit]if $check = $Checkbox1 Then
[/autoit] [autoit][/autoit] [autoit]
If BitAnd(GUICtrlRead($Checkbox1),$GUI_CHECKED) = $GUI_CHECKED Then
GUICtrlSetState($Checkbox2,$GUI_CHECKED)
Else
GUICtrlSetState($Checkbox2,$GUI_UNCHECKED)
EndIf
EndIfif $check = $Checkbox2 Then
[/autoit] [autoit][/autoit] [autoit]
If BitAnd(GUICtrlRead($Checkbox2),$GUI_CHECKED) = $GUI_CHECKED Then
GUICtrlSetState($Checkbox1,$GUI_CHECKED)
Else
GUICtrlSetState($Checkbox1,$GUI_UNCHECKED)
EndIf
EndIfEndFunc
[/autoit] -
Beleidigt Leberwurst zu spielen hilft dir aber auch nicht.
Die Anspielung auf die Suchfunktion war so verkehrt nun auch wieder nicht. Allerdings sollte beim suchen auch bedacht werden, dass das WBB zwischen Thread und Forensuche unterscheidet. Das heisst wenn du hier im Thread suchst findest du natürlich nichts ausser den Postings aus deinem eigenen Thread. Klickst du davor aber mal auf die Index Seite des Forums findest du in der Tat 5 Seiten an Suchergebnissen.
Davon mal ab gibt es zur FF-Automatisierung sogar ein eigenes Unterforum in das deine Anfrage eher gepasst hätte, bzw hättest du dort durchs lesen der Sticky Threads sogar eine Anleitung gefunden wie man die oben bereits erwähnte ff.au3 einbindet und damit arbeitet.
Link zum Firefox Unterforum: https://autoit.de/index.php?page=Board&boardID=32
-
Kannst dir auch Koda Form Designer im Scite Editor unter Tools anschauen. Damit kann man sehr schnell simple GUI's erstellen. Gerade am Anfang ganz gut um den ungefähren Aufbau und die Funktionsweise kennenzulernen.
-
Würde da mit _FileReadToArray arbeiten, da du dadurch nicht ständig auf die Datei und somit HDD zugreifen musst.
1. Datei 1 in ein Array1 einlesen
2. Datei 2 in Array2 einlesen
3. while schleife die jeden eintrag von array1 per strinsplit mit delimiter " " (Leerzeichen) in array1b schreibt
---> in Array 1b sollten nun nur noch die pfade stehen, also "*ace....."
4. while schleife die _arraysearch ausführt und in array2 nach den pfaden aus allen einträgen von array 1b sucht
4a wird eine übereinstimmung gefunden vergleichen wir array2[trefferindex] mit array1[zählerindex der suchschleife]
4b weichen Inhalte ab, dann schreibt man array2[trefferindex] in Datei 3 oder was besser wäre in ein Array3 und ganz am ende also nach der suchschleife mit _FileWriteFromArray in Datei3
5. Ferig?Sorry war zu faul das in Programmcode zu verpacken, aber so in der Art sollte das recht flott gehn.
-
UAC ist aber auch nicht unbedingt UAC. Von welchem Betriebssystem sprechen wir denn überhaupt? Vista / Windows 2008 oder Win7 / Windows 2008 R2 ? Unter Win7 gibt es sogar mehrere Stufen für UAC.
Hier mal einige informative Links zum Thema:
http://gdm.sinniert.de/2010/03/16/win…ng-austricksen/
http://www.winfaq.de/faq_html/Conte…p?h=tip2526.htm
http://www.netzmonster.de/index.php/wind…ge-umgang-damitHab das zwar nur überflogen, aber wie schon erwähnt wurde scheint unter administrativen Rechten überwiegend der Zugriff auf die Registry und systemnahe Verzeichnisse verstanden zuwerden. Ist nun natürlich die Frage wo sich die Dateien befinden die verändert werden sollen.
-
Was evtl auch noch denkbar wäre ist der Zugriff per Remotedesktop auf einen anderen Benutzer Account. Der betreffende User müsste dann eben in der Gruppe Remotedesktop Benutzer sein.
-
Vermutlich benutzt du Windows7 ? Da funktioniert die Registry Prüfung nämlich nicht mehr, da sich der Registrypfad geändert hat.
Du kannst aber einige Modifikationen an der ff.au3 vornehmen, die es dir ermöglichen den Pfad zur firefox.exe beim Aufruf von _FFstart() zu übergeben. Dadurch wird die Registry Prüfung dann umgangen:
https://autoit.de/index.php?page…2113#post192113
Alternativ kannst du auch wie im Startpost des selben Threads zusehen ist komplett auf _FFstart() verzichten und stattdessen mit _FFconnect() zu einer bereits laufenden FF Instanz connecten. Allerdings musst du dann sicherstellen dass FF auch wirklich läuft wenn dein Script ausgeführt wird. Das könntest du mit ProcessExists() prüfen und wenn FF nicht gestartet ist ggf. per run() befehl den Start nachholen.
Beide Varianten erfordern dass FF entweder schon läuft oder dass du den Pfad zur firefox.exe kennst bzw. anderweitig ermitteln kannst.
-
Schaut interessant aus. Werd ich in den nächsten Tagen mal damit spielen
-
Problem:
Da Autoit selbst ja nicht MultiThreading tauglich ist habe ich Teilfunktionen vom Hauptprogramm in zwei weitere separate Programme ausgelagert.
Damit sind aber einige unschöne Problem verbunden.Die benötigten Variablen wie zum Beispiel das gemeinsame Arbeitsverzeichnis und noch einiges mehr übergibt mein Hauptprogramm per Comandline Parameter beim Aufruf des ausgelagerten Programms.
Das ist soweit ok, wenn auch bei 10 Parametern etwas unübersichtlich.Im Anschluss arbeiten alle Programme ihre Aufgaben ab. Eines der ausgelagerten Programme kann allerdings nur die halbe Arbeit ohne ein Ergebnis des Hauptprogramms abarbeiten. Sobald das Hauptprogramm also die zeitgleich ablaufende Aufgabe erledigt hat muss das Ergebnis des zweiten ausgelagerten Programmes abgewartet werden und anschliessend zusammen mit einigen Informationen des Hauptprogrammes ans erste ausgelagerte Programm übergeben werden, damit dieses fortfahren kann. Das Hauptprogramm wartet nach einer weiteren Augabe nun wiederum aufs Ergebnis des ersten augelagerten Programms um seinerseits die letzte Aufgabe abzuarbeiten.
Bedeutet:
Ich muss mehrmals Daten zwischen den Programmen während der Laufzeit austauschen, idealerweise sogar noch öffters als derzeit um die Progressbar im Hauptprogramm zu aktualisieren. Aushilfsweise mache ich die Datenübertragung über Textdateien, was aber meiner Meinung nach recht unschön ist, auch wenn diese sofort wieder vom jeweils anderen Programm gelöscht werden.
Frage:
Gibt es auch bessere und effektivere Möglichkeiten um eine Kommunikation zwischen den Programmen zu ermöglichen?
-
Hätte wetten können dass ich das bereits ausprobiert hatte...
Dank dir jedenfalls, funktioniert -
Irgendwie find ich keine passende Funktion um den Fenstertitel meiner GUI zu ändern.
[autoit]
Das einzigste was ich in der Richtung gefunden habe wäre
[/autoit]
WinSetTitleAllerdings reicht es bei WinSetTitle nicht einfach die Variable der GUI zu anzugeben, sondern man muss zunächst den aktuellen Titel des Fensters kennen.
[autoit]
Was ich also suche ist etwas ähnliches wie
[/autoit]
GUICtrlSetDataDas funktioniert aber leider nur bei Controls und nicht beim Fenster. Interessant wäre auch die Fenstergröße nachträglich zu verändern. Gibt es da vergleichbare Funktionen wie bei den Controls?
-
edit: hatte das problem falsch verstanden...
-
Mein größtes Projekt ist ein Programm mit dem man Video Dateien erstellen/aufbereiten und uploaden kann.
Derzeit wird folgendes unterstützt:
Spoiler anzeigen
- Video mit 2 Tonspuren muxxen inkl. halbautomatischer Zuordnung der Spuren (unterstützte Container/Formate: mkv, avi, ac3, mp3)
- Auslesen diverser Dateieigenschaften wie Bitrate, Auflösung usw.
- Automatische Dateibenennung per Datenbank
- NFO Erstellung
- Torrent Erstellung
- Optional: Screenshoterstellung vom Video inkl. Upload bei imageshack
- Vollautomatischer Upload des Torrents inkl. Beschreibung auf bis zu 4 Websites über eine in die GUI eingebettete FF Instanz.
- Start der Verteilung der zuvor hochgeladenene TorrentdateienDas ganze hat inzwischen ungefähr 5000 Zeilen Code und nutzt 200mb an externen Tools zur Video, Torrent und Screenshot Erstellung. Das Programm kann je nach Einstellung und System in 60 bis 200 Sekunden ablaufen und spart dadurch mindestens 15-20 Minuten Zeit ein.
Aus rechtlichen Gründen werde ich das aber nicht veröffentlichen und auch keinerlei Fragen dazu beantworten. Wäre ohnehin nur mit Modifikationen nutzbar, da es sehr speziell auf meine Bedürfnisse zugeschnitten ist.
-
Wenn du dich auf mein Posting beziehst... bei mir gehts um eine lokale Anwendung, bzw die Ermittlung eines Ordnernamens zur weiterverarbeitung. Der fileselectfolder Dialog ist wenig benutzerfreundlich, daher würde ich lieber den neuen Style des Dialogs verwenden, siehe Screenshot.
Wenn du den Threadersteller meintest, so könnte er aber durchaus auch Interesse an diesem Dialog haben um das lokale Quelleverzeichnis auszuwählen, welches dann auf einen FTP hochgeladen wird, bzw auch die andere Richtung, also den lokalen Zielordner festlegen. Für FTP Verzeichnisse ist aber auch der Dialog von dem ich spreche nicht geeignet, das ist korrekt.
-
Da es hier ja ursprünglich um fileopendialoge ging hätte ich dazu auch noch eine Frage. Mir gefallen die AutoIT eigenen fileopen Dialoge bzw um genauzusein FileSelectFolder Dialoge nicht, deswegen habe ich mir mal die Funktion
[autoit]
[/autoit]
_WinAPI_GetOpenFileName
angeschaut. Von anderen Windows Programmen weiss ich dass man mit diesem Dialog auch Ordner öffnen kann. Allerdings konnte ich in der Hilfe nichts dazu finden. Ziel ist es dass nur ein Ordner markiert sein muss um beim Betätigen des öffnen Buttons den kompletten Ordnerpfad zu erhalten. Standardmässig öffnet der Dialog aber dabei nur das Verzeichnis und erwartet dass eine Datei markiert wird. Kann man dieses Verhalten ändern? Habe beim überfliegen der verschiedenen flags leider nichts gefunden.EDIT: Grad nochmal geschaut, es scheint im Falle des Programms, dass ich im Hinterkopf hatte doch nicht exakt der selbe Dialog zu sein. Es scheint also windows seitig noch einen OpenDirectory Dialog im selben Style zugeben, aber scheinbar keine dazu passende winAPI Funktion in Autoit?
-
Schau dir...
[autoit]_FileReadToArray()
[/autoit]
_ArraySearch()
..an. Dazu dann am besten einige der Stringbefehle und dann sollte nahezu jede Textdatei auszulesen sein.