Du meinst wenn du dein Programm ausführst, ohne die _shellExecuteHidden() Variante, also nicht versteckt, dann kannst du derzeit mit dem dropdown arbeiten und wenn du im "verstecktem Modus" arbeitest, dann geht das nicht?
Oder geht es so oder so nicht?
Viele Grüße
Sven
Beiträge von SOLVE-SMART
-
-
Hi Windi ,
alles gut, ich habe ja extra geschrieben das du mich auf eine witzige Art und Weise fertig machst - also alles gut 😀 .
Kaputt habe ich mich nicht gelacht, war eher ein Schmunzeln. Das du kein englisch kannst, ist auch kein Problem, deswegen sind wir ja hier auch im deutschen Forum.
Bzgl. translator, ja klar, da bekommt man manchmal seltsames übersetzt. Naja.
Wenn mich irgendwas wirklich nerven würde, würde ich mich nicht so bemühen zu antworten oder Quellcode bereitstellen, daher habe ich bereits Mitleid bzw. Verständnis trifft es eher, Werner 😀 . Angenehmen Tag heute, bis zu nächsten Frage dann (vielleicht in einem neuen Thread).
Viele Grüße
Sven -
Hi Swiffer ,
warum muss was anderes ran? Du kannst deinen gesetzten Timer auch neu setzen TimerInit() und dann erneut per TimerDiff() abfragen.
Hier mal eine abgeänderte Variante deines Beispiels:
AutoIt
Alles anzeigenSleep(3000) HotKeySet('{F10}', '_Exit') While True _A('e') _B('f') WEnd Func _Exit() Exit EndFunc Func _A($sCharacter) _DoStuff($sCharacter) EndFunc Func _B($sCharacter) _DoStuff($sCharacter) EndFunc Func _DoStuff($sCharacter) Local Const $hTimer = TimerInit() Local Const $iTimeout = 5 * 1000 While True If TimerDiff($hTimer) >= $iTimeout Then ExitLoop EndIf Send($sCharacter) Sleep(1000) WEnd EndFunc
Ergebnis: eeeeefffffeeeefffffeeeeefffffeeeeefffffeeeeeff..
Viele Grüße
Sven -
[...] der 2. Code hat funktioniert. Mit dem 1. weiß ich nicht wohin??? [...]
Ist ehrlich gesagt auch egal, denn die zweite Variante ist die sicherere 👍 .
Wo finde ich die udf.
Du machst mich fertig Werner, auf eine witzige Art und Weise 🤣 . Du hast die UDF doch selbst verlinkt: englisches Forum.
UDF:AutoIt
Alles anzeigen#include <WinAPIEx.au3> ; #FUNCTION# ==================================================================================================================== ; Name ..........: ShellExecuteHidden ; ; Description ...: runs a process on another winApi-desktop, so that none of its windows ever get visible, but can be automated by window messages and other technologies. ; The difference to shellExecute( ... , ... , @SW_HIDE ) is, that no just the first, but any windows from the created process will stay totaly isolated from user input and graphics ; ; Syntax ........: ShellExecuteHidden($filepath[, $parameters = "" [, $returnType = 1 [, $waitingOption = -1 ]]]) ; ; Parameters ....: $filepath - the file to run ; ; $returnType = 0 >> returns window handle of toplevel window of the started process ; even if its window is "hidden" (would not be visible on normal desktop) ; = 1 >> returns window handle of toplevel window of the started process ; = 2 >> returns process id (PID) of the started process ; ; ; $waitingOption = -2 >> dont wait (not recommended for window handles, as they need some time to appear even if the program is loading fast) ; = -1 >> wait 1000 milliseconds for windows to "appear" but dont wait for processes to finish (compromise) ; = 0 >> wait for the process to finish or the window to appear ; = <x> >> wait <x> milliseconds for the process to finish or the window to appear (see "$returnType" ) ; ; Return values .: windowHandle or ProcessID ; Author ........: Bluesmaster ; Modified ......: 2013 - 11 - 09 ; Remarks .......: ; Related .......: ShellExecute, _WinAPI_CreateDesktop ; Link ..........: http://msdn.microsoft.com/en-us/library/windows/desktop/ms687098(v=vs.85).aspx ; Example .......: Yes ; =============================================================================================================================== Func _shellExecuteHidden($filepath, $parameters = "", $returnType = 1, $waitingOption = -1) ; 1 - Create Desktop ;Global Const $GENERIC_ALL = 0x10000000 $hNewDesktop = _WinAPI_CreateDesktop("ShellExecuteHidden_Desktop", $GENERIC_ALL) ; 2 - Start Process $tProcess = DllStructCreate($tagPROCESS_INFORMATION) $tStartup = DllStructCreate($tagSTARTUPINFO) DllStructSetData($tStartup, 'Size', DllStructGetSize($tStartup)) DllStructSetData($tStartup, 'Desktop', _WinAPI_CreateString("ShellExecuteHidden_Desktop")) Local $pid If _WinAPI_CreateProcess($filepath, $parameters, 0, 0, 0, 0x00000200, 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess)) Then $pid = DllStructGetData($tProcess, 'ProcessID') Else Return -1 EndIf ; 3 - Return Process If $returnType = 2 Then If $waitingOption > -1 Then ProcessWaitClose($pid, $waitingOption) Return $pid EndIf ; 4 - Return WindowHandle If $waitingOption = -1 Then Sleep(1000) ElseIf $waitingOption > 0 Then Sleep($waitingOption) EndIf While True ; keep searching for the window $aWindows = _WinAPI_EnumDesktopWindows($hNewDesktop, $returnType) ; $returnType = 0 >> means also list hidden windows If IsArray($aWindows) Then For $i = 1 To $aWindows[0][0] ;~ MsgBox( 0 , '' , $curPID & " " & $pid & " " & $hWnd & " " & $aWindows[$i][0] ) $hWnd = $aWindows[$i][0] If $pid = WinGetProcess($hWnd) Then ; same process? Do ; searching through parent windows ... $hLast = $hWnd ; cache it for not loosing it when desktop is reached $hWnd = _WinAPI_GetParent($hLast) Until $hWnd = 0 ; ... until root/ desktop is reached $hWnd = $hLast Return $hWnd ; return the toplevel-window of the process EndIf Next EndIf If $waitingOption = 0 Then ; keep searching for the window until it appears ( in worst case endless ) Sleep(200) Else Return -1 EndIf WEnd EndFunc ;==>_shellExecuteHidden
Beispiel von Bluesmaster (Author):
AutoIt
Alles anzeigen; EXAMPLE 1 ( principle ): ; 1 - open a programm with @SW_HIDE ShellExecute(@ComSpec, "/c start notepad.exe", "", "", @SW_HIDE) WinWaitActive("[CLASS:Notepad]") ControlSend("[CLASS:Notepad]", "", "Edit1", "As you can see, you cannot prevent an hidden started application " & @LF & "from opening another window that gets visible...") MsgBox(0, '', "I understand. show me the version with appstart on hidden desktop") WinKill("[CLASS:Notepad]") ; 2 - do the same routine with "_shellExecuteHidden" $hWinHiddenApp = _shellExecuteHidden(@ComSpec, "/c start notepad.exe") ShellExecute("taskmgr.exe") MsgBox(0, '', "...´ok look in your taskmanager now. There should be a new notepad.exe entry but no window is visible.") ; 3 - close hidden application WinKill($hWinHiddenApp) ; EXAMPLE 2 ( interaction ): ; 1 - start hidden application MsgBox(0, '', "Now we start an editor on the hidden desktop and interact with it programmaticly") $hWinHiddenApp = _shellExecuteHidden(@SystemDir & "\notepad.exe") ; 2 - send to hidden application ControlSend($hWinHiddenApp, "", "Edit1", "di{BS}eb{BS}mk{BS}os{BS}") ; 3 - receive information from hidden application MsgBox(0, '', "Text in the editor on hidden desktop: " & @LF & @LF & ControlGetText($hWinHiddenApp, "", "Edit1")) ; 4 - close hidden application WinKill($hWinHiddenApp)
Viel Erfolg Werner 🤞 .
Viele Grüße
Sven -
Entweder du nutzt den capabilities JSON string wie folgt:
AutoIt
Alles anzeigenGlobal $sCapabilities = _ '{' & _ ' "capabilities": {' & _ ' "alwaysMatch": {' & _ ' "browserName": "firefox",' & _ ' "acceptInsecureCerts": true,' & _ ' "moz:firefoxOptions": {' & _ ' "args": [' & _ ' "--headless"' & _ ' ]' & _ ' }' & _ ' }' & _ ' }' & _ '}'
oder besser noch du nutzt die _WD_CapabilitiesAdd() function. Dies sieht dann so aus und ist empfohlen damit man beim JSON bspw. keinen Tippfehler machst 😀 :
AutoIt
Alles anzeigenGlobal $sCapabilities = _CreateFirefoxDriverCapabilities() Func _CreateFirefoxDriverCapabilities() _WD_CapabilitiesStartup() _WD_CapabilitiesAdd('alwaysMatch', 'firefox') _WD_CapabilitiesAdd('browserName', 'firefox') _WD_CapabilitiesAdd('acceptInsecureCerts', True) _WD_CapabilitiesAdd('args', '--headless') Return _WD_CapabilitiesGet() EndFunc
Viele Grüße
Sven -
Achso 🤣 . Allerdings hat _MouseTrap() erstmal nichts mit der Funktion _shellExecuteHidden() zu tun.
Dies war sicherlich nur ein Beispiel von dir, um zu sagen das du keine Lust auf Experimente hast - verstehe.
Na gut, wenn du mit deinen zwei Fenstern leben kannst und willst, dann okay. Falls nicht, versuche _shellExecuteHidden() gern, da ist keine große Magie dabei.
Einfach _shellExecuteHidden($sPath & 'ITConv.exe') aufrufen und im Taskmanager siehst du das die Instanz läuft, aber eben nicht sichtbar. Nun solltest du deine Einstellungen im Programm machen können, ohne das die beiden angesprochenen Fenster aufpoppen.
Viele Grüße
Sven -
Hi Windi ,
was genau bekommst du denn nicht hin, bzgl. _shellExecuteHidden()? Die Funktion sieht sehr vielversprechend aus 😀 .
Der Eintrag ist zwar vom Nov. 2013, doch das sollte auch weiterhin noch genauso funktionieren.
Kannst du mit dem Beispiel zum thread post nicht deine ITConv.exe starten oder wo liegt das Problem?
Wäre doch toll wenn auch deine zwei letzten Fenster (Modale) nicht mehr kurz aufpoppen oder 😀 ?!Viele Grüße
Sven -
Bestenfalls könntest du den "ITN Converter" über eine API oder über die CLI steuern, doch es scheint weder noch und keine Dokumentation zu geben 😔 .
Bleibt wahrscheinlich nur die ControlClick() bzw. ControlHide() oder eben die anderen vorgeschlagenen Varianten.
Viele Grüße
Sven -
Hi Windi ,
um besser beurteilen zu können warum die Child-Fenster trotz @SW_HIDE sichtbar sind, bräuchten wir die Informationen des AutoIt Info Tools "Au3Info_x64.exe".
Aber abgesehen davon, und das folgende ist keine schöne und robuste Variante, kannst du per WinMove($sWinTitle, '', -3000, -3000) die aufpoppenden Modale außerhalb des Sichtbereiches schieben. Ansonsten kannst du die Modale ggf. per WinSetTrans($sWinTitle, '', 0) unsichtbar machen.All dies wäre nur ein Notnagel, doch für bessere Varianten fehlen, zumindest mir, mehr insights.
Viele Grüße
Sven -
Hi Windi ,
wie genau stellst du dir das vor? Zum einem habe ich bspw. nicht ITNConv.exe installiert und habe dies auch nicht vor, zum anderen verstehe ich nicht was du vor hast.
Bitte beschreibe ein wenig mehr, was du machen willst. Dann kann dir besser geholfen werden, Danke 🤝 .- An welcher Stelle deine Code snippets funktioniert etwas nicht so wie du erwartest?
- Was ist das Gesamtziel? Ggf. kann man deine Anforderung auch völlig anders angehen, doch dazu benötigt es mehr Infos.
Viele Grüße
Sven -
Hi Oscar ,
ja das ist wirklich nützlich, danke dir 😀 . Brauchte ich beruflich sogar mal in der Vergangenheit, damals haben wir eine Library bemüht, die nicht aktuell war. War deutlich umständlicher als dieser Ansatz.
Cool, Danke 👍 .
Viele Grüße
Sven
-
Hi Leute,
kurzes Update: Mein Plan war eigentlich das Tutorial in der zweiten Januar Woche (nächste Woche) zu veröffentlichen.
Doch leider ist das nicht machbar und die Veröffentlichung verschiebt sich ein wenig. Hoffentlich wird aber die Qualität dies ausgleichen 🤞 .Ich halte euch auf dem Laufenden [...] einfach um die Spannung etwas zu steigern 😅 .
Viele Grüße
Sven -
Weil ich einfach eine magic number, in diesem Fall den Wert einer Konstanten (konkret 0), eingesetzt habe und dann MsgBoxConstants.au3 raus genommen haben.
Zu #include's im allgemeinen kannst du dir einfach die Hilfe anschauen.
Viele Grüße
Sven
-
Hi WhiteHorse ,
deine Verschachtelungen sind das Problem. Schaue dir mal bitte meine kleine Modifikation hier an und falls du es nicht verstehst, gebe bitte Bescheid.Es sind nun damit alle MsgBox() erreichbar.
AutoIt
Alles anzeigen#include-once #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 615, 437, 192, 124) $MainCombo = GUICtrlCreateCombo("MainCombo", 16, 16, 145, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL)) GUICtrlSetData(-1, "Leer|Open Combo 2|Open Combo 3|Open Combo 4|Alle") GUICtrlSetCursor(-1, 0) $Combo2 = GUICtrlCreateCombo("Combo2", 16, 136, 145, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL)) GUICtrlSetData(-1, "Text von Combo2") GUICtrlSetState($Combo2, $GUI_HIDE) GUICtrlSetCursor(-1, 0) $Combo3 = GUICtrlCreateCombo("Combo3", 16, 224, 145, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL)) GUICtrlSetData(-1, "Text von Combo3") GUICtrlSetState($Combo3, $GUI_HIDE) GUICtrlSetCursor(-1, 0) $Combo4 = GUICtrlCreateCombo("Combo4", 16, 320, 145, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL)) GUICtrlSetData(-1, "Text von Combo4") GUICtrlSetState($Combo4, $GUI_HIDE) GUICtrlSetCursor(-1, 0) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $MainCombo $ComboReadProdukt = GUICtrlRead($MainCombo) Switch $ComboReadProdukt Case "Leer" GUICtrlSetState($Combo2, $GUI_HIDE) GUICtrlSetState($Combo3, $GUI_HIDE) GUICtrlSetState($Combo4, $GUI_HIDE) Case "Open Combo 2" GUICtrlSetState($Combo2, $GUI_SHOW) GUICtrlSetState($Combo3, $GUI_HIDE) GUICtrlSetState($Combo4, $GUI_HIDE) Case "Open Combo 3" GUICtrlSetState($Combo3, $GUI_SHOW) GUICtrlSetState($Combo2, $GUI_HIDE) GUICtrlSetState($Combo4, $GUI_HIDE) Case "Open Combo 4" GUICtrlSetState($Combo4, $GUI_SHOW) GUICtrlSetState($Combo2, $GUI_HIDE) GUICtrlSetState($Combo3, $GUI_HIDE) Case "Alle" GUICtrlSetState($Combo2, $GUI_SHOW) GUICtrlSetState($Combo3, $GUI_SHOW) GUICtrlSetState($Combo4, $GUI_SHOW) EndSwitch Case $Combo2 $ComboReadProduktCombo2 = GUICtrlRead($Combo2) Switch $ComboReadProduktCombo2 Case "Text von Combo2" MsgBox(0, "Information", "Ich bin nur ein Test für Combo 2") EndSwitch Case $Combo3 $ComboReadProduktCombo3 = GUICtrlRead($Combo3) Switch $ComboReadProduktCombo3 Case "Text von Combo3" MsgBox(0, "Information", "Ich bin nur ein Test für Combo 3") EndSwitch Case $Combo4 $ComboReadProduktCombo4 = GUICtrlRead($Combo4) Switch $ComboReadProduktCombo4 Case "Text von Combo4" MsgBox(0, "Information", "Ich bin nur ein Test für Combo 4") EndSwitch EndSwitch WEnd
Viele Grüße
Sven -
💡 Und wieder fehlt mir der "Like" button [...].
Alles klar und Danke dir AspirinJunkie 👍 .
Viele Grüße
Sven -
Hi AspirinJunkie ,
meinst du nicht gerade anders herum in deinem code snippet oben? Also so:
AutoIt$sInput = "é,ü,ö,ß,ä,è" ; String als ASCII kodiert in Variable speichern: $bQuelle = StringToBinary($sInput, 1) ; String als UTF-8 interpretiert einlesen: $sOutput = BinaryToString($bQuelle, 4) ; Ausgabe MsgBox(0,"", $sOutput)
Oder stehe ich gerade auf dem Schlauch?
Abgesehen davon: Cool, Danke! Habe das in der Vergangenheit (wenn ich's mal gebraucht habe), also immer zu umständlich gemacht 😅 .Viele Grüße
Sven -
Hi Moombas ,
hast du das Ergebnis der API Abfrage als Datei vorliegen (also als JSON response) oder ist es direkt in einer Variable gespeichert?
Warum ich frage ist, wenn du eine Datei hast, dann Datei kannst du diese doch mit entsprechendem Encoding öffnen und neu speichern.
Dann sollten die Sonderzeichen korrekt dargestellt werden.Kannst du den JSON response unverfälscht mal zu Verfügung stellen?
Viele Grüße
Sven -
Hi Tweaky ,
vielen lieben Dank für deine Antworten und deine Erklärungen. Verstehe nun glaube recht gut, wie die Situation ist und wie es von statten geht 👍 .
Ich muss allerdings nochmal über alles drüber schauen/nochmal lesen und darüber nachdenken, bevor ich hier wieder mit einem Statement um die Ecke komme 😅 .
Viele Grüße
Sven -
Hi MojoeB,
Moombas hat dein Problem ja bereits gelöst, dennoch möchte ich dir kurz zeigen, was das Problem war 😇 .
- Du wolltest $oIE außerhalb deiner Funktion Start_h1() nutzen, doch dort ist die Objekt-Variable nicht verfügbar.
- Du hast $IE mit $oIE vermischt, was Moombas bereits im Post #2 anmerkte 😅
Angenehmen Tag weiterhin 🤝 .
Update: Nur zur Vollständigkeit, ich habe vergessen die Zeile 15 zu entfernen, dies ist in der obigen Variante nicht nötig.Viele Grüße
Sven -
Entschuldigt bitte, dass ich hier ebenfalls ein kurzes off topic Statement einstreuen muss:
Mir fehlt hier wirklich der "like" button oder irgendeine Art der Zustimmungsfunktion oder sowas. Denn dann müsste man nicht immer solche Posts wie diesen hier verfassen.
Wir hatten das Thema schon mal und es gehört auch gar nicht hier her, daher nochmals sorry.
Kurz: Deiner Aussage BugFix stimme ich zu 100% zu 👍 .Viele Grüße
Sven