2009-05-07 26 views
5

¿Es posible reservar un área de pantalla cerca de un borde de la pantalla para su aplicación en Windows 7? Se comportaría de forma similar a la barra de tareas de Windows (es decir, las ventanas maximizadas no se superpondrían con ella).Área de la pantalla de reserva en Windows 7

Estoy escribiendo una aplicación en la barra de tareas con soporte adecuado para monitores múltiples. El objetivo principal es mostrar una barra de tareas en cada pantalla que contiene solo las aplicaciones en esa pantalla. Ninguna de las soluciones existentes (Ulltramon, DisplayFusion) Sé de trabajo para Win 7, y ninguna es de código abierto.

El código C# sería agradable, pero también se aprecian algunos consejos.

Respuesta

3

No estoy seguro de cómo hacerlo directamente en C#, pero en el código nativo puede llamar a SystemParametersInfo con SPI_SETWORKAREA. Así es como las aplicaciones como la barra de tareas, la barra lateral, etc. pueden evitar que las ventanas maximizadas se superpongan.

http://msdn.microsoft.com/en-us/library/ms724947.aspx es la documentación de SystemParametersInfo.

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/9fe831e5-ccfb-4e8d-a129-68c301c83acb/muestra firmas de P/Invoke para este método.

+0

Hubiera dicho que es imposible hacerlo _perfectivamente_, porque hay formas de evitarlo. La pantalla completa y el quiosco, y las aplicaciones Directx, por ejemplo, ignorarán esto. Pero luego me di cuenta de que, como él está creando una aplicación que es "como la barra de tareas", permitir el mismo tipo de solución de problemas que la barra de tareas es perfectamente apropiado. –

+1

Dijo específicamente "Ventanas maximizadas", y la maximización de una ventana respetará esta configuración. Sin siquiera saltar a DX, puede colocar manualmente una ventana fuera del área de trabajo. – Michael

5

Me siento tonto al responder mi propia pregunta, pero gracias a la sugerencia de Michael, encontré un C# code sample apropiado.

using System; 
using System.Runtime.InteropServices; 

public class WorkArea 
{ 
    [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint="SystemParametersInfoA")] 
    private static extern Int32 SystemParametersInfo(Int32 uAction, Int32 uParam, IntPtr lpvParam, Int32 fuWinIni); 

    private const Int32 SPI_SETWORKAREA = 47; 
    public WorkArea(Int32 Left,Int32 Right,Int32 Top,Int32 Bottom) 
    { 
    _WorkArea.Left = Left; 
    _WorkArea.Top = Top; 
    _WorkArea.Bottom = Bottom; 
    _WorkArea.Right = Right; 
    } 

    public struct RECT 
    { 
    public Int32 Left; 
    public Int32 Right; 
    public Int32 Top; 
    public Int32 Bottom; 
    } 

    private RECT _WorkArea; 
    public void SetWorkingArea() 
    { 
    IntPtr ptr = IntPtr.Zero; 
    ptr = Marshal.AllocHGlobal(Marshal.SizeOf(_WorkArea)); 
    Marshal.StructureToPtr(_WorkArea,ptr,false); 
    int i = SystemParametersInfo(SPI_SETWORKAREA,0,ptr,0); 
    } 
} 
Cuestiones relacionadas