none
Option de la barre d'état RRS feed

  • Question

  • Bonjour tout le monde,

    Sous Windows 10, avec un seul raccourci clavier je veux pouvoir changer l'état de l'option "la barre des tâches se masque automatiquement".

    J'ai fait ça comme ça :

    			//Application.Run(new Form1());  System.Windows.Forms utilisé pour SendKeys
    			Process.Start("ms-settings:taskbar");
    			Thread.Sleep(2000);
    			SendKeys.SendWait("{tab 3} %{F4}");
    

    Ça marche, peut-être faudra-t-il changer le délai si la machine est débordée, mais y a-t-il moyen de trouver plus spécifique qu'une combinaison de touches ?

    mardi 18 février 2020 08:44

Réponses

  • Il faut utiliser la méthode officielle avec SHAppBarMessage et ABM_SETSTATE (P/Invoke)

    (FindWindow("System_TrayWnd", null); pour récupérer son handle)

    • Marqué comme réponse Gloops mercredi 19 février 2020 11:26
    mardi 18 février 2020 09:17
  • J'ai fait un test sous Windows 10 pour Auto-Hide:

    APPBARDATA abd = new APPBARDATA();
    abd.cbSize = Marshal.SizeOf(abd);
    abd.hWnd = FindWindow("System_TrayWnd", null);
    abd.lParam = 1;
    //abd.lParam = 0;
    SHAppBarMessage(ABM_SETSTATE, ref abd);

    Declarations :

            [DllImport("Shell32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
            public static extern uint SHAppBarMessage(int dwMessage, ref APPBARDATA pData);
    
            public const int ABM_NEW = 0x00000000;
            public const int ABM_REMOVE = 0x00000001;
            public const int ABM_QUERYPOS = 0x00000002;
            public const int ABM_SETPOS = 0x00000003;
            public const int ABM_GETSTATE = 0x00000004;
            public const int ABM_GETTASKBARPOS = 0x00000005;
            public const int ABM_ACTIVATE = 0x00000006;  // lParam == TRUE/FALSE means activate/deactivate
            public const int ABM_GETAUTOHIDEBAR = 0x00000007;
            public const int ABM_SETAUTOHIDEBAR = 0x00000008; // this can fail at any time.  MUST check the result
                                                              // lParam = TRUE/FALSE  Set/Unset
                                                              // uEdge = what edge
            public const int ABM_WINDOWPOSCHANGED = 0x0000009;
    
            public const int ABM_SETSTATE = 0x0000000a;
    
            public const int ABM_GETAUTOHIDEBAREX = 0x0000000b; // multimon aware autohide bars
            public const int ABM_SETAUTOHIDEBAREX = 0x0000000c;
    
            // these are put in the wparam of callback messages
            public const int ABN_STATECHANGE = 0x0000000;
            public const int ABN_POSCHANGED = 0x0000001;
            public const int ABN_FULLSCREENAPP = 0x0000002;
            public const int ABN_WINDOWARRANGE = 0x0000003; // lParam == TRUE means hide
    
            // flags for get state
            public const int ABS_AUTOHIDE = 0x0000001;
            public const int ABS_ALWAYSONTOP = 0x0000002;
    
            public const int ABE_LEFT       = 0;
            public const int ABE_TOP      =   1;
            public const int ABE_RIGHT     =  2;
            public const int ABE_BOTTOM    =  3;
    
            [StructLayout(LayoutKind.Sequential)]
            public struct APPBARDATA
            {
                public int cbSize; // initialize this field using: Marshal.SizeOf(typeof(APPBARDATA));
                public IntPtr hWnd;
                public uint uCallbackMessage;
                public uint uEdge;
                public RECT rc;
                public int lParam;
            }
            
            
            [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
            
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int left;
                public int top;
                public int right;
                public int bottom;
                public RECT(int Left, int Top, int Right, int Bottom)
                {
                    left = Left;
                    top = Top;
                    right = Right;
                    bottom = Bottom;
                }
            }

    • Marqué comme réponse Gloops mercredi 19 février 2020 11:26
    mardi 18 février 2020 11:11

Toutes les réponses

  • Il faut utiliser la méthode officielle avec SHAppBarMessage et ABM_SETSTATE (P/Invoke)

    (FindWindow("System_TrayWnd", null); pour récupérer son handle)

    • Marqué comme réponse Gloops mercredi 19 février 2020 11:26
    mardi 18 février 2020 09:17
  • Ah en effet c'est plus précis, merci.

    Et donc il faut consulter le lien sur chaque "message" pour en savoir plus.

    • Modifié Gloops mardi 18 février 2020 09:30
    mardi 18 février 2020 09:23
  • J'ai fait un test sous Windows 10 pour Auto-Hide:

    APPBARDATA abd = new APPBARDATA();
    abd.cbSize = Marshal.SizeOf(abd);
    abd.hWnd = FindWindow("System_TrayWnd", null);
    abd.lParam = 1;
    //abd.lParam = 0;
    SHAppBarMessage(ABM_SETSTATE, ref abd);

    Declarations :

            [DllImport("Shell32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
            public static extern uint SHAppBarMessage(int dwMessage, ref APPBARDATA pData);
    
            public const int ABM_NEW = 0x00000000;
            public const int ABM_REMOVE = 0x00000001;
            public const int ABM_QUERYPOS = 0x00000002;
            public const int ABM_SETPOS = 0x00000003;
            public const int ABM_GETSTATE = 0x00000004;
            public const int ABM_GETTASKBARPOS = 0x00000005;
            public const int ABM_ACTIVATE = 0x00000006;  // lParam == TRUE/FALSE means activate/deactivate
            public const int ABM_GETAUTOHIDEBAR = 0x00000007;
            public const int ABM_SETAUTOHIDEBAR = 0x00000008; // this can fail at any time.  MUST check the result
                                                              // lParam = TRUE/FALSE  Set/Unset
                                                              // uEdge = what edge
            public const int ABM_WINDOWPOSCHANGED = 0x0000009;
    
            public const int ABM_SETSTATE = 0x0000000a;
    
            public const int ABM_GETAUTOHIDEBAREX = 0x0000000b; // multimon aware autohide bars
            public const int ABM_SETAUTOHIDEBAREX = 0x0000000c;
    
            // these are put in the wparam of callback messages
            public const int ABN_STATECHANGE = 0x0000000;
            public const int ABN_POSCHANGED = 0x0000001;
            public const int ABN_FULLSCREENAPP = 0x0000002;
            public const int ABN_WINDOWARRANGE = 0x0000003; // lParam == TRUE means hide
    
            // flags for get state
            public const int ABS_AUTOHIDE = 0x0000001;
            public const int ABS_ALWAYSONTOP = 0x0000002;
    
            public const int ABE_LEFT       = 0;
            public const int ABE_TOP      =   1;
            public const int ABE_RIGHT     =  2;
            public const int ABE_BOTTOM    =  3;
    
            [StructLayout(LayoutKind.Sequential)]
            public struct APPBARDATA
            {
                public int cbSize; // initialize this field using: Marshal.SizeOf(typeof(APPBARDATA));
                public IntPtr hWnd;
                public uint uCallbackMessage;
                public uint uEdge;
                public RECT rc;
                public int lParam;
            }
            
            
            [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
            
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int left;
                public int top;
                public int right;
                public int bottom;
                public RECT(int Left, int Top, int Right, int Bottom)
                {
                    left = Left;
                    top = Top;
                    right = Right;
                    bottom = Bottom;
                }
            }

    • Marqué comme réponse Gloops mercredi 19 février 2020 11:26
    mardi 18 février 2020 11:11
  • Efficacité redoutable :)

    Merci.

    Alors si on veut faire une bascule :

    int state = (int)SHAppBarMessage(ABM_GETSTATE, ref abd);
    abd.lParam = (state - 1) * (-1);
    SHAppBarMessage(ABM_SETSTATE, ref abd);
    

    mercredi 19 février 2020 11:26
  • Bonjour,

    En appliquant ça sur une nouvelle machine, je viens de me rendre compte d'un autre effet auquel nous n'avions pas pensé : ça restaure les emplacements des raccourcis sur le bureau.

    Ça, ça peut être précieux, mais du coup ça suscite une autre question : est-ce qu'on sait modifier cette sauvegarde ?

    Je vois que là on traite la question de sauvegarder les emplacements des raccourcis (les icônes du bureau) :

    https://www.codeproject.com/Articles/639486/Save-and-Restore-Icon-Positions-on-Desktop

    Il va quand même rester quelques petits coups de tournevis à donner. Après deux lancements j'ai bien les positions des raccourcis de sauvegardées, mais j'observe que certains sont intervertis. Or, j'aimerais assez que chacun retrouve sa place propre.

    Avant d'avoir plongé dans le cambouis j'imagine que les éléments sont repérés par leur position dans un tableau, et qu'il va falloir plutôt les repérer par un intitulé.

    Il est possible aussi qu'un autre outil perturbe ce tableau, en allant voir ce qu'il y a là-dedans je vais bien en apprendre plus.

    • Modifié Gloops mardi 23 février 2021 15:42
    mardi 23 février 2021 14:37
  • Eh bien je crois que j'ai trouvé, et il n'y a rien de particulier à faire.

    Le programme sauvegarde un jeu de positions des raccourcis du bureau lorsque la barre des tâches est toujours visible, et un autre lorsqu'elle se masque automatiquement. Et le jeu de positions est restauré lorsque l'option de visibilité de la barre des tâches est modifiée.

    Donc tout baigne, et même plus que ce qu'on croyait il y a un mois.

    Je vois que je me suis trompé dans le titre du fil, mais à ce stade j'imagine qu'il vaut autant laisser comme c'est.

    mercredi 24 février 2021 10:39