2017-12-11 3 views
-2

Ich installiere eine Datei mit dem folgenden Code;Wie kann ich ein Popup-Fenster in einem AutoIt-Skript ausblenden?

Run("file.exe", "", @SW_HIDE) 
WinWait("install", "") 
WinSetState("install", "", @SW_HIDE) 
Sleep(2000) 
ControlSend('install', '', '', 'E-mail') 
ControlSend('install', '', '', '{ENTER}') 
WinWait("install", "") 
WinSetState("install", "", @SW_HIDE) 

Es kann das Konsolenfenster verbergen, aber nach ein paar Sekunden ...

Ein System Popup zeigt ein anderes Installationsfenster für ein bisschen und dann versteckt, Installationsfortschritt zeigt.

Ich möchte wissen, wie dieses Fenster sowie das Konsolenfenster ausgeblendet werden.

Antwort

1

Es gibt eine Möglichkeit, eine Anwendung mit Autoit auf einem versteckten Desktop in Windows auszuführen, so dass für den Benutzer niemals Fenster sichtbar sind. Es ist sogar möglich, mit dieser Anwendung und ihren Fenstern über die integrierten send()/click()/etc ... Autoit-Funktionen zu interagieren.

Here ist ein Link auf die autoit Code dies auf den autoit Foren

Hier wird der Code zu tun, falls der Link stirbt:

hiddenDesktopInteract.au3:

#Region ;**** Directives created by AutoIt3Wrapper_GUI **** 
#AutoIt3Wrapper_UseUpx=y 
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** 
#include <WinAPI.au3> 
#include <WinAPIEx.au3> 
#include <GDIPlus.au3> 

;1st command line param that will launch seperate instance 
Const $hdiParam = 'hiddenDesktopInteract' 

;######DO NOT PUT ANY OTHER CODE ABOVE THIS THAT CALLS A 2ND INSTANCE OF THE SCRIPT OR ELSE YOU MAY END UP CALLING INFINITE INSTANCES AND CRASHING WINDOWS!!!!!! 
;seperate process for hidden desktop interaction 
;1st param should be 'hiddenDesktopInteract' and 2nd param is name of func to call for interaction code 
;ex: "autoit.exe script.au3 hiddenDesktopInteract interactionfunc" or "compiledscript.exe hiddenDesktopInteract interactionfunc" 
if $CmdLine[0] = 2 AND $CmdLine[1] = $hdiParam Then EXIT Call($CmdLine[2]) 

;credit to Decipher in thread https://www.autoitscript.com/forum/topic/152515-start-a-process-hidden/#comment-1095173 for code for running process on a hidden desktop 
Func _hiddenDesktopInteract_run($sProgram, $sInteractionFunc, $sCommand = '') 
    ;if the interaction function does not exist then don't do anything 
    If Not IsFunc(Execute($sInteractionFunc)) Then 
     ConsoleWrite('error: interaction function "' & $sInteractionFunc & '" for "' & $sProgram & '" does not exist' & @CRLF) 
     Return 
    EndIf 

    ;create structs 
    Local $tStartupInfo = DllStructCreate($tagStartupInfo) 
    DllStructSetData($tStartupInfo, "Size", DllStructGetSize($tStartupInfo)) 
    Local $tProcessInfo_targetApp = DllStructCreate($tagPROCESS_INFORMATION) 
    Local $tProcessInfo_interactionScript = DllStructCreate($tagPROCESS_INFORMATION) 

    ; Create Desktop 
    Local $hDesktop = _WinAPI_CreateDesktop('AutoItHidden', BitOR($DESKTOP_CREATEWINDOW, $DESKTOP_SWITCHDESKTOP)) 
    If Not $hDesktop Then 
     MsgBox(0, 'Error', 'Unable to create desktop.') 
     Exit 
    EndIf 

    ; Prep Process Info 
    Local $nSuccess = DllStructSetData($tStartupInfo, "Desktop", _WinAPI_CreateString("AutoItHidden")) 

    ;run target program on hidden desktop and get PID 
    _WinAPI_CreateProcess('', '"' & $sProgram & '"' & ($sCommand ? ' ' & $sCommand : ''), 0, 0, 0, 0x00000200, 0, 0, DllStructGetPtr($tStartupInfo), DllStructGetPtr($tProcessInfo_targetApp)) 
    Local $aPID_targetApp = DllStructGetData($tProcessInfo_targetApp, 'ProcessID') 
    ConsoleWrite('!>target app PID:' & $aPID_targetApp & @CRLF) 

    ;run instance of this script on hidden desktop to interact with target program 
    Local $sParams = '"' & @ScriptFullPath & '" ' & $hdiParam & ' ' & $sInteractionFunc 
    Switch @Compiled 
     case True 
      Local $sAppName = @ScriptFullPath 
      Local $sCommandLine = $sParams 
     case False 
      Local $sAppName = @AutoItExe 
      Local $sCommandLine = '"' & @AutoItExe & '" ' & $sParams 
    EndSwitch 
    _WinAPI_CreateProcess('', $sCommandLine, 0, 0, 0, 0x00000200, 0, 0, DllStructGetPtr($tStartupInfo), DllStructGetPtr($tProcessInfo_interactionScript)) 

    ;and get PID of interaction instance so we can wait until it is finished 
    Local $iPID_interactionScript = DllStructGetData($tProcessInfo_interactionScript, 'ProcessID') 
    ConsoleWrite('!>Interaction Script PID: ' & $iPID_interactionScript & @CRLF) 

    ;wait until interaction script instance is finished and get exit code (which is return value from interaction function) 
    ProcessWaitClose($iPID_interactionScript) 
    Local $exitcode_interactionScript = @extended 
    ConsoleWrite("!>Interaction Script Exit Code: " & $exitcode_interactionScript & @CRLF) 
    Local $sOutput = StdoutRead($iPID_interactionScript) 
    ConsoleWrite("!>Interaction Script Stdout: " & $sOutput & @CRLF) 

    ;close hidden desktop 
    Local $aRet = DllCall("User32.dll", "int", "CloseDesktop", "handle", $hDesktop) 
    ConsoleWrite("!>Close Desktop: " & $aRet[0] & @CRLF) ; Non-Zero is successfull! 

    Return $exitcode_interactionScript 
