Dein Ansatz AspirinJunkie, ohne RegEx gefällt mir besser als mein ursprünglicher, da dieser einfach Beginner freundlicher ist 👍 .
Ansonsten schön, dass wir dein Thema lösen bzw. die Fragestellung beantworten konnten hipfzwirgel 😀 .
Viele Grüße
Sven
Dein Ansatz AspirinJunkie, ohne RegEx gefällt mir besser als mein ursprünglicher, da dieser einfach Beginner freundlicher ist 👍 .
Ansonsten schön, dass wir dein Thema lösen bzw. die Fragestellung beantworten konnten hipfzwirgel 😀 .
Viele Grüße
Sven
Hi hipfzwirgel ,
angenommen, dass deine Datei welche du einliest "data.txt" heißt und die folgenden Zeilen hat:
Rechnername1_Port1
Rechnername2_Port2
Rechnername3_Port3
Rechnername4_Port4
Rechnername5_Port5
Rechnername6_Port6
Rechnername7_Port7
Rechnername8_Port8
Rechnername9_Port9
Rechnername10_Port10
[...] und auch nichts anderes drin steht außer Rechnername und Port, wie beschrieben, würde es bspw. so aussehen:
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/sf /sv /mo /rm /rsln
#include <Array.au3>
Opt('MustDeclareVars', 1)
Global $aListOfComputerAndPort = FileReadToArray('data.txt')
_ArrayDisplay($aListOfComputerAndPort, 'Data')
Global $aListOfComputer = _RemoveSubstringAfterUnderscoreFromArray($aListOfComputerAndPort)
_ArrayDisplay($aListOfComputer, 'Data without "_PortN"')
Func _RemoveSubstringAfterUnderscoreFromArray($aList)
Local Const $sRegExPattern = '(.*?)_(.*?)$'
Local Const $iCount = UBound($aList) - 1
For $i = 0 To $iCount Step 1
$aList[$i] = StringRegExpReplace($aList[$i], $sRegExPattern, '$1')
Next
Return $aList
EndFunc
Alles anzeigen
Die ist allerdings nicht robust. Nur in Ordnung für diesen einen konkreten Fall. Aber vielleicht reicht dir dies ja auch schon?
Viele Grüße
Sven
Und nun noch die Variante mit einem transparenten Label:
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/sf /sv /mo /rm /rsln
Opt('MustDeclareVars', 1)
Global Const $iGuiCloseFlag = -3
Global Const $iControlTransparent = -2
Global Const $iControlShowFlag = 16
Global Const $iControlHideFlag = 32
Global Const $iControlEnableFlag = 64
Global Const $iControlDisableFlag = 128
Global $cLabel, $cToggleButton
_CreateGui()
While True
Switch GUIGetMsg()
Case $iGuiCloseFlag
Exit
Case $cToggleButton
_ToggleLabel()
EndSwitch
WEnd
Func _CreateGui()
Local Const $iWidth = 270
Local Const $iHeight = 150
Local Const $hGui = GUICreate('Test', $iWidth, $iHeight)
Local Const $sImageFilePath = 'C:\Windows\Web\Wallpaper\Windows\img0.jpg'
Local Const $cBackgoundImage = GUICtrlCreatePic($sImageFilePath, 0, 0, $iWidth, $iHeight)
$cLabel = GUICtrlCreateLabel('Label-Test', 10, 20, 250)
$cToggleButton = GUICtrlCreateButton('Anzeigen', 10, 80, 250)
GUICtrlSetState($cBackgoundImage, $iControlDisableFlag)
GUICtrlSetState($cLabel, $iControlHideFlag)
GUICtrlSetBkColor($cLabel, $iControlTransparent)
GUICtrlSetFont($cLabel, 13)
GUISetState(@SW_SHOW, $hGui)
EndFunc
Func _ToggleLabel()
If GUICtrlGetState($cLabel) == $iControlHideFlag + $iControlEnableFlag Then
GUICtrlSetState($cLabel, $iControlShowFlag)
GUICtrlSetData($cToggleButton, 'Verstecken')
Else
GUICtrlSetState($cLabel, $iControlHideFlag)
GUICtrlSetData($cToggleButton, 'Anzeigen')
EndIf
EndFunc
Alles anzeigen
Wenn man hier nun zügig und oft auf Anzeigen/Verstecken klickt, flackert der Label-Hintergrund, meinst du das???
Viele Grüße
Sven
Update:
Und hier casi4712 eine Variante mit Hintergrundbild:
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/sf /sv /mo /rm /rsln
Opt('MustDeclareVars', 1)
Global Const $iGuiCloseFlag = -3
Global Const $iControlShowFlag = 16
Global Const $iControlHideFlag = 32
Global Const $iControlEnableFlag = 64
Global Const $iControlDisableFlag = 128
Global $cLabel, $cToggleButton
_CreateGui()
While True
Switch GUIGetMsg()
Case $iGuiCloseFlag
Exit
Case $cToggleButton
_ToggleLabel()
EndSwitch
WEnd
Func _CreateGui()
Local Const $iWidth = 270
Local Const $iHeight = 150
Local Const $hGui = GUICreate('Test', $iWidth, $iHeight)
Local Const $sImageFilePath = 'C:\Windows\Web\Wallpaper\Windows\img0.jpg'
Local Const $cBackgoundImage = GUICtrlCreatePic($sImageFilePath, 0, 0, $iWidth, $iHeight)
$cLabel = GUICtrlCreateLabel('Label-Test', 10, 20, 250)
$cToggleButton = GUICtrlCreateButton('Anzeigen', 10, 80, 250)
GUICtrlSetState($cBackgoundImage, $iControlDisableFlag)
GUICtrlSetState($cLabel, $iControlHideFlag)
GUICtrlSetFont($cLabel, 13)
GUISetState(@SW_SHOW, $hGui)
EndFunc
Func _ToggleLabel()
If GUICtrlGetState($cLabel) == $iControlHideFlag + $iControlEnableFlag Then
GUICtrlSetState($cLabel, $iControlShowFlag)
GUICtrlSetData($cToggleButton, 'Verstecken')
Else
GUICtrlSetState($cLabel, $iControlHideFlag)
GUICtrlSetData($cToggleButton, 'Anzeigen')
EndIf
EndFunc
Alles anzeigen
Ich hoffe das bei dir das Standardbild "C:\Windows\Web\Wallpaper\Windows\img0.jpg" existiert, ansonsten nehm eines auf deinem Rechner 😀 .
Viele Grüße
Sven
Dann anders herum, hier ein Code-Beispiel (normales Label):
#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/sf /sv /mo /rm /rsln
Opt('MustDeclareVars', 1)
Global Const $iGuiCloseFlag = -3
Global Const $iControlShowFlag = 16
Global Const $iControlHideFlag = 32
Global Const $iControlEnableFlag = 64
Global $cLabel, $cToggleButton
_CreateGui()
While True
Switch GUIGetMsg()
Case $iGuiCloseFlag
Exit
Case $cToggleButton
_ToggleLabel()
EndSwitch
WEnd
Func _CreateGui()
Local Const $hGui = GUICreate('Test', 270, 150)
$cLabel = GUICtrlCreateLabel('Label-Test', 10, 20, 250)
$cToggleButton = GUICtrlCreateButton('Anzeigen', 10, 80, 250)
GUICtrlSetState($cLabel, $iControlHideFlag)
GUICtrlSetFont($cLabel, 13)
GUISetState(@SW_SHOW, $hGui)
EndFunc
Func _ToggleLabel()
If GUICtrlGetState($cLabel) == $iControlHideFlag + $iControlEnableFlag Then
GUICtrlSetState($cLabel, $iControlShowFlag)
GUICtrlSetData($cToggleButton, 'Verstecken')
Else
GUICtrlSetState($cLabel, $iControlHideFlag)
GUICtrlSetData($cToggleButton, 'Anzeigen')
EndIf
EndFunc
Alles anzeigen
Kannst du dieses Beispiel soweit erweitern, dass der Flackereffekt auftritt?
Viele Grüße
Sven
Kannst du dir bitte casi4712 , mal die Zeit nehmen und ganz in Ruhe beschreiben, was du eigentlich erreichen möchtest?
Dein Beispiel Skript ist nicht wirklich brauchbar, doch ich glaube wenn du langsam, Stück für Stück definierst, was du möchtest (auch unbedingt mit dem Gesamtziel), dann können wir dir ggf. ein Beispiel (Code) aufbauen/zeigen, den du dann für dich validieren kannst. Also bei dem du dann sagen kannst, ob es genau das ist was du willst und brauchst oder eben nicht.
So kommen wir ggf. besser ans Ziel, als mit diesem Code-Beispiel bisher. Der Inhalt deines ersten posts #1 reicht mir persönlich nicht aus, zu verstehen was du brauchst und möchtest.
Bitte formuliere es ganz in Ruhe voll aus, dann wird dir sicherlich gut und zügig geholfen, Danke 🤝 .
Viele Grüße
Sven
Hi casi4712 ,
kannst du bitte erstmal die etlichen Fehler im Skript beheben, die dir der AutoIt syntax checker (Au3Check.exe) sagt, wenn du #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 als erste Zeile deinem Skript hinzufügst und dann [STRG]+[F5] (Au3Check) ausführst? Ich hatte gerade damit begonnen, aber das ist mir ehrlich gesagt zu viel Aufwand/habe die Zeit gerade nicht.
Außerdem hat dein Beispiel nur bedingt viel mit deinem beschriebenen Problem zu tun, soweit ich erkennen konnte.
Viele Grüße
Sven
Okay, verstanden Werner, dann fällt mir ohne richtiges Testen (setzt voraus ich hätte das Programm installiert, dein Skript etc. - zu viel Aufwand), leider auch nichts mehr ein 😔 .
Viele Grüße
Sven
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
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:
Sleep(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
Alles anzeigen
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:
#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
Alles anzeigen
Beispiel von Bluesmaster (Author):
; 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)
Alles anzeigen
Viel Erfolg Werner 🤞 .
Viele Grüße
Sven
Entweder du nutzt den capabilities JSON string wie folgt:
Global $sCapabilities = _
'{' & _
' "capabilities": {' & _
' "alwaysMatch": {' & _
' "browserName": "firefox",' & _
' "acceptInsecureCerts": true,' & _
' "moz:firefoxOptions": {' & _
' "args": [' & _
' "--headless"' & _
' ]' & _
' }' & _
' }' & _
' }' & _
'}'
Alles anzeigen
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 😀 :
Global $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
Alles anzeigen
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 🤝 .
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