Page 1 sur 1

[Func] _MoveTaskBar

Posté : ven. 21 août 2015 17:51
par Tlem
Bonjour. Voici une petite fonction permettant de modifier quelques propriétés de la barre des tâche :
  • - Position de la barre sur l'écran (haut, bas, gauche, droite)
    - Masquage automatique de la barre
    - Verrouillage de la barre
J'ai testé cette fonction sur Windows XP, Windows 7, Windows 8.1 et Windows 10.
Cette fonction n’a aucun besoin d'élévation de droits (UAC).

Code : Tout sélectionner

; #FUNCTION# ====================================================================================================================
; Name ..........: _MoveTaskBar
; Description ...: Moves the Windows Taskbar to a New Location on the Screen.
; Syntax ........: _MoveTaskBar([$ScreenPos [, $iAutoHide = Default [, $iLock = Default]]])
; Parameters ....: $ScreenPosX = Left, Right, Top, Bottom or -1 if you want to keep actual position (default value Bottom)
;                  $iAutoHide = 0, 1 or -1 if you want to keep actual value (default value -1)
;                  $iLock = 0, 1 or -1 if you want to keep actual value (default value -1)
; Return values .: Success - True
;                  Failure - False and set @error = 1
; Author ........: Tlem
; Remarks .......: Tested on windows XP, 7, 8.1 and 10
; Example .......:
; Note ..........:
; ===============================================================================================================================
Func _MoveTaskBar($ScreenPos = "Bottom", $iAutoHide = -1, $iLock = -1)
    Local $StuckRects = (@OSVersion = "WIN_10") ? "StuckRects3" : "StuckRects2"
    Local $sStuckRectsHKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\" & $StuckRects
    Local $sLockHKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\"

    ; Set the $iLock and $iAutoHide values according to the input values (use ternary operator)
    $iAutoHide = ($iAutoHide = -1) ? StringMid(RegRead($sStuckRectsHKey, "Settings"), 19, 2) : (($iAutoHide = 0) ? "02" : "03")
    $iLock = ($iLock = -1) ? RegRead($sLockHKey, "TaskbarSizeMove") : (($iLock = 1) ? 0x00 : 0x01)

    ; Set the value for desired position. If -1 get actual value else return an error
    Select
        Case $ScreenPos = "Bottom"
            $ScreenPos = "0x28000000ffffffff02000000030000003e0000002e000000000000008204000080070000b0040000"

        Case $ScreenPos = "Left"
            $ScreenPos = "0x28000000ffffffff02000000000000003e0000002e00000000000000000000003e000000b0040000"

        Case $ScreenPos = "Right"
            $ScreenPos = "0x28000000ffffffff02000000020000003e0000002e000000420700000000000080070000b0040000"

        Case $ScreenPos = "Top"
            $ScreenPos = "0x28000000ffffffff02000000010000003e0000002e0000000000000000000000800700002e000000"

        Case $ScreenPos = -1
            $ScreenPos = RegRead($sStuckRectsHKey, "Settings")

        Case Else
            Return SetError(1, 0, 0)

    EndSelect

    $ScreenPos = StringMid($ScreenPos, 1, 18) & $iAutoHide & StringMid($ScreenPos, 21) ; Merge position and autohide values

    RegWrite($sStuckRectsHKey, "Settings", "REG_BINARY", $ScreenPos) ; New position with Autohide key
    RegWrite($sLockHKey, "TaskbarSizeMove", "REG_DWORD", $iLock) ; New lock/unlock key

    ; Restart Explorer for activate new parameters
    $Kernel32 = DllOpen("kernel32.dll")
    $hproc = DllCall($Kernel32, 'int', 'OpenProcess', 'int', 0x1F0FFF, 'int', True, 'int', ProcessExists('explorer.exe'))
    DllCall($Kernel32, "int", "TerminateProcess", "int", $hproc[0], "dword", 0)
    DllClose($Kernel32)

    Return 1
