Comment puis-je déterminer par programme si la barre des tâches Windows est masquée ou non?

J’ai besoin de savoir si la barre des tâches Windows est masquée ou non. Je pense qu’il n’existe pas de méthode .NET pour ce faire et que j’ai rencontré beaucoup d’exemples “Comment masquer et afficher la barre des tâches”, mais je n’ai rien vu qui corresponde à ce que je recherche. Je ne connais pas bien l’API Windows, j’ai donc du mal à comprendre le code Windows traditionnel. Quelqu’un peut-il me diriger s’il vous plaît vers un article ou un code de type indiquant si l’état actuel de la barre des tâches est masqué ou non? Je code en C #.

Merci.

winSharp93 présente une classe d’aide (” Connaître la taille (et la position) de la barre des tâches “) qui semble fonctionner. Il utilise la fonction SHAppBarMessage de Win32.

Voici le code (avec des ajouts mineurs) de son blog:

using System; using System.Drawing; using System.Runtime.InteropServices; namespace TaskbarTest { public enum TaskbarPosition { Unknown = -1, Left, Top, Right, Bottom, } public sealed class Taskbar { private const ssortingng ClassName = "Shell_TrayWnd"; public Rectangle Bounds { get; private set; } public TaskbarPosition Position { get; private set; } public Point Location { get { return this.Bounds.Location; } } public Size Size { get { return this.Bounds.Size; } } //Always returns false under Windows 7 public bool AlwaysOnTop { get; private set; } public bool AutoHide { get; private set; } public Taskbar() { IntPtr taskbarHandle = User32.FindWindow(Taskbar.ClassName, null); APPBARDATA data = new APPBARDATA(); data.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA)); data.hWnd = taskbarHandle; IntPtr result = Shell32.SHAppBarMessage(ABM.GetTaskbarPos, ref data); if (result == IntPtr.Zero) throw new InvalidOperationException(); this.Position = (TaskbarPosition)data.uEdge; this.Bounds = Rectangle.FromLTRB(data.rc.left, data.rc.top, data.rc.right, data.rc.bottom); data.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA)); result = Shell32.SHAppBarMessage(ABM.GetState, ref data); int state = result.ToInt32(); this.AlwaysOnTop = (state & ABS.AlwaysOnTop) == ABS.AlwaysOnTop; this.AutoHide = (state & ABS.Autohide) == ABS.Autohide; } } public enum ABM : uint { New = 0x00000000, Remove = 0x00000001, QueryPos = 0x00000002, SetPos = 0x00000003, GetState = 0x00000004, GetTaskbarPos = 0x00000005, Activate = 0x00000006, GetAutoHideBar = 0x00000007, SetAutoHideBar = 0x00000008, WindowPosChanged = 0x00000009, SetState = 0x0000000A, } public enum ABE : uint { Left = 0, Top = 1, Right = 2, Bottom = 3 } public static class ABS { public const int Autohide = 0x0000001; public const int AlwaysOnTop = 0x0000002; } public static class Shell32 { [DllImport("shell32.dll", SetLastError = true)] public static extern IntPtr SHAppBarMessage(ABM dwMessage, [In] ref APPBARDATA pData); } public static class User32 { [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr FindWindow(ssortingng lpClassName, ssortingng lpWindowName); } [StructLayout(LayoutKind.Sequential)] public struct APPBARDATA { public uint cbSize; public IntPtr hWnd; public uint uCallbackMessage; public ABE uEdge; public RECT rc; public int lParam; } [StructLayout(LayoutKind.Sequential)] public struct RECT { public int left; public int top; public int right; public int bottom; } } 

L’auteur affirme que cela fonctionne sur sa machine Windows 7 et que cela semble fonctionner sur ma machine XP Pro.

Voici comment vous pourriez l’utiliser:

  Taskbar tb = new Taskbar(); Console.WriteLine("w:{0}, h:{1} - hide:{2}", tb.Size.Width, tb.Size.Height, tb.AutoHide); 

Où: tb.Size.Width et tb.Size.Height renvoie la largeur et la hauteur de la barre des tâches et tb.AutoHide renvoie la valeur true si la barre des tâches est masquée et la valeur false si ce n’est pas le cas.

SystemParametersInfo avec SPI_GETWORKAREA

Récupère la taille de la zone de travail sur le moniteur d’affichage principal. La zone de travail est la partie de l’écran qui n’est pas masquée par la barre des tâches du système ou par les barres d’outils du bureau de l’application. Le paramètre pvParam doit pointer sur une structure RECT qui reçoit les coordonnées de la zone de travail, exprimées en coordonnées d’écran virtuel.

Pour obtenir la zone de travail d’un moniteur autre que le moniteur principal, appelez la fonction GetMonitorInfo.

Vous pouvez utiliser la fonction IsWindowVisible Win32.

  [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool IsWindowVisible(IntPtr hWnd); IntPtr hWnd = FindWindow("Shell_TrayWnd", null); if (hWnd != null) IsTaskBarVisible = IsWindowVisible(hWnd); 

Toutes les solutions que j’ai trouvées ne fonctionnaient pas pour moi, j’avais donc l’idée suivante et cela fonctionnait très bien pour moi.

  public static bool IsTaskbarVisible() { return Math.Abs(SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Height) > 0; } 

SystemParameters.PrimaryScreenHeight renvoie la hauteur d’affichage réelle. SystemParameters.WorkArea.Height renvoie la hauteur de la zone de travail disponible.

S’ils sont différents, la barre des tâches est affichée.