Registryeintrag wirksam machen ohne Neustart - Wieso verschieben sich Icons auf dem Desktop!?

  • Hallo
    Ich möchte einen Skript erstellen, dass ohne "richtigen Neustart" einen Registryeintrag wirksam macht. Bis jetzt habe ich dies, was auch funktioniert:

    [autoit]

    ProcessClose("explorer.exe")
    Execute("explorer.exe")

    [/autoit]


    Den Skript kann man getrost ausführen; es wird nichts verändert oder geschlossen, außer die Desktopicons werden verschoben, aber warum? Wenn jmd die Antwort darauf weiß, bitte posten :thumbup: .
    Danke im Vorraus
    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug

  • Warum Execute()?
    Execute führt AutoIt-Code in Strings aus.

    Bei mir verschieben sich im übrigen keine Icons.
    Versuch es mal so:

    [autoit]

    Do ; Alle explorer-Prozesse killen
    ProcessClose("explorer.exe")
    Until Not ProcessExists("explorer.exe")
    Run("explorer.exe")

    [/autoit]
  • Hast du die Icons seit deinem letzten Windows-Start verschoben?
    Windows speichert beim Herunterfahren normalerweise solche Einstellungen ("Einstellungen werden gespeichert"). Beim Explorer killen hat dieser dafür natürlich nicht die Zeit...
    Kann man auch ein 15-Signal an einen Prozess senden (Also ein "Bitte, beende dich mal")?

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Vielleicht irgendwie mit _SendMessage aus der WinAPI? Oder vielleicht geht es auch gar nciht.
    Dann könnte man vielleicht irgendwie das "Speichern" auslösen und danach normal killen?

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • Hi,
    ich hab versucht diverse WM_ Codes zu senden (WM_DESTROY, WM_QUERYENDSESSION, WM_QUIT, WM_ENDESSION) alles ohne Erfolg.

    [autoit]

    if Not WinExists("Windows") or WinExists(@WindowsDir) Then ShellExecute(@WindowsDir) ;Überprüfen ob schon C:\Windows offen ist
    Sleep(200)
    $hWin = WinGetHandle("Windows");Handle ermitteln
    if $hWin = "" Then WinGetHandle(@WindowsDir); Wenn das Fenster nicht offen ist od. man aktiviert hat das der gesamte Pfad im GUI Titel steht
    ConsoleWrite($hWin & @CRLF)
    DllCall("user32.dll", "int", "PostMessageA", "hwnd", $hWin, "int", 0x0012, "int", 0, "int", 0);Message an das Fenster senden

    [/autoit]
  • Was für Registryeinträge veränderst du denn? Eventuell hilft ein DLLCall zu SystemParametersInfo oder das:

    [autoit]

    Run("RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters ,1 ,True")

    [/autoit]
  • Zitat

    es wird nichts verändert oder geschlossen

    Außer allen Sachen die mit explorer.exe zu tun haben, z.B. Kopiervorgänge ;)

    Sobald du einen Registryeintrag änderst ist er schon aktiv. Er muss nur noch einmal ausgelesen werden, falls das Programm schon vorher gestartet wurde. Wenn du den Explorer neustarten willst hast du die Auflösung geändert?

  • Generell trifft das zu aber es gibt auch welche die erst mit erneuter Anmeldung greifen.
    Die Änderung der Icons könnte mit Nutzung verschiedener Ausgabedevices zusammenhängen.
    Notebook loose oder mit zusätzlichen Monitor positioniert die dann auch immer wieder anders.
    Das Programm fernces kann eine Lösung sein außer man möchte es selbst programmieren.

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Generell trifft das zu aber es gibt auch welche die erst mit erneuter Anmeldung greifen.


    Es gibt dann aber Funktionen, die dann Teile der Registry neu laden. Wenn es für die Einstellungen, die du änderst eine passende Option bei SystemParametersInfo gibt, kannst du diese verwenden, wenn das nicht geht und eine Einstellung in HKCU geändert wird, ist der Rundll-Befehl oft das richtige um einen Neustart zu vermeiden.

  • @progandy
    auch wenn es etwas dazwischengedrängt wirkt...
    was müsste man bei dem Regkey machen damit er ohne "Wieder-"Anmeldung sofort greift?

    [autoit]

    REGEDIT4
    [HKEY_CURRENT_USER\Control Panel\Desktop]
    "ForegroundLockTimeout"=dword:00000000

    [/autoit]

    Ich weiß der Regkey ist hässlich aber nur mal so gefragt ob es auch so geht.

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Bei diesem Wert geht z.B. das:

    Spoiler anzeigen
    [autoit]

    #include<WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $SPI_GETFOREGROUNDLOCKTIMEOUT = 0x2000
    Global Const $SPI_SETFOREGROUNDLOCKTIMEOUT = 0x2001
    Global Const $SPIF_UPDATEINIFILE = 0x1
    Global Const $SPIF_SENDWININICHANGE = 0x2

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Irgendwie kommt der falsche Wert raus solange man es noch nicht im Skript gesetzt hat.
    ; Da muss man wohl zuerst die Registry auslesen
    $iFGLockTimeoutOrig = _GetFGLTimeout()
    MsgBox(0, "Falsch:", $iFGLockTimeoutOrig)

    [/autoit] [autoit][/autoit] [autoit]

    $iFGLockTimeoutOrig = Number(RegRead("HKEY_CURRENT_USER\Control Panel\Desktop", "ForegroundLockTimeout"))
    MsgBox(0, "Registry:", $iFGLockTimeoutOrig)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SystemParametersInfo($SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 100, BitOR($SPIF_SENDWININICHANGE, $SPIF_UPDATEINIFILE))

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, 'Neuer Wert', _GetFGLTimeout())

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SystemParametersInfo($SPI_SETFOREGROUNDLOCKTIMEOUT, 0, $iFGLockTimeoutOrig, BitOR($SPIF_SENDWININICHANGE, $SPIF_UPDATEINIFILE))

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, 'Zurücksetzen', _GetFGLTimeout())

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetFGLTimeout()
    Local $tFGLockTimeout = DllStructCreate("dword")
    Local $iRes = _WinAPI_SystemParametersInfo($SPI_GETFOREGROUNDLOCKTIMEOUT, 0, DllStructGetPtr($tFGLockTimeout))
    If Not $iRes Then Return SetError(@error, @extended, -1)
    Return DllStructGetData($tFGLockTimeout, 1)
    EndFunc

    [/autoit]