EndFunc   ;==>MoveTaskBar
Je joint un code de démonstration pour celui qui voudrait tester la fonction en condition (Je referais peut être l'interface un jour avec des boutons radio, car là elle est vraiment trop moche. :mrgreen: ).

Re: [Func] _MoveTaskBar

Posté : ven. 21 août 2015 19:17
par orax
J'avais essayé de trouver une alternative au redémarrage d'explorer.exe mais sans succès. J'avais trouvé cette fonction en Powershell qui permet à l'explorateur d'actualiser les changements effectués directement dans le registre. Quand la fonction s'exécute, je vois bien les icônes de la barre des tâches clignoter mais la barre ne change pas de position. Mais bon c'est peut-être une mauvaise piste... :oops:
► Afficher le texteRefresh Explorer (Powershell)

Re: [Func] _MoveTaskBar

Posté : ven. 21 août 2015 22:09
par franco
Salut.

pour le redémarrage d'explorer.exe, j'ai juste rajouté Run("explorer.exe") entre DllClose($Kernel32) et Return 1.

Sur mon Windows 10, ça me relance bien Explorer.exe

J'ai moi-même cherché une autre alternative, sans succès.


++

Re: [Func] _MoveTaskBar

Posté : ven. 21 août 2015 22:48
par jguinch
Merci Thierry pour le partage.
Je n'ai pas non plus trouvé d'alternative au redémarrage de l'explorer, malgré de nombreux tests :
- _WinAPI_RedrawWindow
- _SendMessage / SendMessageTimeout / SendNotifyMessage
- _WinAPI_ShellChangeNotify (SHChangeNotify)

Par contre, si plusieurs explorer.exe tournent en même temps, le script risque de ne pas fonctionner (si ProcessExists récupère le mauvais PID).
Dans ce cas, on peut remplacer ProcessExists('explorer.exe') par WinGetProcess("[CLASS:Shell_TrayWnd]") (je ne sais pas si ça marche sous Windows 10...)
En même temps, je n'ai pas compris pourquoi tu utilises OpenProcess et TerminateProcess ?
Pour la partie restart explorer, ça devrait suffire :

Code : Tout sélectionner

ProcessClose(WinGetProcess("[CLASS:Shell_TrayWnd]"))
If Not WinWait("[CLASS:Shell_TrayWnd]", "", 200) Then Run("explorer.exe")

Re: [Func] _MoveTaskBar

Posté : dim. 23 août 2015 11:51
par mdanielm
Bonjour,
Jguinch est trop modeste, sa solution "user32" est de loin meilleure, sur Win10 en tout cas.
Elle décale les icônes du bureau pour les rendre visibles, alors qu'avec la solution "registre" les icônes du bureau se retrouvent cachées par la barre des tâches.

A propos des icônes du bureau, connaissez vous un script Autoit pour sauvegarder la position des icônes afin de la restaurer à volonté ou même de les réarranger par script.
Cordialement

Re: [Func] _MoveTaskBar

Posté : lun. 24 août 2015 11:13
par franco
Salut la compagnie :D

Bon, j'ai essayé de trouver une alternative à l'arrêt / relancement d'explorer.exe

Je pense avoir trouvé une piste (qui fonctionne sur mon windows 10).


1. J'ai trouvé ceci : https://gallery.technet.microsoft.com/s ... r-0a7f8ea1 (en VBS).
J'ai juste rajouté oShell.Run("explorer.exe") avant "End Function".

Le VBS me ferme et me relancer explorer.exe :)
► Afficher le textecode VBS
2. J'avais lu à une époque qu'il existait un projet de convertisseur "VBS en AU3" : je me suis dis que si je convertis le script VBS, même s'il y a des erreurs, ça me fera une base pour le script AutoIt.

J'ai donc retrouvé ce convertisseur ici : https://www.autoitscript.com/forum/topi ... converter/
Vu qu'il date de 2005, vous vous doutez bien que certaines fonctions n'existent plus (soit améliorées, soit dépréciées, etc).

