MouseClick ist völlig ungeeignet. Ich meine, dass nicht mal die Fenster aufgebaut sind, sofern kein User angemeldet ist.
Dementsprechend musst du ne Methode ohne Gui-Steuerung finden, oder dich einloggen.
Beiträge von Kanashius
-
-
Hier: MusikPlayer mit Equalizer,Playlist, etc.
Sind halt ca.3700 Zeilen...
Schreib mir am Wochenende ne PN, dann arbeite ich das aus dem (unkommentierten) Quellcode raus :D. -
Reine Vermutung: Der holt sich ne Liste mit allen Fenstern und nimmt dann das erstbeste, was passt.
-
Happy Birthday
Lass es krachen!
PS:
-
Ne, dort fehlen dann die Grundlagen. Die solltest du dir noch genauer ansehen.
Funktionen haben Parameter. Damit werden sie aufgerufen.
GuiCtrlSetData hat als Parameter das Control als ersten und als 2ten Parameter den Text. Es gibt noch einen optionalen Parameter (den in []), den kann man aber weglassen. Dadurch wird dort ein Standartwert gesetzt.
Parameter müssen übergeben werden. Genau das, was dort verlangt wird.
GuiCtrlSetData verlangt eine Control-ID und einen String. NIcht mehr und nicht weniger. Wenn man mehrere Dinge ändern will muss man die Funktion mehrmals aufrufen. Für jedes Control einzeln.
Eine Funktion ist eigentlich nichts anderes, als wenn man den Quellcode der Funktion an die Stelle setzt, nur dass dort ein eigener Variablen-Raum existiert und die übergebenen Variablen verfügbar sind (Globale natürlich auch).Mit dem AND hätte man theoretisch so arbeiten können:
If $read = "SGM 35" and GUICtrlSetData($Label8, "124221") and GUICtrlSetData($Label6, "Deutschland") then MsgBox(48,"Info","Hurra")
Bei And wird die erste Bedingung geprüft. Trifft die zu, wird die nächste geprüft. Ist die erste Bedingung aber false, dann wird der rest garnicht mehr geprüft, also auch nicht ausgeführt. Alle Rückgaben <>0 sind true. GuICtrlSetData gibt 1 zurück, wenn sie erfolgreich den Text ändern konnte. Somit kannst du das auch so lösen. Ist halt unschöner Stil. -
Alle Autoit-Funktionen werden blockiert, wenn du in einer Programmberechnung bist. Einzige ausnahme sind Windows-Messages, da diese an das System zurückgegeben werden müssen, um dort weiter behandelt zu werden.
Mit GuiRegisterMsg, oder hooks kannst du auf diese Windowsmessages reagieren und deine bearbeitung abbrechen.
Auf welche Message du genau reagieren möchtest kannst du ja selbst mal gucken.
Bsp: Ich hab das mal genutzt für eine Live-Suche. Während man in ein Inputfeld tippt, wird nach jedem Buchstaben gesucht und der Inhalt in eine Listview geladen. Das Laden wurde abgebrochen, sobald eine neue Eingabe getätigt wurde.Das ist aber alles recht Fortgeschritten. Falls das zu schwer ist, poste mal den Code von dem, was hängen bleibt. Dort kann man was einbauen, was eine Unterbrechung ermöglicht.
-
Sieht gut aus. Kann man bestimmt mal gebrauchen
-
And ist für Bedingungen zum verknüpfen. Zum Beispiel, wenn if $msg>1 and $msg2>2 then ...
Rein theoretisch kann man auch mit And mehrere Befehle aneinanderreihen, um einen daraus zu machen... Ist aber kein schöner Stil. -
Hab hier mal die entsprechenden Stellen aus nem Script von mir rausgesucht:
AutoIt
Alles anzeigen;Create Combo $hGUIDeviceCombo=_GUICtrlComboBoxEx_Create($StreamWindow, "", 5,80, $width-40) ;Get Devices _GUICtrlComboBoxEx_ResetContent($hGUIDeviceCombo) $i = 0 While 1 $device = _BASS_GetDeviceInfo($i) If $device = 0 Then ExitLoop EndIf If $device[0] <> "No Sound" Then _GUICtrlComboBoxEx_AddString($hGUIDeviceCombo, $device[0]) EndIf $i += 1 WEnd GUICtrlSetOnEvent(_GUICtrlComboBoxEx_GetComboControl($hGUIDeviceCombo), "_setDevice") ;SetDevice Local $sText $nr = _GUICtrlComboBoxEx_GetCurSel($hGUIDeviceCombo) ;_GUICtrlComboBoxEx_GetItemText($hGUIDeviceCombo, $nr, $sText) $device = _BASS_GetDeviceInfo($nr + 1) If $device[2] < 4 Then _BASS_Init(0, $nr + 1, 100000, 0, "") EndIf _BASS_ChannelSetDevice($MusicHandle, $nr + 1) ;Create Stream, _BASS_Init must be called before (SetDevice) $MusicHandle = _BASS_StreamCreateFile(False, $sFile, 0, 0, 0) If $aktDevice[0] <> -1 Then _BASS_ChannelSetDevice($MusicHandle, $aktDevice[0] + 1);aktDevice ist Number of selected device in combobox EndIf _BASS_ChannelPlay($MusicHandle, 1) local $vol=100 _BASS_ChannelSetAttribute($MusicHandle, $BASS_ATTRIB_VOL, $vol / 100)
Musst dir das dann zusammenbasteln
Falls du noch Ideen/Anregungen brauchst, aus dem Script hab ich das:
MusikPlayer mit Equalizer,Playlist, etc.Ist nen Musicplayer, den ich mal geschrieben habe.
MfG Kanashius
-
Zu Arrays (hatte da grad vor kurzem zusammengefasst, wie sie funktionieren):
2D Array erstellenZum ändern von mehreren:
AutoIt
Alles anzeigenIf $read = "SGM 35" Then GUICtrlSetData($Label8, "124221") GUICtrlSetData($Label6, "Deutschland") EndIf ;Wenn die Labels in nem Array sind: ;Der Zugriff ist eins kleiner als die Nummerierung, da bei Arrays bei 0 angefangen wird zu zählen. local $arLabels[8] $arLabels[7]=GuiCtrlCreateLabel(... $arLabels[5]=GuiCtrlCreateLabel(... If $read = "SGM 35" Then GUICtrlSetData($arLabels[7], "124221") GUICtrlSetData($arLabels[5], "Deutschland") EndIf
-
Solange man nicht klicks auf Elemente auf der Webside machen muss, damit Inhalte geladen werden, empfehle ich immer mit InetRead den Quellcode auszulesen und dann mit Parsen die Inhalte auszulesen.
Oft auch deutlich einfacher. -
Dafür musst du dir die BASS-UDF ansehen.
Ansonsten das Sound-Objekt bei MSDN. Es gibt ein Objekt, um die Lautsprecher zu abzurufen und zu setzen (zumindest bei TTS). -
Wenn man Infos von Seiten wie Youtube geparst hat, dann ist sowas recht schnell gemacht
Übung macht den meister^^ -
Wenn du mir (glaubwürdig) sagst, wofür das Programm ist, ja.
Bots werden nicht unterstützt, und dein Programm sieht leider sehr danach aus.
Insbesondere die ImageSearchDLL macht sich immer verdächtig, da sie eigentlich nur für Spiele genutzt wird.
Normal reicht das AutoIt3Info-Tool vollkommen aus, um Fenster fernzusteuern.ExitLoop wird einfach in einem While platziert. Wird es erreicht, wird die Schleife verlassen. Normal schreibt man die Abbruchbedingung dann in die While-Schleife und platziert das ExitLoop in einer if-Bedingung.
-
Sieht so aus, als wäre die ImageSearchDLL nicht in dem Verzeichnis, da der DLLCall kein richtiges ergebnis zurückgibt.
-
So, habs mir mal angeschaut, nen kleinen Moment hatte ich noch
Aus der Seite hab ich mal ausgelesen, wo die die Daten her hat. Die kommen von einer JSON-Abfrage:
Laufende Einsätze: http://intranet.ooelfv.at/webext2/getjson.php?scope=laufend&callback=?
Die Adresse einfach mit InetRead herunterladen.
Alle Adressen:
ressource_current = http://intranet.ooelfv.at/webext2/getjson.php?scope=laufend&callback=?
ressource_day = http://intranet.ooelfv.at/webext2/getjson.php?scope=taeglich&callback=?
ressource_2days = http://intranet.ooelfv.at/webext2/getjson.php?scope=2tage&callback=?
ressource_6hours = http://intranet.ooelfv.at/webext2/getjson.php?scope=6stunden&callback=?
ressource_district = http://intranet.ooelfv.at/webext2/getjson.php?scope=taeglich
ressource_detail = http://intranet.ooelfv.at/webext2/detail.php?output=jsonUm die \u00e4 (Unicode Schriftzeichen herauszubekommen):
AutoIt#include <WinAPI.au3> Local $str = "My name is \u0393\u03A1\u0397" Local $utfStr = Execute("'" & StringRegExpReplace($str, "(\\u([[:xdigit:]]{4}))","' & ChrW(0x$2) & '") & "'") Local $ansiStr = _WinAPI_WideCharToMultiByte($utfStr) MsgBox(64,"Unicode2Ansi", $utfStr & @CRLF & $ansiStr)
Die JSON-Datei, diese musst du parsen und die Daten verarbeiten. Kannst ja mal versuchen, wie weit du kommst
Mit dem Kram kannst du alles bis aufs senden mit dem Messenger aus deinem Script rausnehmen.
Das auslesen kannst du dann einfach öfter wiederholen.
(Würde empfehlen, nicht allzuoft, um die Seite nicht allzusehr auszuwerten. Denke, alle 30 Sekunden, oder so dürfte reichen)Zum Parsen kannst du RegExp nutzen z.B. StringRegExp($sJSON,'"cnt_feuerwehren":(.*?),')
Und _StringBetween($sJSON,'"cnt_feuerwehren":',","), gibt nen array. In diesem Fall einfach mit [0] auf den ersten Eintrag zugreifen
Und ...
Probier einfach mal aus.
Dadurch ist dein Programm auch nicht sehr Fehleranfällig, sobald du beim Parsen alle eventualitäten bedenkst.Dies ist ein Beispieldatensatz. Hab ihn eingerückt, damit du eine bessere Übersicht bekommst. Du musst Parsen, als würde alles in einer Zeile stehen.
Beispiel JSON:Code
Alles anzeigen?( { "webext2":true, "version":"1.2", "title":"laufende Eins\u00e4tze", "pubDate":"Tue, 02 Feb 2016 23:10:04 +0100", "cnt_feuerwehren":7, "cnt_einsaetze":2, "einsaetze": { "0": { "einsatz": { "num1":"E160200347", "einsatzort":"GM - EBENSEE", "startzeit":"Tue, 02 Feb 2016 18:53:00 +0100", "inzeit":"", "status":"offen", "alarmstufe":1, "einsatzart":"BRAND", "einsatztyp": { "id":"BRAND", "text":"BRANDEINSATZ GRO\u00df" }, "einsatzsubtyp": { "id":"HAUS-BG", "text":"BRAND WOHNHAUS" }, "adresse": { "default":"LANGWIESERSTRA\u00dfE 132", "earea":"LANGWIES", "emun":"EBENSEE", "efeanme":"LANGWIESERSTRA\u00dfE", "estnum":"132", "ecompl":"" }, "wgs84": { "lng":13.704905457987, "lat":47.759718135386 }, "bezirk": { "id":3, "text":"Gmunden" }, "cntfeuerwehren":5, "feuerwehren": { "403102":{"feuerwehr":"FF Bad Ischl"}, "403103":{"feuerwehr":"FF Ebensee"}, "403107":{"feuerwehr":"FF Langwies"}, "403114":{"feuerwehr":"FF Rindbach"}, "403115":{"feuerwehr":"FF Roith \/ GM"} } } }, "1": { "einsatz": { "num1":"E160200342", "einsatzort":"SE - TERNBERG", "startzeit":"Tue, 02 Feb 2016 18:14:04 +0100", "inzeit":"", "status":"offen", "alarmstufe":1, "einsatzart":"TEE", "einsatztyp": { "id":"VU", "text":"VERKEHRSUNFALL" }, "einsatzsubtyp": { "id":"AUFRAEUM-VU", "text":"VERKEHRSUNFALL AUFR\u00c4UMARBEITEN" }, "adresse": { "default":"SCHOBERSTEINSTRA\u00dfE 10", "earea":"TERNBERG", "emun":"TERNBERG", "efeanme":"SCHOBERSTEINSTRA\u00dfE", "estnum":"10", "ecompl":"" }, "wgs84": { "lng":14.345625029402, "lat":47.914746905637 }, "bezirk": { "id":11, "text":"Steyr-Land" }, "cntfeuerwehren":2, "feuerwehren": { "411317":{"feuerwehr":"FF Trattenbach"}, "41510106":{"feuerwehr":"FW Technischer Zug Steyr"} } } } } } );
Hoffe, das hilft dir weiter.MfG Kanashius.
Edit: Hier wird das Parsen von der Seite gemacht:
view-source:http://ooe.martinhochreiter.at/javascript/functions.js?v1
Hilft dir vielleicht noch. -
Eine Entlosschleife kann mit ExitLoop verlassen werden, sodass es hinter der Schleife weiter geht.
Ich empfehle allerdings, auf die ImageSearch zu verzichten, da sie nur selten vernünftig zum Ziel führt. -
@autoBert:
Sieh mal hier: http://ooe.martinhochreiter.at/#about
Dort steht, dass die Infos von den Livedaten stammen. Woher die Seite die Daten hat ist ja auch relativ egal, da muss sich die Seite verantworten (wobei für mich dort alles rechtens aussieht). Dort steht sogar, warum es unter privatem Namen steht...Also mal ganz abgesehen davon, dass das ein sehr langweiliges Spiel wäre... Du musst doch nicht immer gleich jeden verdächtigen einen Bot zu schreiben, nur weil er etwas automatisieren möchte
Hab grad keine Zeit (Klausuren), werds mir demnächst ansehen, falls bis dahin niemand eine Antwort/Lösung hat.
OÖLFV bei google gibt auch direkt die Original-Seite, sowie die hier genannte als 2tes Ergebnis.
@Stoani':
Magst du einmal präzisieren, wie genau wir dir helfen können? Suchst du nach einer Besseren Lösung, einfach nur allgemeinen verbesserungs Vorschlägen,... hab dein Problem nicht so genau erkennen können.Edit: (Autobert,) Da du den zugriff auf der Offiziellen Seite nicht gefunden hast:
http://intranet.ooelfv.at/
Dort links einfach in der Liste draufklicken. -
Aus der Hilfe:
AutoIt
Alles anzeigen#include <MsgBoxConstants.au3> Example() Func Example() Local $iValue = 0 Local $sBlank = "Test" Select Case $iValue = 1 MsgBox($MB_SYSTEMMODAL, "", "The first expression was True.") Case $sBlank = "Test" MsgBox($MB_SYSTEMMODAL, "", "The second expression was True") Case Else ; If nothing matches then execute the following. MsgBox($MB_SYSTEMMODAL, "", "No preceding case was True.") EndSelect EndFunc ;==>Example
Dazugehörig die If-Bedingung:
AutoIt
Alles anzeigen#include <MsgBoxConstants.au3> Example() Func Example() Local $iValue = 0 Local $sBlank = "Test" if $iValue=1 then MsgBox($MB_SYSTEMMODAL, "", "The first expression was True.") elseif $sBlank = "Test" then MsgBox($MB_SYSTEMMODAL, "", "The second expression was True") else MsgBox($MB_SYSTEMMODAL, "", "No preceding case was True.") endif EndFunc ;==>Example
Ist also eigentlich fast nur eine andere Schreibweise (intern sind dort noch nen paar unterschiede)
Die Bedingungen musst du also immernoch mehrfach aufzählen. Deshalb hatte ich nichts damit eingebaut. Es macht hier nicht wirklich Sinn.Habs jetzt mal so umgeschrieben, wie es zu dem passt, wie dus beschrieben hast. Das mit der Suche könnte man noch ändern, jenachdem, was für Bedingungen es dort gibt.
Hoffe, ich habs richtig verstanden:AutoIt
Alles anzeigen;Ordner mit | getrennt, Wenn was vor den Dateinamen soll mit & an den Ordner anhängen $arSearchFolders=[ _ [""], _;2000 [""], _;2001 [""], _;2002 [""], _;2003 [""], _;2004 [""], _;2005 [""], _;2006 [""], _;2007 ["Angebot 2008|alte Angebot 2008|alte Angebot 2008&AN-"], _;2008 [""], _;2009 [""], _;2010 [""], _;2011 ["Angebot 2012|alte Angebot 2012|Auftrag 2012|Auftrag 2013"], _;2012 ] _search("01-1111-8") Func _search($sEingabe) $tmpIndex=StringInStr($sEingabe,"-",0,-1) $iYear=Int(StringRight($sEingabe,StringLen($sEingabe)-$tmpIndex)) $arFolders=_searchFor("C:\Ordner",$iYear,$sEingabe) for $i=0 to UBound($arFolders)-1 step 1 MsgBox(48,"Info","Found: "&@crlf&$arFolders[$i]);@LF ist unter Linux/iOS verbreitet, Windows nutzt @crlf, sonst keine Zeilenumbrüche im Notepad, z.b. next EndFunc Func _searchFor($sFolder,$sYear,$sFile) local $arFoundFiles[0] $sFolders=$arSearchFolders[$sYear] $arFolders=StringSplit($sFolders,"|",1+2) For $i=0 to UBound($arFolders)-1 step 1 $arInfos=StringSplit($arFolders[$i],"&",1+2) $tmpFile=$sFile if UBound($arInfos)>0 then $tmpFile=$arInfos[1]&$sFile If FileExists($sFolder&"\"&$arInfos[0]&"\"&$tmpFile) Then ReDim $arFoundFiles[UBound($arFoundFiles)+1] $arFoundFiles[UBound($arFoundFiles)-1]=$sFolder&"\"&$arInfos[0]&"\"&$tmpFile EndIf next return $arFoundFiles EndFunc
-
Habs jetzt so gekürzt:
AutoIt
Alles anzeigenFunc _goAngAlt() Local $IAngA = GUICtrlRead($InpAngAlt3) ; Jahr auslesen '8' oder '11' Local $AngAltGanzNum = GUICtrlRead($InpAngAlt1) & '-' & GUICtrlRead($InpAngAlt2) & '-' & $IAngA ; = AngebotsNummer 'XX-XXXX-X' oder 'XX-XXXX-XX' Local $OrdAngAlt = $OrdAngJa & "20" & $IAngA & "\" ; Pfad zusammen setzen "G:\Dateien\Kunden\ANGEBOT " +'20'+'8' oder '11' If (StringLen($IAngA) < 2) Then $OrdAngAlt = $OrdAngJa & "20" & "0" & $IAngA & "\" ; wenn nur '8' dann '20'+'0'+'8' Local $OrdAngAlt2 = $OrdJahrAA & "20" & $IAngA & "\" ; Pfad zusammen setzen "G:\Dateien\alte Aufträge\Kunden\ANGEBOT " +'20'+'8' oder '11' If (StringLen($IAngA) < 2) Then $OrdAngAlt2 = $OrdJahrAA & "20" & "0" & $IAngA & "\" ; ; wenn nur '8' dann '20'+'0'+'8' If Not FileExists($OrdAngAlt) Or Not FileExists($OrdAngAlt & $AngAltGanzNum) Then ; normale 'ANGEBOT 20XX' oder 'ANGEBOT 20XX' + '12-XXXX-XX' If MsgBox(262144, $Inf, $LukAA, 0.3) = 1 Then return -1 If Not FileExists($OrdAngAlt2 & $AngAltGanzNum) Then ; alte Aufträge 12-2222-8 If MsgBox(262144, $Inf, $LukAA, 0.3) = 1 Then return -1 Local $SuchOrdAngAlt = _FO_FolderSearch($OrdAngAlt2, '*' & $AngAltGanzNum, True, 0, 0, 0) ; Suche nach Ordner 'AN-12-XXXX-XX' If Not (StringLen($SuchOrdAngAlt) > 10) Then ; alte Aufträge Suche: AN-12-2222-8 If MsgBox(262144, $Inf, $LukAA, 0.3) = 1 Then return -1 Local $SuchAngAlt2 = _FO_FolderSearch($OrdAufJa & "20" & $IAngA, $AngAltGanzNum, True, 2, 0, 0) ; Suche nach Ordner '12-XXXX-14' im AUFTRAG 2014 If $SuchAngAlt2 = "" Then ; alte Aufträge Suche 'AUFTRAG 20XX' +Suchfund If MsgBox(262144, $Inf, $LukAA, 0.3) = 1 Then return -1 Local $SuchAngAlt3 = _FO_FolderSearch($OrdAufJa & "20" & $IAngA + 1, $AngAltGanzNum, True, 2, 0, 0) ; Suche nach Ordner '12-XXXX-14' im AUFTRAG 2015 If $SuchAngAlt3 = "" Then ; alte Aufträge Suche 'AUFTRAG 20XX'+1 MsgBox(262208, 'Such-Info', 'Ordner Leider Nicht da!' & @LF & @LF & _ 'Such-Ordner = ' & $OrdAufJa & "20" & $IAngA + 1 & @LF & @LF & _ 'Such-Nummer = ' & $AngAltGanzNum, 11) Else _execute($SuchAngAlt3,$OrdAufJa & "20" & $IAngA + 1,@LF & $OrdAufJa & "20" & $IAngA + 1 & @LF & @LF & $SuchAngAlt3) EndIf Else _execute($SuchAngAlt2,$OrdAufJa & "20" & $IAngA,@LF & $OrdAufJa & "20" & $IAngA & @LF & @LF & $SuchAngAlt2) EndIf Else _execute($SuchOrdAngAlt,$OrdAngAlt2,@LF & $OrdAngAlt2 & @LF & @LF & $SuchOrdAngAlt) EndIf Else _execute($AngAltGanzNum,$OrdAngAlt2) ; öffnet alte Aufträge 'ANGEBOT 20XX' + '12-XXXX-XX' EndIf Else _execute($AngAltGanzNum,$OrdAngAlt) ; öffnet normale 'ANGEBOT 20XX' + '12-XXXX-XX' EndIf EndFunc ;==>_goAngAlt Func _execute($execute,$workDir,$msg=-1) ShellExecute($execute, "", $workDir, "open") if $msg<>-1 then Sleep(600) MsgBox(262144, 'Info', $msg, 11) endif EndFunc
Mehr kann man schlecht kürzen, ohne zu wissen, wie genau das Funktionieren soll.
Man muss zum vereinfachen regelmäßigkeiten suchen, die immer gleich sind. Oft helfen bei so etwas auch arrays, z.B. wenn man mehrere Ordner auf genau die gleiche Weise durchsuchen will,...
Mit nem return -1 springt man übrigens aus einer Funktion heraus und gibt -1 zurück, dort kann auch eine andere Rückgabe erfolgen, auf die dann reagiert werden kann. Dadurch spart man sich z.B. riesige If/Else Blöcke, bzw. die wo nichts passieren soll.MfG Kanashius