Jump to content

Recommended Posts

Posted (edited)

Running "syncthing --no-browser --no-console" used to run syncthing with "no-console" but for some reason it doesn't in Win11.
Therefore a hider is needed and after trying the solutions I found online and failing me, I coded one given that is very simple to do in AutoIt.

Spoiler
#include <SQLite.au3>
#include <Array.au3>
#include <WinAPIProc.au3>
#include <WinAPISysWin.au3>

OnAutoItExitRegister(OnAutoItExit)
Func OnAutoItExit()
;~  The exit code can be retrieved with @exitCode.
;~  The mode of exit can be retrieved with @exitMethod.
    ConsoleWriteLog(" OnExit: ExitCode=" & @exitCode & " - ExitMethod=" & @exitMethod & @CRLF)
EndFunc   ;==>OnAutoItExit


Global $g_ini = StringTrimRight(@ScriptFullPath, 4) & ".ini"
Global $g_logFile = StringTrimRight(@ScriptFullPath, 4) & ".log"
Global $g_iLogToFile = Int(IniReadOrInit($g_ini, "Settings", "LogToFile", "1 ; 0=OFF, 1=ON"))
Global $g_hOnlyHide = IniReadOrInit($g_ini, "Settings", "OnlyHide", "; HELP: use /OnlyHide to OnlyHide on load in a shortcut")
Global $g_iOnlyHide = StringInStr($CmdLineRaw, "/OnlyHide")

Exit main()
Func main()
    If Not FileGetSize(@ScriptDir & "\syncthing.exe") Then
        ConsoleWriteLog(' "syncthing.exe" is not found in the current folder !' & @CRLF)
        MsgBox(262144 + 16, StringTrimRight(@ScriptName, 4), '"syncthing.exe" is not found in the current folder !', 120)
        Exit 6
    EndIf
    Local $iPid = 0, $hTimer = TimerInit()
    If Not ProcessExists("syncthing.exe") Then
        $iPid = ShellExecute(@ComSpec, " /c title " & @ScriptDir & "&syncthing.exe --no-browser --no-console", @ScriptDir, "open", @SW_HIDE)
        ConsoleWrite('- $iPid:' & $iPid & @CRLF)
    EndIf
    While HideShowTerminal($iPid)
        If TimerDiff($hTimer) > 10000 Then Return 5
        Sleep(300)
    WEnd
EndFunc   ;==>main

Func HideShowTerminal($iPid = 0, $iActivate = 1)
    Local $aArray = WinList()
    Local $iNotFound = 1, $iCount = 0, $aCollected[UBound($aArray)][7]
    $aCollected[0][0] = "Title"
    $aCollected[0][1] = "HWD"
    $aCollected[0][2] = "PID"
    $aCollected[0][3] = "ClassName"
    $aCollected[0][4] = "ProcessName"
    $aCollected[0][5] = "WinState"
    $aCollected[0][6] = "WIN_STATE_VISIBLE"
    For $n = 1 To $aArray[0][0]
        If Not StringInStr($aArray[$n][0], @ScriptDir) Then ContinueLoop
        $iCount += 1
        $aCollected[$iCount][0] = $aArray[$n][0]
        $aCollected[$iCount][1] = $aArray[$n][1]
        $aCollected[$iCount][2] = WinGetProcess($aArray[$n][1])
        $aCollected[$iCount][3] = _WinAPI_GetClassName($aArray[$n][1])
        $aCollected[$iCount][4] = _WinAPI_GetProcessName($aCollected[$iCount][2])
        $aCollected[$iCount][5] = WinGetState($aArray[$n][1])
        $aCollected[$iCount][6] = BitAND($aCollected[$iCount][5], 2) ; $WIN_STATE_VISIBLE (2) = Window is visible
        If "WindowsTerminal.exe" = $aCollected[$iCount][4] Or "cmd.exe" = $aCollected[$iCount][4] Then
            $iNotFound = 0
            Switch $aCollected[$iCount][6]
                Case 2
                    WinSetState($aArray[$n][1], "", @SW_HIDE)
                Case Else
                    If Not $iPid And Not $g_iOnlyHide Then
                        WinSetState($aArray[$n][1], "", @SW_SHOW)
                        If $iActivate Then WinActivate($aArray[$n][1])
                    EndIf

            EndSwitch
        EndIf
    Next
    ReDim $aCollected[$iCount + 1][7]
    Local $sLog = _SQLite_Display2DResult($aCollected, 0, True, " | ", " |" & @CRLF) & " |" & @CRLF
    ConsoleWriteLog($sLog)
    Return $iNotFound
EndFunc   ;==>HideShowTerminal

Func ConsoleWriteLog($sStr)
    Local Static $sTimeStamp = ""
    If $sTimeStamp = "" Then
        $sTimeStamp = @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC
        If $g_iLogToFile Then FileWriteLine($g_logFile, @CRLF & $sTimeStamp & @CRLF)
    EndIf
    ConsoleWrite($sStr)
    If $g_iLogToFile Then FileWriteLine($g_logFile, $sStr)
EndFunc   ;==>ConsoleWriteLog

Func IniReadOrInit($ini, $sec, $key, $def)
    Local $vRet = IniRead($ini, $sec, $key, @CRLF)
    If $vRet = @CRLF Then
        $vRet = $def
        IniWrite($ini, $sec, $key, $def)
    EndIf
    If StringInStr($vRet, ";") Then $vRet = StringStripWS(StringLeft($vRet, StringInStr($vRet, ";") - 1), 3)
    Return $vRet
EndFunc   ;==>IniReadOrInit

...not a OMG, what an excellent example but, a simple solution to a simple problem.

Posted in the help area because I compiled it and posted in the files section.

If anyone needs anything else from this or just don't work, post a comment.

Usage:
Drop it in the same folder as syncthing is in, and run from there.
The /OnlyHide argument is to only hide it, because the default action is show if hidden and hide if shown.

The compiled file is in the downloads area.

Edited by argumentum

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...