[Func] _MoveTaskBar

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11772
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

[Func] _MoveTaskBar

#1

Message 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: ).
Fichiers joints
_MoveTaskBar Exemple.au3
(4.86 Kio) Téléchargé 754 fois
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [Func] _MoveTaskBar

#2

Message 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)
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 342
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: [Func] _MoveTaskBar

#3

Message 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.


++
L'entraide, c'est mon dada ;)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [Func] _MoveTaskBar

#4

Message 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")
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: [Func] _MoveTaskBar

#5

Message 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
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 342
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: [Func] _MoveTaskBar

#6

Message 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.
Fichiers joints
VAConvert.04_modifié.zip
Convertisseur VBS>AU3 modifié
(11.05 Kio) Téléchargé 672 fois
VAConvert.04.zip
Convertisseur VBS>AU3 d'origine
(10.05 Kio) Téléchargé 644 fois
L'entraide, c'est mon dada ;)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [Func] _MoveTaskBar

#7

Message 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 ?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 342
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: [Func] _MoveTaskBar

#8

Message 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. ;)



++
L'entraide, c'est mon dada ;)
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [Func] _MoveTaskBar

#9

Message 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.
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 342
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: [Func] _MoveTaskBar

#10

Message par franco »

Salut.

Essaye ça :
► Afficher le textecode

@++
L'entraide, c'est mon dada ;)
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [Func] _MoveTaskBar

#11

Message par Amesamana »

:D ça fonctionne, merci Franco.

Je n'ai pas compris pourquoi la compilation bloque ? Le sais-tu ?
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 342
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: [Func] _MoveTaskBar

#12

Message 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")



++
L'entraide, c'est mon dada ;)
Amesamana
Niveau 5
Niveau 5
Messages : 108
Enregistré le : dim. 09 sept. 2012 16:37
Status : Hors ligne

Re: [Func] _MoveTaskBar

#13

Message par Amesamana »

ProcessClose("explorer.exe")
Run(@WindowsDir & "\explorer.exe")
Oui bien vue ! Pas la bonne cible :wink:
Utiliser les macros !
Bonne soirée à toi.
Répondre