Freut mich das ich helfen konnte und gleich mal selber wieder was dazu gelernt
So soll es sein.
Freut mich das ich helfen konnte und gleich mal selber wieder was dazu gelernt
So soll es sein.
Danke für die Bestätigung
Das _ArrayDisplay wird natürlich nicht benötigt und habe ich nur zum Zeigen drinnen gelassen, da es mehrere Einträge gibt.
Bekloppterweise funktionierte es nicht den Titel mit wingethandle() mit "|" bzw. "| " zu erweitern (= keine Ergebnisse) aber auf diese Weise klappte es dann.
Btw.: Ich würde die Funktion für eine dynamische Verwendung so nutzen/Umbauen:
Opt('MustDeclareVars', 1)
WinMove(Get_Window('CLASS', 'TeamsWebView', '|'),"", 1, 1, 735, 720)
Func Get_Window($TYPE, $Data, $Extra); Type can be CLASS or TITLE
Local Const $aWinList = WinList("[REGEXP" & $TYPE & ":(?i)(.*" & $Data & "*)]")
For $i = 0 to Ubound($aWinList) - 1
If StringInStr($aWinList[$i][0], $Extra) then
Return $aWinList[$i][0]
EndIf
Next
EndFunc
Alles anzeigen
Ich habe es nochmal probiert und bekam immer 2 handles als Ergebnis. Allerdings war das 2. (in meinem aktuellen Test) immer das Gesuchte.
Dynamisch dann so:
Func Example()
; Retrieve a list of window handles using a regular expression. The regular expression looks for titles that contain the word SciTE or Internet Explorer.
Local Const $aWinList = WinList("[REGEXPCLASS:(?i)(.*TeamsWebView*)]")
_ArrayDisplay($aWinList)
For $i = 0 to Ubound($aWinList) - 1
If StringInStr($aWinList[$i][0], '|') then
WinMove($aWinList[$i][0],"", 1, 1, 735, 720)
ExitLoop
EndIf
Next
EndFunc ;==>Example
Alles anzeigen
Also ein Q&D Test mid dem Beispiel aus der Hilfe und der oben genannten Class funktioniert bei mir einwandfrei (fürs schließen und winmove)
Sicher das du das richtige handle hast?
Teams (ich nutze das "neue") hat im Titel bei mir alles mögliche stehen, und im Taskmanager sehe ich mind. 2 Unterprozesse für Teams, die "Micosoft Teams" enthalten, du hast also eine mind. 50%ige chance das falsche zu treffen (korrigiert mich wenn ich falsch liege).
Bei mir wäre im betreffenden Fenster für den Titel folgendes Konstant und in Kombination einmalig: "|Unternehmensname|account|Microsoft Teams" (evtl. reicht dir hier auch "|Microsoft Teams")
Aber die Class "TeamsWebView" könntest du ggf. auch nutzen.
Ich würde das eher in einer eigenen mini-sub Gui umsetzen, ist wesentlich einfacher und du hast volle Kontrolle.
Opt('MustDeclareVars', 1)
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
consolewrite(@CRLF & GUI_Create_1('"Auswahl für Nr. xxxxxx" & " treffen"', $MainGUIHandle) & @CRLF)
Exit
Func GUI_Create_1($Text, $MainGUI)
Local $Return
Local Const $LocalGui = GUICreate("Stammdaten - Auswahl", 320, 160, -1, -1, $DS_SETFOREGROUND + $WS_EX_TOPMOST + $WS_SYSMENU)
Local Const $Doku = GUICtrlCreateButton("Doku öffnen", 5, 100, 100, 25)
Local Const $Druck = GUICtrlCreateButton("Nr.-Druck" , 105, 100, 100, 25)
Local Const $ERP = GUICtrlCreateButton("ERP suchen" , 210, 100, 100, 25)
Local Const $Message = GUICtrlCreateLabel($Text, 10, 5, 310, 90, $SS_CENTER)
GUICtrlSetFont($Message, 12)
GUISetState(@SW_DISABLE, $MainGUI)
GUISetState(@SW_SHOW, $LocalGui)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
$Return 0
Case $Doku
$Return 3
Case $Druck
$Return 4
Case $ERP
$Return 5
EndSwitch
WEnd
GUIDelete($LocalGui)
GUISetState(@SW_ENABLE, $MainGUI)
Return $Return
EndFunc
Alles anzeigen
Dein 2. Parameter ($MB_ABORTRETRYIGNORE) sperrt das X
Ich habe 13 Jahre mit einem Mitarbeiter zusammengearbeitet und immer mal wieder dessen Code debuggen müssen. Dabei saß ich immer neben ihm und habe genauestens erklärt was ich da mache und warum. 13 Jahre lang.....Mittlerweile ist es schon "viel" besser geworden, aber die Hilferufe kommen immer noch.....nicht mehr so oft, aber sie kommen?! Warum? Ich schreibe "Easy-Code", versuche nur die einfachsten Konstrukte zu benutzen, so dass jeder Dorfdepp in meinem Code lesen kann wie in einem Buch. Dafür musste ich mich vom Geschäftsführer einer (von uns verwendeten) führenden ERP-Branchensoftware als "Oldschool-Dinosaurier" bezeichnen lassen müssen. Die Retourekutsche drücke ich ihm jeden Monat wenn seine Jungs und Mädels als "Vollprofis" wieder mal programmiertechnischen Sondermüll abliefern. Wenn professionelle Datenbankspezialisten Funktionen abliefern die 1000x länger brauchen wie die eines "Freizeit-Oldschool-Dinosaurier"-Programmierers, dann sind wohl Nachfragen erlaubt. Genau wie danach, wieso gefixte Bugs nach diversen Updates "plötzlich" wieder auftauchen.....
Das erninnert mich an meine Azubi Zeit (Komm.Elektroniker), wo wir auch welche hatten, bei denen mann alles vorgeben mussten und kaum eine Schaltung ohne Fehler hin gebratzt haben und dann nicht mal in der Lage waren ihren Fehler selber zu finden (für mich war das wiederum eine gute Übung :P). Ich wunder mich bis heute wie die die Prüfung geschafft haben XD.
____
Btt: Warum ich das geschrieben habe: Wenn du Code nicht lesen kannst (weil schlecht angeordnet, oneliner etc.) wirst du ggf. Probleme haben ihn zu debuggen. Aber ich gebe dir Recht, die Basis von allem ist, den Code zu verstehen, nicht wie er "aufgeschrieben oder eingeordent" wurde.
Ich persönlich bin kein Freund von solchen Zeilen: #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
Die angezeigten "Fehler" sind zu 99% keine und während der Entwicklung von Programmen behindern sie mich und stören meinen "Flow" und die Kreativität. Imho sind diese Zeilen dazu geeignet, nach (!) der Erstellung eines lauffähigen Script dieses "schön" zu machen. Was mich als Privatanwender (auch wenn ich Scripte sehr oft im beruflichen Leben verwende) einen Scheiss interessiert! Form follows function....
Dem kann ich nicht zustimmen. Ich hatte bisher keine Fehler die nicht auch welche waren (und ja, das man eine Variable definiert aber faktisch danach nicht nutzt, ist meiner Ansicht ein Fehler, denn unnötiger Code). Und Kreativität gehört für mich nicht in den Code, sondern das Programm selber.
Wenn Beipiele wie oben (der Variablenname ist unterschiedlich, von dir selber aufgezeigt) auftreten, kann das durchaus ein Tippfehler sein wo diese Fehlermeldung drauf zeigt (solche Zeilen gehören dann auskommentiert oder korrigiert). Auch das man strickt drauf achtet, das Variablen deklariert werden und das auch im richtigen Kontext (kein Local im Global scope z.B.)gehört für mich nicht zum"schön machen", sondern zum kleinen 1*1, da sonst Variablen im Global auftauchen können, die da gar nicht hin gehören (in anderen Sprachen sogar ein MUSS), usw..
Code "schön" machen ist für mich eher, sich an Einrückungen zu halten, keiner mag oneliner hinzubratzen etc. wobei ich auch da eher auf "Lesbarkeit" als "Schönheit" verweisen würde.
Ja, es ist Ansichtssache und soll kein "blame" sein aber gewisse Grundregeln gehören für mich dazu, auch wenn man alleine am Code arbeitet.
Naja Grundsätzlich teste ich Code auf diverse Weise.
Bei Funktionen (oder auch Units :P) kommt es bei mir auf den Anwendungsfall an, da:
- Ich mir die Funktionen step by Step zusammenbaue mit vielen Entwicklungsschritten und damit auch vielen Zwischentests um zu prüfen ob das jeweilig erwartete Ergebnis heraus kommt.
- es meißt viele Abhängigkeiten außerhalb des eigentlichen Skriptes gibt, wo ich auf Test-PC's arbeite aber somit oft nicht nur die Unit/Funktion prüfen muss, sondern das gesamte bis dahin erstellte Skript.
"Echte" Unit-Tests würde ich behaupten mache ich nur, wenn ich einen Ausgangsstring angeben kann der dann in Ergebnis X umgewandelt werden muss. Bei allem anderen eher wie oben beschrieben.
Gesamtspielzeit von aktueller Spielesitzung
Habe ich. Es geht um die Gesamtspielzeit seit ich jemals das Spiel gestartet habe. Führe dazu doch einfach mal mein Script aus. Wenn du weißt, wie es funktioniert, dann bitte erleuchte mich ^^. Ich bekomm es nicht hin.
Auch wenn man es leicht ändern kann und in deinem Fall überschaubar ist: ich für meinen Teil werde niemals fremden Code ausführen der (weder lesend noch schreibend) auf die Registry zugreift.
Aber die Berechnung ist doch Prinzipiell die Gleiche, nur das du andere Start- und End-Werte hast.
Also was funktioniert dabei nicht (genaue Beschreibung)?
Tipp: Baue eine Funktion die diese Berechnung macht und nutze sie für beide á la: $diff = _calculateDiff($StartTime, $Endtime) die dir dann immer einfach den Wert zurück gibt.
Wenn das dann bei einem von beidem nicht passt, weißt du das entweder die Startzeit oder die Endzeit nicht passt.
Btw.: Hast du diese mal geprüft ob diese stimmen?
Hmm, ich war bei UDF, vielleicht bin ich noch nicht ganz wach XD
Müsste RegWrite($regKey, $regValuePlayTime, $REG_STR_TYP, $iTotalPlaytime) nicht eher in die Funktion _StopGame() (Oder danach)?
Da muss ich mich quasi ausklammern
Ich baue selber normalerweise keine Units, erst recht nicht komplett universell. Dafür ist der Anwendungsbereich hier immer viel zu speziell.
Ansich ist der WebDriver super dafür geeignet.
Allerdings da wir den Monitoring Bildschirm nur bei uns in einer kleinen Abteilung nutzten, sollte es so einfach wie möglich bleiben. Da ist es uns egal wenn da ein Mauszeiger wie von Geisterhand über die Oberfläche schwebt ^^. Da wir die Auflösung ebenfalls nicht ändern, ist uns dies auch egal und selbst wenn, kann man das Verhältnis ja schnelle umrechnen und die Koordinaten austauschen.
Also für unseren Zweck vollkomen ausreichend.
Allerdings les ich mir das Tutorial trotzdem gerne durch einfach interesse halber!
Worauf ich halt abgezielt habe war:
- Änderung der Auflösung, weil z.B. nach defekt des Monitors dieser getauscht wird und eine andere (Default) Auflösung/Seitenverhältnis aufweist -> Änderung am Programm notwendig
- Änderung der Position der Buttons etc., weil der Report, der für euch da erzeugt wird (Durch Update der Software oder des Reports selber) geändert wurde -> Änderung am Programm notwendig
- ...
Was nicht abgedeckt wäre:
- Änderung der id's im HTML etc. dann müsste natürlich bei der Webdriver-Varainte nachgebessert werden, das sollte aber wenn das auch nur einigermaßen gut umgesetzt ist seltenst passieren.
Wie gesagt eine gut gemeinte und für zukunftsicheren Betrieb ausgelegte Empfehlung.
Ich würde es aus deiner Sicht, erst mal lassen wie es ist, wenn du damit wie du sagst zufrieden bist aber trotzdem, wenn Zeit da ist, versuchen das parallel über webdriver umzusetzen und wenns läuft, ersetzen.
Wenn ich "F10" Daraufhin drücke startet die While schleife von vorne, das ist mir aber vollkomen ausreichend.
Dann mache z.B. anstatt
IF $Run Then
; Go to the top part of the Website
MouseWheel("up", 20)
; Execute the left Click on Overview
MouseClick("left", 210, 125)
; Pause for 2 Minutes
Sleep(120000)
Endif
folgendes:
While $Run
sleep(100)
Wend
; Go to the top part of the Website
MouseWheel("up", 20)
; Execute the left Click on Overview
MouseClick("left", 210, 125)
; Pause for 2 Minutes
Sleep(120000)
Alles anzeigen
Er bleibt dann solange in der While Schleife bis Run auf False gesetzt wird und macht dann mit den Sachen danach weiter.
Das Else kannst du weg lassen DivineFaith, das war wie gesagt nur zum Testen/Veranschaulichen. Und das Sleep sitzt an der falschen Stelle (muss vor das Wend)
Ich empfehle dennoch mal an deiner Stelle das mit dem Webdriver, das SOLVE-SMART netterweise zu diesem Zweck einmal erläutert hat, umzubauen, einfach weil du dann auch unabhängig von Monitorauflösungen und sonstigen Faktoren bist, die zum Beispiel die Position der relevanten Felder beeinflusst oder ob die Webseite/Unterseite überhaupt geladen werden kann. Zudem sieht man dann keinen Cursor umherhuschen, was das ganze dann auch für den Betrachter etwas professioneller macht und teilweise ggf. sogar schneller, weil du nicht zwangsläufig 2Sekunden warten musst, sondern einfach wartest bis das entsprechende Element/Seite fertig geladen wurde.
Ich vermeide best möglich MouseClick und dein aktuelles Skript kann auch dabei noch optimiert werden, da MouseClick auch Koordinaten unterstützt:
; Set Variable on False so that the script will not start by itself
$Run = False
; Set a Hotkey for starting changing the Dashboard
HotKeySet("{F10}", "_start")
; Set a Hotkey for stopping changing the Dashboard
HotKeySet("{F9}", "_pause")
While True
If $Run Then
MouseClick("left", 550,125)
Sleep(150)
MouseClick("left", 550, 170)
; Pause for 2 Minutes for changing the Dashboard
Sleep(1200)
MouseClick("left", 460, 125)
MouseClick("left", 45, 185)
Sleep(150)
MouseClick("left", 45, 420)
; Pause for 2 Minutes
Sleep(1200)
; Show lower part of the Website
MouseWheel("down", 10)
; Pause for 2 Minutes
Sleep(1200)
; Go to the top part of the Website
MouseWheel("up", 20)
; Pause just before clicking
MouseClick("left", 210, 125)
; Pause for 2 Minutes
Sleep(1100) ;1200-100
EndIf
Sleep(100)
WEnd
Func _start()
$Run = True
EndFunc
func _pause()
$Run = False
EndFunc
Alles anzeigen
Um aber weitergehend helfen zu können, müsste man die Webseite kennen bzw. ich selber nutze (bisher, mangels fehlender Anforderung) den Webdriver nicht, kann daher dabei dann nicht wirklich helfen.