J'ai donc testé le script : à chaque erreur (liée aux fonctions qui "n'existent plus", j'ai cherché sur le net ces dernières pour les rajouter.

Ca fonctionne.
Je vous mettrais le zip originel et le zip modifié.

Y'a juste eu une petite erreur sur le script AutoIt : un () en trop.

Voici le script AutoIt :
► Afficher le textecode AU3

Maintenant, parlons du zip modifié : je n'ai pas les compétences pour "rescripter" le projet avec les fonctions actuelles.
Si une personne se sent d'attaque, ça serait sympa ^^


Bref, le script : est-il au point ?

Petite question : j'ai rajouté un Dim $oShell
J'aurai pu éditer cette ligne je pense : Dim $strComputer, $objWMIService, $colProcess, $objProcess


@++ et bon lundi à tous.

Re: [Func] _MoveTaskBar

Posté : lun. 24 août 2015 14:59
par jguinch
franco, le script arrête tous les process explorer.exe qui tournent, en passant par les requêtes WMI.
Le code de Thierry ne fonctionne pas ? et avec mes modifs ?

Re: [Func] _MoveTaskBar

Posté : lun. 24 août 2015 20:35
par franco
Salut jguinch.

Tu parles de ceci ?

Code : Tout sélectionner

ProcessClose(WinGetProcess("[CLASS:Shell_TrayWnd]"))
If Not WinWait("[CLASS:Shell_TrayWnd]", "", 2000) Then Run("explorer.exe")
Si oui, ça me ferme explorer.exe mais il n'est pas relancé.

Comme dans la fonction. ;)



++

Re: [Func] _MoveTaskBar

Posté : ven. 01 janv. 2016 14:52
par Amesamana
Bonjour :)

Je cherche à réactualiser le Bureau.
J'utilise :

Code : Tout sélectionner

ProcessClose("explorer.exe")
Run("explorer.exe")
Ça fonctionne mais dès que je compile ça ne fonctionne plus pour relancer explorer.exe.

J'ai essayé la fonction que Franco propose mais idem ???

Une idée ?
Merci.

Re: [Func] _MoveTaskBar

Posté : ven. 01 janv. 2016 15:09
par franco
Salut.

Essaye ça :
► Afficher le textecode

@++

Re: [Func] _MoveTaskBar

Posté : ven. 01 janv. 2016 19:16
par Amesamana
:D ça fonctionne, merci Franco.

Je n'ai pas compris pourquoi la compilation bloque ? Le sais-tu ?

Re: [Func] _MoveTaskBar

Posté : ven. 01 janv. 2016 19:30
par franco
Salut.

Peut-être une idée... foireuse ^^

Y'a deux explorer.exe :
- un dans c:\windows\.
- L'autre dans c:\windows\syswow64.

Peut-être que tu essayes de relancer l'un de deux, alors qu'il faut lancer celui qui se trouve dans c:\windows.

D'ailleurs, quand je script, scite est lancé en 32 bits.
Donc si compilation, peut-être que tu as compilé en 64 bits, et donc qu'il essaye de relance explorer.exe qui se trouve dans c:\windows\syswow64.


Et si tu faisais un run("c:\windows\explorer.exe") ?


EDIT :

En fait, quand on compile ton script en 32 bits, le "run" ne lance pas le bon explorer.exe.
Il m'ouvre un dossier. ^^


Tu peux contourner ce problème avec ceci :

Code : Tout sélectionner

ProcessClose("explorer.exe")
Run(@WindowsDir & "\explorer.exe")



++

Re: [Func] _MoveTaskBar

Posté : ven. 01 janv. 2016 20:15
par Amesamana
ProcessClose("explorer.exe")
Run(@WindowsDir & "\explorer.exe")
Oui bien vue ! Pas la bonne cible :wink:
Utiliser les macros !
Bonne soirée à toi.