2010-01-09 19 views
10

Necesito saber si la barra de tareas de Windows está oculta o no. Creo que no hay un método .NET para hacer esto, y también he encontrado muchas muestras de "cómo ocultar y mostrar la barra de tareas", pero no he visto nada en función de lo que estoy buscando. No estoy familiarizado con la API de Windows, por lo que me resulta difícil entender el código tradicional de Windows. ¿Puede alguien dirigirme a un artículo o escribir un código que indique si el estado actual de la barra de tareas está oculto o no? Estoy codificando en C#.¿Cómo puedo determinar mediante programación si la barra de tareas de Windows está oculta o no?

Gracias.

Respuesta

10

winSharp93 presenta una clase de ayuda ("Find out Size (and position) of the taskbar") que parece funcionar. Utiliza el SHAppBarMessage function de Win32.

Aquí está el código (con adiciones menores) de su 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 string 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(string lpClassName, string 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; 
    } 
} 

El autor afirma que trabaja en su máquina Windows 7 y parece que trabajar en mi máquina XP Pro.

Así es como usted puede utilizarlo:

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

Dónde: tb.Size.Width y tb.Size.Height devuelve el ancho y la altura de la barra de tareas, y tb.AutoHide devuelve verdadero si la barra de tareas es oculto y falso si no lo es.

1

SystemParametersInfo con SPI_GETWORKAREA

Recupera el tamaño de la zona de trabajo en el monitor de pantalla principal. El área de trabajo es la parte de la pantalla que no está oscurecida por la barra de tareas del sistema ni por las barras de herramientas del escritorio de la aplicación. El parámetro pvParam debe apuntar a una estructura RECT que recibe las coordenadas del área de trabajo, expresada en coordenadas de pantalla virtual.

Para obtener el área de trabajo de un monitor que no sea el monitor de pantalla principal, llame a la función GetMonitorInfo.

0

Puede usar la función 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); 
Cuestiones relacionadas