1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Bitnugger

Beiträge von Bitnugger

  • Programm als Admin ausführen mit eingeschränkten Rechten

    • Bitnugger
    • 11. Mai 2018 um 19:19
    Zitat von Candyland

    Ja richtig nur war diese Funktion noch keiner UDF zugeordnet daher wollte ich diese Global's ersteinmal in der Funktion drinnen haben

    Weil? Wie der Name schon sagt... Global... gehört in den globalen Bereich... nicht in eine Funktion. ,-)

    Zitat von Candyland

    Ich sehe nicht wo ich hier ein Filehandle nicht freigegeben habe, meines erachtens nach ist hier jedes Handle sauber nach nutzung wieder Geschlossen worden

    Hier...

    AutoIt
        $h_xml = FileOpen($fSaveTo, 2)
        if $h_xml = -1 Then Return False
        $w_xml = FileWrite($h_xml, $sBinXML)
        if $w_xml = 0 Then Return False      ; <-- Genau hier... das Filehandle muss vor dem Return False freigegeben werden.
        FileClose($h_xml)

    So wäre es korrekt...

    AutoIt
    $h_xml = FileOpen($fSaveTo, 2)
        if $h_xml = -1 Then Return False
        $w_xml = FileWrite($h_xml, $sBinXML)
        FileClose($h_xml)
        if $w_xml = 0 Then Return False

    Ich mache das gerne so... was aber übrigens wenig Sinn macht, wenn du bei FileOpen nur $FO_OVERWRITE als Flag angibst...

    AutoIt
    Local $sPath = '.\Blablabla.txt', $hFile = FileOpen($sPath, $FO_OVERWRITE)
    Local $iWrite = FileWrite($hFile, 'Quakquack') + FileClose($hFile) ? FileGetSize($sPath) : -1
    If $iWrite < 1 Then Return False

    dann kannst du dir das FileOpen auch sparen...

    AutoIt
    Local $sPath = '.\Blablabla.txt', $iWrite = FileDelete($sPath) + FileWrite($sPath, 'Quakquack')
    If $iWrite < 1 Then Return False

    Zudem finde ich es nicht sehr fein, wenn Variablen nicht deklariert (Local/Global) werden... und Dim sollte eigentlich nicht mehr verwendet werden.


    Zitat von Candyland

    For $aUser In $objDomain

    Wieso $aUser? Bei For in... wird kein Array geliefert.

  • Programm als Admin ausführen mit eingeschränkten Rechten

    • Bitnugger
    • 10. Mai 2018 um 02:46

    Candyland

    Globale Variablen sollten möglichst nicht in einer Funktion deklariert werden und wenn du dir ein Filehandle besorgst, dann musst du es auch wieder freigeben, auch wenn du nicht schreiben konntest.

    AutoIt
    #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
    
    ;-- TIME_STAMP   2018-05-10 02:40:12   v 0.1
    
    Global $Startup_HKCU_NAME, $Startup_TASK_NAME, $Startup_ADMIN_STATUS = IsAdmin(), $Startup_Task_temporino = @ScriptDir & "\temporino", $Startup_TASK_fXML = @ScriptDir & "\stivo.xml"
    
    ; _Startup_Choose_byAdmin_Adlib .... : This Function is checking the Admin Priviliges of the Script and will then Select the possible Startup Method.
    ;....................................: The Adlib is only for the Persistence of the Startup Method.
    ; $Startup_HKCU_NAME_temp............: Choose a Name of your HKCU Key.
    ; $Startup_TIME......................: (Optional) This defines how often the Adlib will get called.
    ; $Startup_TASK_Name_temp............: (Optional) Choose a Name for the Tasks that get created if the Script has Admin.
    ;....................................:
    ; References.........................: _Startup_Choose_byAdmin_Adlib_Adlib(Core Function); _Startup_Choose_byAdmin_Adlib_XML(Create a XML); _Startup_Choose_Uninstall(Uninstall the Startup Method)
    ;....................................:
    ; Author.............................: Candyland on Autoit.de
    Func _Startup_Choose_byAdmin_Adlib($Startup_HKCU_NAME_temp, $Startup_TIME = 0, $Startup_TASK_NAME_temp = $Startup_HKCU_NAME_temp)
        $Startup_HKCU_NAME = $Startup_HKCU_NAME_temp
        $Startup_TASK_NAME = ($Startup_TASK_NAME_temp = $Startup_HKCU_NAME_temp) ? $Startup_HKCU_NAME_temp : $Startup_TASK_NAME_temp
    
        _Startup_Choose_byAdmin_Adlib_Adlib()
        If $Startup_TIME <> 0 Then AdlibRegister("_Startup_Choose_byAdmin_Adlib_Adlib", $Startup_TIME)
    EndFunc   ;==>_Startup_Choose_byAdmin_Adlib
    
    Func _Startup_Choose_byAdmin_Adlib_Adlib()
        Local $CMD_CREATE, $CMD_QUERRY, $O_Temporino, $R_Temporino, $bXML
        ;ConsoleWrite("SPC Start" & @CRLF)
        If $Startup_ADMIN_STATUS Then
            RegDelete("HKCU\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN", $Startup_HKCU_NAME) ;no double start
    
            Local $objDomain = ObjGet("WinNT://" & @ComputerName), $aFilter = ["user"]
            $objDomain.Filter = $aFilter
            For $sUser In $objDomain
                $CMD_QUERRY = 'schtasks.exe /QUERY /TN "' & $Startup_TASK_NAME & ' ' & $sUser.Name & '" >' & StringTrimLeft($Startup_Task_temporino, StringInStr($Startup_Task_temporino, '\', 0, -1))
                RunWait($CMD_QUERRY, @ScriptDir, @SW_HIDE)
                $O_Temporino = FileOpen($Startup_Task_temporino)
                $R_Temporino = FileReadLine($O_Temporino, 5)
                FileClose($O_Temporino)
                FileDelete($Startup_Task_temporino)
                If StringInStr($R_Temporino, $Startup_TASK_NAME & ' ' & $sUser.Name) = "" Then
                    $bXML = _Startup_Choose_byAdmin_Adlib_XML(@YEAR & '-' & @MON & '-' & @MDAY & 'T' & @HOUR & ':' & @MIN & ':' & @SEC, @UserName, $sUser.Name, @ScriptFullPath, $Startup_TASK_fXML)
                    If $bXML = True Then
                        $CMD_CREATE = 'schtasks.exe /CREATE /XML ' & StringTrimLeft($Startup_TASK_fXML, StringInStr($Startup_TASK_fXML, '\', 0, -1)) & ' /TN "' & $Startup_TASK_NAME & ' ' & $sUser.Name & '" /F'
                        RunWait($CMD_CREATE, @ScriptDir, @SW_HIDE)
                        FileDelete($Startup_TASK_fXML)
                        ConsoleWrite("SPC TaskWritten to " & $sUser.Name & @CRLF)
                    EndIf
                EndIf
            Next
        Else
            Local $sRundl32V = 'rundll32.exe shell32.dll, ShellExec_RunDLL "' & @ScriptFullPath & '"'
            If RegRead("HKCU\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN", $Startup_HKCU_NAME) <> $sRundl32V Then
                RegWrite("HKCU\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN", $Startup_HKCU_NAME, "REG_SZ", $sRundl32V)
                ConsoleWrite("SPC RegWritten" & @CRLF)
            EndIf
        EndIf
        ;ConsoleWrite("SPC End" & @CRLF)
    EndFunc   ;==>_Startup_Choose_byAdmin_Adlib_Adlib
    
    Func _Startup_Choose_byAdmin_Adlib_XML($sTASKTIME, $sTASKAUTHOR, $sTASKUSER, $sTASKPATH, $fSaveTo = @ScriptDir & "\stivo.xml")
        Local $h_xml, $w_xml, $sBinXML
        $sBinXML &= "0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D3136223F3E0D0A3C5461736B2076657273696F6E3D22312E332220786D6C"
        $sBinXML &= "6E733D22687474703A2F2F736368656D61732E6D6963726F736F66742E636F6D2F77696E646F77732F323030342F30322F6D69742F7461736B223E0D0A20203C52"
        $sBinXML &= "6567697374726174696F6E496E666F3E0D0A202020203C446174653E257461736B74696D65253C2F446174653E0D0A202020203C417574686F723E257461736B61"
        $sBinXML &= "7574686F72253C2F417574686F723E0D0A20203C2F526567697374726174696F6E496E666F3E0D0A20203C54726967676572733E0D0A202020203C4C6F676F6E54"
        $sBinXML &= "7269676765723E0D0A2020202020203C5374617274426F756E646172793E257461736B74696D65253C2F5374617274426F756E646172793E0D0A2020202020203C"
        $sBinXML &= "456E61626C65643E747275653C2F456E61626C65643E0D0A202020203C2F4C6F676F6E547269676765723E0D0A20203C2F54726967676572733E0D0A20203C5072"
        $sBinXML &= "696E636970616C733E0D0A202020203C5072696E636970616C2069643D22417574686F72223E0D0A2020202020203C5573657249643E257461736B75736572253C"
        $sBinXML &= "2F5573657249643E0D0A2020202020203C4C6F676F6E547970653E496E746572616374697665546F6B656E3C2F4C6F676F6E547970653E0D0A2020202020203C52"
        $sBinXML &= "756E4C6576656C3E48696768657374417661696C61626C653C2F52756E4C6576656C3E0D0A202020203C2F5072696E636970616C3E0D0A20203C2F5072696E6369"
        $sBinXML &= "70616C733E0D0A20203C53657474696E67733E0D0A202020203C4D756C7469706C65496E7374616E636573506F6C6963793E51756575653C2F4D756C7469706C65"
        $sBinXML &= "496E7374616E636573506F6C6963793E0D0A202020203C446973616C6C6F77537461727449664F6E4261747465726965733E66616C73653C2F446973616C6C6F77"
        $sBinXML &= "537461727449664F6E4261747465726965733E0D0A202020203C53746F704966476F696E674F6E4261747465726965733E66616C73653C2F53746F704966476F69"
        $sBinXML &= "6E674F6E4261747465726965733E0D0A202020203C416C6C6F77486172645465726D696E6174653E66616C73653C2F416C6C6F77486172645465726D696E617465"
        $sBinXML &= "3E0D0A202020203C53746172745768656E417661696C61626C653E66616C73653C2F53746172745768656E417661696C61626C653E0D0A202020203C52756E4F6E"
        $sBinXML &= "6C7949664E6574776F726B417661696C61626C653E66616C73653C2F52756E4F6E6C7949664E6574776F726B417661696C61626C653E0D0A202020203C49646C65"
        $sBinXML &= "53657474696E67733E0D0A2020202020203C53746F704F6E49646C65456E643E66616C73653C2F53746F704F6E49646C65456E643E0D0A2020202020203C526573"
        $sBinXML &= "746172744F6E49646C653E66616C73653C2F526573746172744F6E49646C653E0D0A202020203C2F49646C6553657474696E67733E0D0A202020203C416C6C6F77"
        $sBinXML &= "53746172744F6E44656D616E643E747275653C2F416C6C6F7753746172744F6E44656D616E643E0D0A202020203C456E61626C65643E747275653C2F456E61626C"
        $sBinXML &= "65643E0D0A202020203C48696464656E3E66616C73653C2F48696464656E3E0D0A202020203C52756E4F6E6C79496649646C653E66616C73653C2F52756E4F6E6C"
        $sBinXML &= "79496649646C653E0D0A202020203C446973616C6C6F7753746172744F6E52656D6F746541707053657373696F6E3E66616C73653C2F446973616C6C6F77537461"
        $sBinXML &= "72744F6E52656D6F746541707053657373696F6E3E0D0A202020203C557365556E69666965645363686564756C696E67456E67696E653E66616C73653C2F557365"
        $sBinXML &= "556E69666965645363686564756C696E67456E67696E653E0D0A202020203C57616B65546F52756E3E66616C73653C2F57616B65546F52756E3E0D0A202020203C"
        $sBinXML &= "457865637574696F6E54696D654C696D69743E505430533C2F457865637574696F6E54696D654C696D69743E0D0A202020203C5072696F726974793E373C2F5072"
        $sBinXML &= "696F726974793E0D0A20203C2F53657474696E67733E0D0A20203C416374696F6E7320436F6E746578743D22417574686F72223E0D0A202020203C457865633E0D"
        $sBinXML &= "0A2020202020203C436F6D6D616E643E257461736B70617468253C2F436F6D6D616E643E0D0A202020203C2F457865633E0D0A20203C2F416374696F6E733E0D0A"
        $sBinXML &= "3C2F5461736B3E"
        $sBinXML = StringReplace(StringReplace(StringReplace(StringReplace(BinaryToString($sBinXML), '%tasktime%', $sTASKTIME), '%taskauthor%', $sTASKAUTHOR), '%taskuser%', $sTASKUSER), '%taskpath%', $sTASKPATH)
    
        $h_xml = FileOpen($fSaveTo, 2)
        If $h_xml = -1 Then Return False
        $w_xml = FileWrite($h_xml, $sBinXML)
        FileClose($h_xml)
    
        Return ($w_xml <> 0)
    EndFunc   ;==>_Startup_Choose_byAdmin_Adlib_XML
    
    Func _Startup_Choose_Uninstall($sMy = "") ;no hotkey compatibel
        AdlibUnRegister("_Startup_Choose_byAdmin_Adlib_Adlib")
        If $sMy <> "" Then
            RegDelete("HKCU\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN", $sMy)
    
            If IsAdmin() = 1 Then
                Local $CMD_DEL, $objDomain = ObjGet("WinNT://" & @ComputerName), $aFilter = ["user"]
                $objDomain.Filter = $aFilter
                For $sUser In $objDomain
                    $CMD_DEL = 'schtasks.exe /DELETE /TN "' & $sMy & ' ' & $sUser.Name & '" /F'
                    RunWait($CMD_DEL, @ScriptDir, @SW_HIDE)
                Next
            EndIf
        EndIf
    EndFunc   ;==>_Startup_Choose_Uninstall
    Alles anzeigen
  • sftp durch winscp.com in autoit ersetzen

    • Bitnugger
    • 8. Mai 2018 um 02:38

    Ich mache es gerne so:

    AutoIt
    Local $sCMD = StringFormat('"%s" /privatkey="%s" user@host:/data_in /script="%s"', 'C:\Program Files (x86)\path\winscp\winscp.com', 'C:\Program Files (x86)\path\winscp\ftp_ppk_mm.ppk', 'c:\Program Files (x86)\path\winscp\scp_script.txt')
    ConsoleWrite('$sCMD = ' & $sCMD & @CRLF)
    Run($sCMD, '', @SW_HIDE) ; @SW_SHOW

    oder so, wenn es viele Parameter sind:

    AutoIt
    Local $sCMD, $sWINSCP = 'C:\Program Files (x86)\path\winscp\winscp.com', $sPPK = 'C:\Program Files (x86)\path\winscp\ftp_ppk_mm.ppk', $sSCRIPT = 'c:\Program Files (x86)\path\winscp\scp_script.txt'
    $sCMD = StringFormat('"%s" /privatkey="%s" user@host:/data_in /script="%s"', $sWINSCP, $sPPK, $sSCRIPT)
    ConsoleWrite('$sCMD = ' & $sCMD & @CRLF)
    Run($sCMD, '', @SW_HIDE) ; @SW_SHOW
  • Canonical Names

    • Bitnugger
    • 5. Mai 2018 um 02:27

    Also ich hole mir so das Standard-Programm... funktioniert aber leider nicht, wenn für den Dateityp oder das Protokoll eine App registriert ist.

    AutoIt
    #include <WinAPIReg.au3>
    
    ; Microsoft Windows [Version 10.0.16299.402] (X64)
    
    _GetAssoc('mailto')
    _GetAssoc('http')
    _GetAssoc('.txt')
    _GetAssoc('.mp3')
    Global $g_aAssocAU3 = _GetAssoc('.au3')
    
    Func _GetAssoc($sExt)
        Local $sCommand    = _WinAPI_AssocQueryString($sExt, $ASSOCSTR_COMMAND)
        Local $sExecutable = _WinAPI_AssocQueryString($sExt, $ASSOCSTR_EXECUTABLE)
        Local $sIcon       = _WinAPI_AssocQueryString($sExt, $ASSOCSTR_DEFAULTICON)
        ConsoleWrite('> $sExt        = ' & $sExt        & @CRLF)
        ConsoleWrite('> $sCommand    = ' & $sCommand    & @CRLF)
        ConsoleWrite('> $sExecutable = ' & $sExecutable & @CRLF)
        ConsoleWrite('> $sIcon       = ' & $sIcon       & @CRLF & @CRLF)
        Local $aRet = [$sCommand, $sExecutable, $sIcon]
        Return $aRet
    EndFunc
    Alles anzeigen

    pasted-from-clipboard.png

  • Label zeigt Änderung nur auf Klick

    • Bitnugger
    • 2. Mai 2018 um 19:00

    rudi

    Das ist keine gute Lösung... denn so wird die Länge ständig in Intervallen (Polling) abgefragt, auch wenn sich der Inhalt des Input-Controls nicht geändert hat. Oscar hat doch bereits gezeigt, wie es richtig gemacht wird... denn so wird die Funktion nur aufgerufen, wenn sich der Inhalt des Input-Controls geändert hat.

  • Wie verknüpfe ich die LocalAppData-Variable mi einem Pfad unterhalb davon?

    • Bitnugger
    • 2. Mai 2018 um 18:40
    Zitat von ibicis

    Kann ich die Variable für $localappdata mit TslGame\Saved\Crashes direkt verknüpfen oder wie mache ich das? So funktioniert es nicht:

    DirRemove(@localappdata & "\TslGame\Saved\Crashes\.",1)

    Ja, kannst du... aber wenn es nicht funktioniert, dann dürfte das DirRemove darüber auch nicht funktionieren.

    Ich verstehe allerdings nicht, wofür der Punkt hinter Crashes\. gut sein soll... denn ein Verzeichnis, dass als Namen nur einen Punkt hat, kannst du nicht anlegen und somit auch nicht löschen. Entweder der Punkt gehört da nicht hin... oder aber, du willst nur alle Unterverzeichnisse in Crashes\ löschen, die mit einem Punkt anfangen... dass ginge dann z.B. so:

    AutoIt
    #Include <File.au3>
    
    Local $iRecurse = 1, $sPath = @LocalAppDataDir & '\TestDir\TslGame\Saved\Crashes\' ; TestDir
    DirCreate($sPath & '.Test1')
    DirCreate($sPath & '.Test2')
    DirCreate($sPath & 'Test3')
    
    ; Alle Verzeichnisse in ..\Crashes\ löschen, die mit einem Punkt anfangen
    Local $iDirRemove, $aDirList = _FileListToArrayRec($sPath, '.*', $FLTA_FOLDERS)
    _ArrayDisplay($aDirList, '$aDirList')
    For $i = 1 To $aDirList[0] Step 1
        $iDirRemove = DirRemove($sPath & $aDirList[$i], $iRecurse)
        ConsoleWrite('Remove Dir: ' & ($iDirRemove ? 'OK   ' : 'ERROR') & ' --> ' & $sPath & $aDirList[$i] & @CRLF)
    Next
    
    ; ..\TestDir\ samt Inhalt wieder entfernen
    $iDirRemove = DirRemove(@LocalAppDataDir & '\TestDir\', $iRecurse)
    ConsoleWrite('Remove Dir: ' & ($iDirRemove ? 'OK   ' : 'ERROR') & ' --> ' & @LocalAppDataDir & '\TestDir\' & @CRLF)
    Alles anzeigen

    So kannst du testen, ob die Inhalte der beiden Variablen gleich sind, was sie auch sollten:

    AutoIt
    Local $sDirRemove1 = 'C:\Users\testuser\AppData\Local\TslGame\Saved\Crashes\.'
    Local $sDirRemove2 = @LocalAppDataDir & '\TslGame\Saved\Crashes\.'
    If $sDirRemove1 == $sDirRemove2 Then
        ConsoleWrite('$sDirRemove1 == $sDirRemove2' & @CRLF)
    Else
        ConsoleWrite('$sDirRemove1 <> $sDirRemove2' & @CRLF)
    EndIf

    @LocalAppDataDir ist übrigens keine Variable, sondern ein Makro.

  • Programm als Admin ausführen mit eingeschränkten Rechten

    • Bitnugger
    • 2. Mai 2018 um 17:08
    Zitat von AspirinJunkie

    cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" "%1""

    Damit unterdrückt du lediglich die UAC-Abfrage, weil das Programm nur mit eingeschränkten Rechten (Invoker = Aufrufer) gestartet wird.

  • Position der Einfügemarke

    • Bitnugger
    • 2. Mai 2018 um 16:19
    Zitat von AutoMit

    Hast Du eine Idee, wie man die Einfügemarke in der URL-Zeile von Chrome / FireFox findet?

    https://developer.mozilla.org/en-US/docs/Web/API/CaretPosition

    Zitat von AutoMit

    Bei einer Textverarbeitung ist im Suchfeld eine DropDownListe integriert, für die die Au3Info keine Information liefert ( für das Suchfeld auch nicht).

    Hört sich an, als wenn du von einer ComboBox redest. Wenn du mit Au3Info keine Infos zu dem Control bekommst, dann ist es wohl auch keine Standard-Control, oder aber, die "ComboBox" befindet sich innerhalb eines Group-Controls... in dem Fall liefert Au3Info leider nur Infos zu diesem. Da wir aber nicht wissen, welche Textverarbeitung es ist, können wir nicht mehr dazu sagen.

    Zitat von AutoMit

    Wenn sich die Einfügemarke in dem Suchfeld befindet, dann sollen automatisch die DropDownListe geöffnet werden und z.B. die Option "Alle" ausgewählt werden..

    Zitat von AutoMit

    Gibt es eine bessere Möglichkeit, als das über die Position der Einführungsmarke zu realisieren?

    Wenn es entscheidend ist, wo genau die Einfügemarke steht, dann nicht... aber das scheint nicht der Fall zu sein. In dem Fall würde es reichen danach zufragen, welches Control den Fokus hat.

    ControlGetFocus ( "title" [, "text"] )

    Bei einer ComboBox ginge das etwa so:

    _GUICtrlComboBox_SetCurSel ( $hWnd [, $iIndex = -1] )

    _GUICtrlComboBox_ShowDropDown ( $hWnd [, $bShow = False] )

  • Programm als Admin ausführen mit eingeschränkten Rechten

    • Bitnugger
    • 1. Mai 2018 um 23:25
    Zitat von SysCodeMaker

    Ist es möglich die Zeiterfassungssoftware mit Administratorrechte zu starten, auch wenn der angemeldete Benutzer über keine Administrationsrechte verfügt?

    Im Prinzip... ja, aber egal ob du es direkt über die Windows-Einstellungen oder mit RunAs machst, wird nach einem Administrator-Passwort gefragt, was ja wohl nicht Sinn der Sache ist - egal, wie die UAC eingestellt ist.

  • ninite.com Silent Installer

    • Bitnugger
    • 1. Mai 2018 um 22:36

    ich mache solche Sachen mit chocolatey... bzw. mit chocolateyGUI...

    https://chocolatey.org/

    https://chocolatey.org/packages?q=ChocolateyGUI

  • Label zeigt Änderung nur auf Klick

    • Bitnugger
    • 1. Mai 2018 um 22:26
    Zitat von bigeasy76

    Müsste ich aber anstatt des Events WM_COMMAND in meinem Fall nicht den Event WM_KEYDOWN verwenden?

    Mit WM_KEYDOWN wird die dafür registrierte Funktion bei jedem Tastendruck aufgerufen, wenn deine GUI aktiv ist - aber nur dann, wenn kein Control den Fokus hat, dass diese Nachricht selbst auswertet, wie z.B. ein Input/Edit Control.

    WM_COMMAND wird gesendet, wenn der Benutzer ein Control (Item) aus einem Menü auswählt, wenn ein Control eine Benachrichtigungsmeldung an sein übergeordnetes Fenster sendet oder wenn ein Tastenanschlag mit einem Accelerator übersetzt wird.

    Der fett markierte Teil von WM_COMMAND... genau das brauchen wir in deinem Fall... wobei uns aber nur die Nachricht $EN_CHANGE interessiert... wenn sie von einem Input/Edit Control kommt.

    Wir müssen in der für WM_COMMAND registrierten Funktion also nur überprüfen, von welchem Input/Edit Control die Nachricht gesendet wurde und ob es $EN_CHANGE ist.

    Input/Edit Control - der hauptsächliche Unterschied ist wohl, dass ein Input Control auf nur eine Zeile beschränkt ist. Windows kennt nur Edit Controls... Input Controls gibt es nur in AutoIt. Deshalb findest du auch die Notification Constants für Input in EditConstants.au3 - somit auch $EN_CHANGE. $EN steht dann wohl für Edit Notify.

    Deine Funktion SCHREIBEN() ist aus mehreren Gründen Quatsch...

    • weil du darin die Nachrichten verarbeitest, die von GUIGetMsg() empfangen wurden und nicht die, die du durch WM_COMMAND von dem Control bekommst. Den Inhalt der Funktion kannst du also auch in deiner While-Schleife verarbeiten.
    • weil du in der Funktion keine Parameter angegeben hast, die du verarbeiten kannst: $hWnd, $iMsg, $wParam, $lParam

    $hWnd und $iMsg werden von AutoIt bereitgestellt, $wParam und $lParam von WM_COMMAND - genau in dieser Reihenfolge - und bei jedem Aufruf an diese Funktion übergeben, oder nur $hWnd und $iMsg, wenn deine Funktion nur zwei Parameter hat.

    Die Funktion wird auch aufgerufen, wenn du keinen Parameter angegeben hast, macht aber dann keinen Sinn. Den macht es nur, wenn du zumindest $wParam und/oder $lParam auswertest... und bei mehreren GUIs auch $hWnd - dass aber auch nur bedingt, wenn du $iMsg nicht auswertest.

    Ich würde dir empfehlen, immer alle Parameter anzugeben... auch wenn du sie in der Funktion nicht auswertest.

    WM_COMMAND: https://msdn.microsoft.com/de-de/library/…esktop/ms647591

  • Position der Einfügemarke

    • Bitnugger
    • 27. April 2018 um 23:41
    Zitat von AutoMit

    Schon bei bekannten Programmen wie dem Total Commander 9.x - TextCursor in der cmd-Zeile vom Total Commander - findet das Script den Cursor nicht.

    Doch...

    AutoIt
    ;-- TIME_STAMP   2018-04-27 23:39:51   v 0.1
    
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    If Not HotKeySet('{F5}', '_HotKey') Then Exit 111
    If Not HotKeySet('{F6}', '_HotKey') Then Exit 222
    
    #Region - GUI Create
    GUICreate('', 400, 100)
    GUICtrlCreateLabel('F5 = Move mouse to caret pos from active window', 10, 10, 380, 22)
    GUICtrlCreateLabel('F6 = Exit', 10, 30, 380, 22)
    GUISetState()
    #EndRegion
    
    #Region - GUI SwitchLoop
    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                HotKeySet('{F5}')
                HotKeySet('{F6}')
                Exit
        EndSwitch
    WEnd
    #EndRegion
    
    Func _GetCaretPos($hWnd)
        Local $sFocus, $hCtrl, $aPos, $aCaret
        $sFocus = StringRegExpReplace(ControlGetFocus($hWnd), '(.+[^0-9])(.+)', '[CLASS:\1; INSTANCE:\2]')
        If Not @extended Then Return SetError(1)
        $hCtrl = ControlGetHandle($hWnd, '', $sFocus)
        If @error Then Return SetError(2)
        $aPos = ControlGetPos($hCtrl, '', '')
        $aCaret = WinGetCaretPos()
        If @error Then Return SetError(3)
        $aCaret[0] += $aPos[0]
        $aCaret[1] += $aPos[1]
        Return $aCaret
    EndFunc
    
    Func _HotKey()
        Switch @HotKeyPressed
            Case '{F5}'
                Local $hWnd = WinGetHandle('[ACTIVE]')
                Local $aCaret = _GetCaretPos($hWnd)
    
                ; Maus zu Caretpos bewegen
                If UBound($aCaret) Then MouseMove($aCaret[0], $aCaret[1], 30)
            Case '{F6}'
                Exit
        EndSwitch
    EndFunc
    Alles anzeigen
    Zitat von AutoMit

    Dei URL-Zeile von Chrome und FireFox bieten sich ebenfalls für einen Test an.

    Wenn du mit Au3Info keine Infos zu dem Control bekommst, dann funktioniert WinGetCaretPos auch nicht, weil es dann wohl keine Standard-Controls (Input/Edit) sind.

  • Label zeigt Änderung nur auf Klick

    • Bitnugger
    • 27. April 2018 um 19:24

    Hier eine kleine Demo...

    AutoIt
    ;-- TIME_STAMP   2018-04-27 19:20:23   v 0.1
    
    #Region    ;************ Includes ************
    #Include <EditConstants.au3>
    #Include <WinAPIConv.au3>
    ;~ #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #EndRegion ;************ Includes ************
    
    Global $g_idLabel, $g_idInput
    
    _Main()
    
    Func _Main()
        #Region - GUI Create
        GUICreate('WM_COMMAND-Demo', 180, 80)
        $g_idLabel = GUICtrlCreateLabel('Tippe hier irgendwas ein...', 10, 10, 160, 25)
        $g_idInput = GUICtrlCreateInput('', 10, 30, 160, 25)
        GUISetState()
        #EndRegion
    
        ; Sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated.
        GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")
    
        #Region - GUI SwitchLoop
        While True
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    Exit
            EndSwitch
        WEnd
        #EndRegion
    EndFunc
    
    Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg
    ;~     ConsoleWrite('Return 0 $GUI_RUNDEFMSG' & @CRLF)
    ;~     Return $GUI_RUNDEFMSG
        Local $hWndFrom, $iIDFrom, $iCode, $sText
        $hWndFrom = $lParam
        $iIDFrom = _WinAPI_LoWord($wParam)
        $iCode = _WinAPI_HiWord($wParam)
    
        Switch $iIDFrom
            Case $g_idInput
                Switch $iCode
                    Case $EN_CHANGE
                        $sText = GUICtrlRead($g_idInput)
                        GUICtrlSetData($g_idLabel, $sText ? $sText : 'Tippe hier irgendwas ein...')
                EndSwitch
            Case Else
        EndSwitch
    
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>_WM_COMMAND
    Alles anzeigen
  • Position der Einfügemarke

    • Bitnugger
    • 27. April 2018 um 18:53
    Zitat von BugFix

    _WinApi_GetCaretPos scheint falsch implementiert zu sein, liefert immer einen Fehler.

    Schau dir mal die Funktion _WinAPI_CreateCaret an...

    WinGetCaretPos liefert zumindest bei mir auf Win 10 X64 nicht die korrekte y-Pos.

    So stimmt die Position:

    AutoIt
    ;-- TIME_STAMP   2018-04-27 18:41:21   v 0.1
    
    _Example1()
    _Example2()
    
    Func _Example1()
        Local $hWnd = WinWait('[CLASS:SciTEWindow]', '', 5)
        Local $aCaret = _GetCaretPos($hWnd)
    
        ; Maus zu Caretpos bewegen
        If Not @error Then MouseMove($aCaret[0], $aCaret[1], 30)
        Sleep(2222)
    EndFunc
    
    Func _Example2()
        ShellExecute('notepad')
        Local $hWnd = WinWait('[CLASS:Notepad]', '', 5)
        Local $aCaret = _GetCaretPos($hWnd)
    
        ; Maus zu Caretpos bewegen
        If UBound($aCaret) Then MouseMove($aCaret[0], $aCaret[1], 30)
        Sleep(2222)
        ProcessClose(WinGetProcess($hWnd))
    EndFunc
    
    Func _GetCaretPos($hWnd)
        Local $sFocus, $hCtrl, $aPos, $aCaret
        $sFocus = StringRegExpReplace(ControlGetFocus($hWnd), '(.+[^0-9])(.+)', '[CLASS:\1; INSTANCE:\2]')
        If Not @extended Then Return SetError(1)
        $hCtrl = ControlGetHandle($hWnd, '', $sFocus)
        If @error Then Return SetError(2)
        $aPos = ControlGetPos($hCtrl, '', '')
        $aCaret = WinGetCaretPos()
        If @error Then Return SetError(3)
        $aCaret[0] += $aPos[0]
        $aCaret[1] += $aPos[1]
        Return $aCaret
    EndFunc
    Alles anzeigen

    Edit: Zeile hinzugefügt: $aCaret[0] += $aPos[0]

  • Position der Einfügemarke

    • Bitnugger
    • 27. April 2018 um 02:38

    Schau dir mal die Funktion _WinAPI_CreateCaret an... wird das Fenster inaktiv, wird das (rote) Caret ausgeblendet.

    AutoIt
    #include <Array.au3>
    #include <WinAPIRes.au3>
    #include <WinAPIError.au3>
    
    $aTextCursorPosition = _WinAPI_GetCaretPos() ; Error 10
    If @error Then
        Exit ConsoleWrite(StringFormat('! %-27s = %i\n! %-27s = %i\n! %-27s = %s\n', '@error', @error, '_WinAPI_GetLastError', _WinAPI_GetLastError(), '_WinAPI_GetLastErrorMessage', _WinAPI_GetLastErrorMessage()))
    EndIf
    _ArrayDisplay($aTextCursorPosition)
  • "query user" mit Run( ) aufrufen - Ergebnis auslesen

    • Bitnugger
    • 24. April 2018 um 17:36

    Schau mal hier...

    • Task Idle Conditions
    • Idle-Tasks (Ruhezeit-Aktivitäten) sofort starten
    • Display, sleep, and hibernate idle timers

    und hier...

    • _Timer_GetIdleTime
    • _WinAPI_WaitForInputIdle
    • _WinAPI_GetIdleTime
    • _ProcessGetPriority
    • _ProcessSetPriority

    und hier: ;)

    • :Glaskugel:
  • SQLite - Möglichkeit Abfrage beschleunigen?

    • Bitnugger
    • 24. April 2018 um 16:28
    Zitat von BugFix

    War ein Aufmerksamkeitstest...

    Glaube ich dir aufs Wort... aber Vorsicht - denn nach dem 1001.ten Test musst du deinen Nick in @BugMaker ändern. :rofl:

    Zitat von BugFix

    Den Gedanken alles in eine Funktion zu packen hatte ich am Anfang auch. Habe mich dann aber dagegen entschieden. Ist persönlicher Geschmack. Wenn möglich vermeide ich Funktionen mit einer Vielzahl Parameter und wrappe lieber in mehrere kurze Aufrufe.

    Solange das Script noch gut überschaubar ist, mache ich es auch so... aber mit zunehmender Größe verschmelze ich dann gerne die (Mini-)Funktionen, soweit es sinnvoll ist.

    Zitat von BugFix

    Da habe ich noch einen Vorschlag, um die Parameterübergabe zu minimieren. Da Tabellen- und Feldname (zumindest in dieser Anwendungsform) bei jedem Aufruf identisch sind, ist es sinnvoll diese Beim erstmaligen Aufruf der Funktion zu übergeben. Danach kann man stattdessen -1 verwenden.

    Ja, das ist eine gute Idee... habe es fast 1:1 übernommen... noch zwei Parameter ($_sValue und $_iSelect) hinzugenommen und damit auch gleich (m)einen blöden Fehler ($_sValue in Zeile 8 konnte "" sein) beseitigt.

    Hier die korrigierte und erweiterte Version:

    germandict.au3
    AutoIt: germandict.au3
    ;-- TIME_STAMP   2018-04-24 16:19:26   v 1.1
    
    #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
    
    #include <SQLite.au3>
    
    Global $DEBUG = True
    
    Global $g_sAU3_Sharred_Files = EnvGet('AU3_Sharred_Files') ; F:\_Scripts\AutoIt\Shared files\
    ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_sAU3_Sharred_Files --> " & $g_sAU3_Sharred_Files & @CRLF)
    _SQLite_Startup($g_sAU3_Sharred_Files & "sqlite3.dll", False, 1)
    
    ;~ _SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1)
    
    ; memory DB
    Global $hSQL = _SQLite_Open()
    _SQLite_Exec($hSQL, "CREATE TABLE dictionary (word TEXT);")
    
    ; file DB anbinden
    Global $sAlias = "fileDB"
    _SQLite_Exec($hSQL, StringFormat("ATTACH DATABASE '%s' AS %s", @ScriptDir & "\germandict.db", $sAlias))
    
    ; INSERT from file DB TO memory DB
    Global $hTimer = TimerInit()
    _SQLite_Exec($hSQL, "INSERT INTO dictionary SELECT * FROM fileDB.dictionary;")
    ConsoleWrite("Time INSERT INTO: " & TimerDiff($hTimer) & @CRLF & @CRLF) ; ~ 1,5 s
    
    Global $sSearch = 'Taxi', $sRes
    
    Global Enum $eStartsWith = 1, $eContaining, $eEndsWith = 4 ; Default = $eContaining (2)
    
    ; Beim ersten Aufruf von __SQLite_SelectWord müssen die optionalen Parameter $_sTable bis $_sValue korrekt angegeben werden, danach reicht ein -1!
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', '') ; , $sSearch, $eContaining, False) <-- #Error = 8 - Wrong parameter(s); $_sValue bzw. $sSearch = ''
    
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', $sSearch) ; , $eContaining, False)
    $sRes = __SQLite_SelectWord(-1, -1, -1, -1, -1, True)
    
    $sRes = __SQLite_SelectWord(-1, -1, -1, -1, $eStartsWith)
    $sRes = __SQLite_SelectWord(-1, -1, -1, -1, -1, True)
    
    $sRes = __SQLite_SelectWord(-1, -1, -1, -1, $eEndsWith)
    $sRes = __SQLite_SelectWord(-1, -1, -1, -1, -1, True)
    
    $sSearch = 'zz'
    $sRes = __SQLite_SelectWord(-1, -1, -1, $sSearch, $eStartsWith)
    $sRes = __SQLite_SelectWord(-1, -1, -1, -1, $eEndsWith)
    
    __TableClearAll(-1, 'dictionary')
    $sRes = __SQLite_SelectWord(-1)
    
    _SQLite_Close($hSQL)
    _SQLite_Shutdown()
    
    Func __SQLite_SelectWord($_hSQL, $_sTable = -1, $_sField = -1, $_sValue = -1, $_iSelect = -1, $_bSensitive = False, $_sDelim = @CRLF)
        Local Static $sTable = Null, $sField = Null, $sValue = Null, $iSelect = Null
        $sTable = $_sTable = -1 ? $sTable : $_sTable
        $sField = $_sField = -1 ? $sField : $_sField
        $sValue = ($_sValue = -1 Or $_sValue = '') ? $sValue : $_sValue
        Switch $_iSelect
            Case -1
                $iSelect = $iSelect = Null ? 2 : $iSelect
            Case 1, 2, 4
                $iSelect = $_iSelect
            Case Else
                $iSelect = Null
        EndSwitch
        Local $hTimer = TimerInit(), _
            $sSelect = $iSelect = 1 ? '%s%%' : $iSelect = 2 ? '%%%s%%' : '%%%s', _
            $sResult, $aResult, $iRows, $iColumns, $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '"&$sSelect&"';", $sField, $sTable, $sField, $sValue)
        If $sTable = Null Or $sField = Null Or $sValue = Null Or $iSelect = Null Then Return SetError(8, 0 , (__PrintRes('Wrong parameter(s)', $sValue, $iSelect, $_bSensitive, 0, 8, 0, TimerDiff($hTimer))))
        If $_bSensitive Then _SQLite_Exec($hSQL, 'PRAGMA case_sensitive_like = ' & True)
        Local $iRval = _SQLite_GetTable($_hSQL, $sSQL, $aResult, $iRows, $iColumns), $iError = @error, $iExtended = @extended
        If $_bSensitive Then _SQLite_Exec($hSQL, 'PRAGMA case_sensitive_like = ' & False)
        If $DEBUG Then
            If $iRval = $SQLITE_OK Then $sResult = _ArrayToString($aResult, $_sDelim, 2)
            __PrintRes($sResult, $sValue, $iSelect, $_bSensitive, $iRows, $iError, $iExtended, TimerDiff($hTimer))
            Return $iRval = $SQLITE_OK ? SetError(0, $iRows, $sResult) : SetError($iError, $iExtended, $iRval)
        Else
            Return $iRval = $SQLITE_OK ? SetError(0, $iRows, _ArrayToString($aResult, $_sDelim, 2)) : SetError($iError, $iExtended, $iRval)
        EndIf
    EndFunc   ;==>__SQLite_SelectWord
    
    Func __TableClearAll($_hSQL, $_sTable)
        Local $sSQL = StringFormat("DELETE FROM %s;", $_sTable)
        Local $iRval = _SQLite_Exec($_hSQL, $sSQL)
        If $DEBUG Then ConsoleWrite('! __TableClearAll: ' & $sSQL & ' = ' & $iRval & @CRLF & @CRLF)
    EndFunc   ;==>__TableClearAll
    
    Func __PrintRes($_sRes, $_sValue, $_iSelect, $_bSensitive, $_iCount, $_iError, $_iExtended, $_fDiffTime)
        If $_iError Then
            $_sRes = StringFormat('! %-18s \t #Error = %i \t #Extended = %i\r\n\r\n', $_sRes, $_iError, $_iExtended)
        Else
            $_sRes = '- ' & StringReplace($_sRes, @CRLF, ' ') & @CRLF & @CRLF
        EndIf
        Local $_sSelect = $_iSelect = 1 ? 'StartsWith' : $_iSelect = 2 ? 'Containing' : 'EndsWith', $_sSensitive = $_bSensitive ? 'True ' : 'False'
        ConsoleWrite(StringFormat('> __SQLite_SelectWord: $_sValue = %-32s | $_iSelect = %-10s | $_bSensitive = %s  | $_iCount = %5i | Time = %s\r\n%s', '"' & $_sValue & '"', $_sSelect, $_sSensitive, $_iCount, $_fDiffTime, $_sRes))
    EndFunc   ;==>__PrintRes
    Alles anzeigen

    PS: Da könnte man jetzt auch noch leicht weitere Dictionarys hinzufügen... z.B. Englisch, Klingonisch, ... 8o

  • Windows Aktivierung Status

    • Bitnugger
    • 24. April 2018 um 09:51
    cscript vs wscript

    Was unterscheidet wscript.exe und csript.exe?

    WSH umfasst zwei eng verwandte Scripting Hosts: WScript und CScript. Beide sind hinsichtlich ihres Befehlsumfangs nahezu gleich. Sie unterscheiden sich lediglich darin, wohin die Ausgaben gehen. Außerdem sind die Intrinsic Objects von CScript ein klein wenig mächtiger als die von WScript.

    WScript.exe

    WScript ist der Standard; bei der Installation des WSH werden die WSH-Dateiextensionen mit WScript verknüpft.

    Diese Verknüpfungen können in der Registry, in den Optionen des Windows Explorers oder mit der WSH-Kommandozeilenoption //H: geändert werden.

    Bei WScript (implementiert in WScript.exe) erfolgt die Ausführung als Windows-Anwendung.

    Alle Ausgaben werden in Form von Dialogboxen dargestellt. Wenn das Skript viele Ausgaben macht, kann dies sehr lästig sein, da jede Dialogbox einzeln bestätigt werden muss. Zudem ist jede Dialogbox modal: Das Skript hält an und wartet auf die Bestätigung. WScript eignet sich also für die unbeaufsichtigte Ausführung nur dann, wenn das Skript keine Ausgaben macht. Gut geeignet ist WScript jedoch dann, wenn der Benutzer über jeden einzelnen Schritt informiert werden und dabei die jeweils erfolgten Veränderungen überprüfen möchte (also beispielsweise beim Debugging von Skripten).

    CScript.exe

    Bei CScript (implementiert in CSCRIPT.EXE) erfolgt die Ausführung des Skripts im Kontext einer Kommandozeile (auch: Konsole oder DOS-Box).

    Die Form der Ausgabe hängt von den verwendeten Ausgabebefehlen ab. Alle Ausgaben über die Methode Echo() aus dem WSH-Intrinsic Object WScript erfolgen in die DOS-Box. Alle Ausgaben über die spracheigenen Ausgabemethoden (z.B. MsgBox() in VBScript) werden weiterhin als modale Dialogboxen dargestellt.

    Ein Vorteil von CScript ist, dass es mit der Methode WScript.StdIn.ReadLine() das Einlesen von Eingaben des Benutzers im DOS-Fenster unterstützt.

    CScript hat außerdem den Vorteil, dass die Skriptausführung mit (STRG)+(C) jederzeit vom Benutzer abgebrochen werden kann. Bei WScript hilft – wenn modale Dialogboxen angezeigt werden – nur das Beenden der Anwendung mit dem Windows Task-Manager.

    Quelle: https://db0xw.dc4fs.de/echolinkplus/WScriptOderCScript.htm

    Hier noch eine kleine Demo, die zeigt wie der Standardskripthost via Registry ausgelesen bzw. geändert werden kann... das Script muss als Administrator ausgeführt werden.

    Lizenzmanager_Demo
    AutoIt
    ;-- TIME_STAMP   2018-04-24 10:47:55   v 0.1
    
    ;~ #RequireAdmin
    
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    ;~ #AutoIt3Wrapper_Compile_Both=y
    #AutoIt3Wrapper_UseX64=n
    #AutoIt3Wrapper_Change2CUI=y
    ;~ #AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    #Region ;************ Includes ************
    ;~ #Include <AutoItConstants.au3>
    ;~ #include <WinAPIConv.au3> ; _WinAPI_CharToOem
    ;~ #include <WinAPIReg.au3>  ; _WinAPI_AssocQueryString
    #include <WinAPIProc.au3>    ; _WinAPI_GetParentProcess
    #include <Process.au3>       ; _ProcessGetName
    #EndRegion ;************ Includes ************
    
    Global $g_sGetParentProcess = _ProcessGetName(_WinAPI_GetParentProcess())
    
    If Not IsAdmin() Then Exit $g_sGetParentProcess = 'cmd.exe' _
             ? ConsoleWrite(_WinAPI_CharToOem('! Du musst das Script als Administrator ausführen!') & @CRLF) _
             : MsgBox(64, @ScriptName, '! Du musst das Script als Administrator ausführen!' & @CRLF)
    
    Global Const $g_sStandardskripthost = _GetStandardskripthost()
    ConsoleWrite('> $g_sStandardskripthost = ' & $g_sStandardskripthost & @CRLF & _
            '======================================================================' & @CRLF & @CRLF)
    
    OnAutoItExitRegister('_Exit')
    
    _WScript()
    _CScript()
    
    ; Funktioniert nur, wenn Standardskripthost = WScript.exe (Standard)
    Func _WScript()
        _SetStandardskripthost('WScript')
        ConsoleWrite('> New Standardskripthost = ' & _GetStandardskripthost() & @CRLF & _
                '----------------------------------------------------------------------' & @CRLF)
        ShellExecute(@SystemDir & "\slmgr.vbs", "/dlv", @SystemDir, $SHEX_OPEN)
        Local $hWnd = WinWait("Windows Script Host", "", 3), $sText = _WinAPI_CharToOem(WinGetText($hWnd))
    ;~     Local $hWnd = WinWait("Windows Script Host", "", 3), $sText = WinGetText($hWnd)
        WinClose($hWnd)
        ConsoleWrite($sText & @CRLF)
    EndFunc   ;==>_WScript
    
    ; Funktioniert nur, wenn Standardskripthost = CScript.exe
    Func _CScript()
        _SetStandardskripthost('CScript')
        ConsoleWrite('> New Standardskripthost = ' & _GetStandardskripthost() & @CRLF & _
                '----------------------------------------------------------------------' & @CRLF)
        Local $iPID = Run(@ComSpec & ' /C ' & @SystemDir & '\slmgr.vbs /dlv', @SystemDir, @SW_HIDE, $STDOUT_CHILD)
        StdoutRead($iPID)
        ProcessWaitClose($iPID)
        Local $sText = StdoutRead($iPID)
        ConsoleWrite($sText & @CRLF)
    EndFunc   ;==>_CScript
    
    Func _GetStandardskripthost()
    ;~     Return StringRegExpReplace(_WinAPI_AssocQueryString('.vbs', $ASSOCSTR_EXECUTABLE), '.+([W|C].+)\.exe.+', '\1')
        Return StringRegExpReplace(RegRead('HKCR\VBSFile\Shell\' & RegRead('HKCR\VBSFile\Shell', '') & '\Command', ''), '.+([W|C].+)\.exe.+', '\1')
    EndFunc   ;==>_GetStandardskripthost
    
    Func _SetStandardskripthost($sSkripthost)
        Return RegWrite('HKCR\VBSFile\Shell\', '', 'REG_SZ', ($sSkripthost = 'WScript' ? 'Open' : 'Open2'))
    EndFunc   ;==>_SetStandardskripthost
    
    Func _WinAPI_CharToOem($sStr)
    ;~     Local $aRet = DllCall('user32.dll', 'bool', 'CharToOemW', 'wstr', $sStr, 'wstr', '')
        Local $aRet = DllCall('user32.dll', 'bool', 'CharToOem', 'str', $sStr, 'str', '')
        If @error Or Not $aRet[0] Then Return SetError(@error + 10, @extended, '')
    
        Return $aRet[2]
    EndFunc   ;==>_WinAPI_CharToOem
    
    Func _Exit()
        _SetStandardskripthost($g_sStandardskripthost)
        ConsoleWrite('> New Standardskripthost = ' & _GetStandardskripthost() & @CRLF & _
                '----------------------------------------------------------------------' & @CRLF & _
                'Fertig...' & @CRLF)
    
        If $g_sGetParentProcess <> 'cmd.exe' Then
            Local Const $iBitMask = 0x8000 ; a bit mask to strip the high word bits from the return of the function.
            Local $iCount, $aRet, $VK_ESCAPE = 0x1B, $hDll = DllOpen('user32.dll')
            ConsoleWrite(@CRLF & 'PRESS ESC FOR EXIT!' & @CRLF)
            Do
                Sleep(50)
                $aRet = DllCall($hDll, 'short', 'GetAsyncKeyState', 'int', $VK_ESCAPE)
            Until @error Or BitAND($aRet[0], $iBitMask) <> 0
            DllClose($hDll)
        EndIf
    EndFunc   ;==>_Exit
    Alles anzeigen

    Edit: Auf ESC-Taste warten hinzugefügt, wenn das Script nicht in der Console gestartet wurde.

  • "query user" mit Run( ) aufrufen - Ergebnis auslesen

    • Bitnugger
    • 24. April 2018 um 01:28
    Zitat von AutoMit

    Was muss ich tun, damit ich die Variable in meinem Beispiel nutzen kann, ohne dass ich die Zeile in der Funktion:

    So...

    Code
    Local $aOut = _QueryUser()
    _ArrayDisplay($aOut , "Zeile " & @ScriptLineNumber ) ; Array anzeigen

    oder so...

    Code
    _ArrayDisplay(_QueryUser(), "Zeile " & @ScriptLineNumber ) ; Array anzeigen
    Zitat von AutoMit

    Wenn die Variable mit Return zurückgegeben wird, ist der Variableninhalt dann nicht automatisch über den Variablennamen abrufbar?

    Nein, denn Return gibt keine Variable sondern einen Wert zurück, den du bei Bedarf in eine Variable speichern kannst.

    Du kannst es aber auch so schreiben:

    AutoIt
    #include <Array.au3>
    
    Global $aOut
    Example($aOut)
    ConsoleWrite("IsDeclared('aOut') = " & IsDeclared('aOut') & @CRLF) ; $DECLARED_GLOBAL (1)
    _ArrayDisplay($aOut, 'Zeile ' & @ScriptLineNumber) ; Array anzeigen
    
    Func Example(ByRef $aArray)
        If Not IsArray($aArray) Then Dim $aArray[0]
        _ArrayAdd($aArray, '123')
    EndFunc   ;==>Example
    Alles anzeigen
    Zitat von AutoMit

    Sind die 3 Sekunden Pause kein Leerlauf ?

    Nein, denn "Leerlauf" bezieht sich nicht auf dein Script, sondern auf die Aktivitäten der mit query.exe ermittelten User.

  • SQLite - Möglichkeit Abfrage beschleunigen?

    • Bitnugger
    • 23. April 2018 um 20:48

    Sehr schön - gute Idee - Danke! ;)

    Ich habe mir das Script noch ein wenig umgeschrieben... jetzt mit nur einer Funktion und die Suche kann nun auch "case sensitiv" sein.

    PS: Den Fehler in der Funktion __TableClearAll hast du sicher schon bemerkt...

    Edit: Habe das Script noch ein wenig gekürzt.

    AutoIt
    ;-- TIME_STAMP   2018-04-23 23:56:11   v 0.1
    
    #include <SQLite.au3>
    
    Global $DEBUG = True
    
    ;~ Global $g_sAU3_Sharred_Files = EnvGet('AU3_Sharred_Files') ; F:\_Scripts\AutoIt\Shared files\
    ;~ ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & "   var: $g_sAU3_Sharred_Files --> " & $g_sAU3_Sharred_Files & @CRLF)
    ;~ _SQLite_Startup($g_sAU3_Sharred_Files & "sqlite3.dll", False, 1)
    
    _SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1)
    
    ; memory DB
    Global $hSQL = _SQLite_Open()
    _SQLite_Exec($hSQL, "CREATE TABLE dictionary (word TEXT);")
    
    ; file DB anbinden
    Global $sAlias = "fileDB"
    _SQLite_Exec($hSQL, StringFormat("ATTACH DATABASE '%s' AS %s", @ScriptDir & "\germandict.db", $sAlias))
    
    ; INSERT from file DB TO memory DB
    Global $hTimer = TimerInit()
    _SQLite_Exec($hSQL, "INSERT INTO dictionary SELECT * FROM fileDB.dictionary;")
    ConsoleWrite("Time INSERT INTO: " & TimerDiff($hTimer) & @CRLF & @CRLF)  ; ~ 1,5 s
    
    Global $sSearch = 'Taxi', $sRes
    
    Global Enum $eStartsWith = -1, $eContaining, $eEndsWith
    
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', $sSearch, $eContaining, False)
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', $sSearch, $eContaining, True)
    
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', $sSearch, $eStartsWith, False)
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', $sSearch, $eStartsWith, True)
    
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', $sSearch, $eEndsWith, False)
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', $sSearch, $eEndsWith, True)
    
    $sSearch = 'zz'
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', $sSearch, $eEndsWith, False)
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', $sSearch, $eEndsWith, True)
    
    __TableClearAll(-1, 'dictionary')
    $sRes = __SQLite_SelectWord(-1, 'dictionary', 'word', $sSearch, $eEndsWith, False)
    
    _SQLite_Close($hSQL)
    _SQLite_Shutdown()
    
    Func __SQLite_SelectWord($_hSQL, $_sTable, $_sField, $_sValue, $_iSelect = 0, $_bSensitive = False, $_sDelim = @CRLF)
        Local $hTimer = TimerInit(), _
            $_sSelect = $_iSelect = -1 ? '%s%%' : $_iSelect = 1 ? '%%%s' : '%%%s%%', _
            $sResult, $aResult, $iRows, $iColumns, $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '"&$_sSelect&"';", $_sField, $_sTable, $_sField, $_sValue)
        If $_bSensitive Then _SQLite_Exec($hSQL, 'PRAGMA case_sensitive_like = ' & True)
        Local $iRval = _SQLite_GetTable($_hSQL, $sSQL, $aResult, $iRows, $iColumns), $iError = @error, $iExtended = @extended
        If $_bSensitive Then _SQLite_Exec($hSQL, 'PRAGMA case_sensitive_like = ' & False)
        If $DEBUG Then
            If $iRval = $SQLITE_OK Then $sResult = _ArrayToString($aResult, $_sDelim, 2)
            __PrintRes($sResult, $_iSelect, $_bSensitive, $iRows, $iError, $iExtended, TimerDiff($hTimer))
            Return $iRval = $SQLITE_OK ? SetError(0, $iRows, $sResult) : SetError($iError, $iExtended, $iRval)
        Else
            Return $iRval = $SQLITE_OK ? SetError(0, $iRows, _ArrayToString($aResult, $_sDelim, 2)) : SetError($iError, $iExtended, $iRval)
        EndIf
    EndFunc   ;==>__SQLite_SelectWord
    
    Func __TableClearAll($_hSQL, $_sTable)
        Local $sSQL = StringFormat("DELETE FROM %s;", $_sTable)
        If $DEBUG Then ConsoleWrite('! __TableClearAll: ' & $sSQL & @CRLF & @CRLF)
        Local $iRval = _SQLite_Exec($_hSQL, $sSQL)
    EndFunc
    
    Func __PrintRes($_sRes, $_iSelect, $_bSensitive, $_iCount, $_iError, $_iExtended, $_fDiffTime)
        If $_iError Then
            $_sRes = StringFormat('! #Error = %i \t #Extended = %i\r\n\r\n', $_sRes, $_iError, $_iExtended)
        Else
            $_sRes = '- ' & StringReplace($_sRes, @CRLF, ' ') & @CRLF & @CRLF
        EndIf
        Local $_sSelect = $_iSelect = -1 ? 'StartsWith' : $_iSelect = 0 ? 'Containing' : 'EndsWith', $_sSensitive = $_bSensitive ? 'True ' : 'False'
         ConsoleWrite(StringFormat('> __SQLite_SelectWord: $sSearch = %-32s | $_iSelect = %-10s | $_bSensitive = %s  | $_iCount = %5i | Time = %s\r\n%s', '"'&$sSearch&'"', $_sSelect, $_sSensitive, $_iCount, $_fDiffTime, $_sRes))
    EndFunc
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™