EndFunc 

Func _hiddenDesktopInteract_cap($title, $imgfile, $Left = 0, $Top = 0, $Right = -1, $Bottom = -1) 
    _GDIPlus_Startup() 
    $hWnd = WinGetHandle($title) 
    $iWidth = _WinAPI_GetWindowWidth($hWnd) 
    $iHeight = _WinAPI_GetWindowHeight($hWnd) 
    $hDDC = _WinAPI_GetDC($hWnd) 
    $hCDC = _WinAPI_CreateCompatibleDC($hDDC) 
    $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight) 
    _WinAPI_SelectObject($hCDC, $hBMP) 
    DllCall("User32.dll", "int", "PrintWindow", "hwnd", $hWnd, "hwnd", $hCDC, "int", 0) 
    _WinAPI_ReleaseDC($hWnd, $hDDC) 
    _WinAPI_DeleteDC($hCDC) 
    $hBMPclone = _GDIPlus_BitmapCreateFromHBITMAP($hBMP) 
    if $Right = -1 then 
     $iX = _GDIPlus_ImageGetWidth($hBMPclone) - $Left 
    Else 
     $iX = $Right - $Left 
    EndIf 
    if $Bottom = -1 then 
     $iY = _GDIPlus_ImageGetHeight($hBMPclone) - $Top 
    Else 
     $iY = $Bottom - $Top 
    EndIf 
    ;convert from 32bit bitmap to 24bit bitmap b/c 32bit bitmap cannot display correctly in autoit GUI for some reason 
    $hClone = _GDIPlus_BitmapCloneArea($hBMPclone, $Left, $Top, $iX, $iY, $GDIP_PXF24RGB) 
    _GDIPlus_ImageSaveToFile($hClone, $imgfile) 
    _WinAPI_DeleteObject($hBMP) 
    _WinAPI_DeleteObject($hBMPclone) 
    _WinAPI_DeleteObject($hClone) 
    _GDIPlus_Shutdown() 
EndFunc 

Das Beispielskript zeigt das Ausführen einer versteckten Instanz von notepad und cmd.exe und die Interaktion mit dieser über controlclick() und controlsend() und dann das Erfassen eines Screencaps des Fensters vor dem Schließen g es.

hiddenDesktopInteract_EXAMPLES.au3:

#include "hiddenDesktopInteract.au3" 

;test function for interacting with notepad app on hidden desktop 
func notepadtest() 
    opt('winwaitdelay', 0) ;to make it run a little bit faster 
    WinWait('[CLASS:Notepad]') 
    $hwin = WinGetHandle('[CLASS:Notepad]') 
    ControlSend($hwin, '', '[CLASS:Edit; INSTANCE:1]', 'hello{ENTER}') 
    WinMenuSelectItem($hwin, '', '&Edit', 'Time/&Date') 
    _hiddenDesktopInteract_cap($hwin, @DesktopDir & '\notepad_cap.jpg') 
    ControlSend($hwin, '', '[CLASS:Edit; INSTANCE:1]', '^a') 
    ControlSend($hwin, '', '[CLASS:Edit; INSTANCE:1]', '{DELETE}') 
    WinClose($hwin) 
EndFunc 

;test function for interacting with cmd.exe on hidden desktop 
func cmdtest() 
    opt('winwaitdelay', 0) ;to make it run a little bit faster 
    WinWait('[CLASS:ConsoleWindowClass]') 
    $hwin = WinGetHandle('[CLASS:ConsoleWindowClass]') 
    ControlSend($hwin, '', '', 'dir{ENTER}') 
    sleep(500) 
    _hiddenDesktopInteract_cap($hwin, @DesktopDir & '\cmd_cap.jpg') 
    ControlSend($hwin, '', '', 'exit{ENTER}') 
EndFunc 

_hiddenDesktopInteract_run("notepad.exe", 'notepadtest') 
_hiddenDesktopInteract_run("cmd.exe", 'cmdtest') 

Das ist so ziemlich nur eine Copy-Paste aus dem autoit Forum posten, aber ich glaube nicht, zu tun, dass ein Problem, weil ich der Autor dieses Pfeiler am .

0

Sie können jedes Fenster mit WinSetState ausblenden, aber Sie können natürlich nicht mehr mit den Steuerelementen dieses Fensters interagieren.

; wait for the window to appear 
Local $hWnd = WinWait("[CLASS:TheAppToHide]") 

; hide the window using the handle returned from WinWait 
WinSetState($hWnd, "", @SW_HIDE) 
+1

Sie haben Recht, aber wenn ich Control (‚install‘, ‚‘, ‚‘, ‚{ENTER}‘) senden die App ein neues Fenster öffnen, und ich will, es verbergen –

+0

Dann sollten Sie verwenden WinWait in diesem Popup-Fenster und verstecken Sie es mit WinSetState, wie ich schrieb. Oder meinst du, dass es kontinuierlich Popup-Fenster erstellt? – mrt

+0

Ich benutze WinWait in diesem Popup-Fenster, aber es offen für einen Moment und dann ausblenden –

Verwandte Themen