2009-05-07 7 views
5

Est-il possible de réserver une zone d'écran près d'un bord de l'écran pour votre application dans Windows 7? Il se comporterait de la même manière que la barre des tâches de Windows (c'est-à-dire que les fenêtres agrandies ne se chevaucheraient pas). Je suis en train d'écrire une application de barre des tâches avec un support approprié pour plusieurs moniteurs. L'objectif principal est d'afficher une barre des tâches sur chaque écran contenant uniquement les applications sur cet écran. Aucune des solutions existantes (Ulltramon, DisplayFusion) Je connais le travail pour Win 7, et aucun n'est open source.Zone de réserve d'écran sous Windows 7

Le code C# serait bien, mais tous les indices sont également appréciés.

Répondre

3

Je ne suis pas sûr de la façon de le faire directement en C#, mais en code natif, vous pouvez appeler SystemParametersInfo avec SPI_SETWORKAREA. C'est ainsi que les applications telles que la barre des tâches, la barre latérale, etc. peuvent empêcher les fenêtres agrandies de se chevaucher.

http://msdn.microsoft.com/en-us/library/ms724947.aspx est la documentation de SystemParametersInfo.

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/9fe831e5-ccfb-4e8d-a129-68c301c83acb/affiche les signatures P/Invoke pour cette méthode.

+0

J'aurais dit qu'il est impossible de faire ceci _perfectly_, parce qu'il y a des façons de le contourner. Le plein écran et le kiosque, et les applications directx, par exemple, l'ignoreront. Mais ensuite j'ai réalisé que depuis qu'il construit une application qui est "comme la barre des tâches", permettre les mêmes solutions de rechange que la barre des tâches est parfaitement approprié. –

+1

Il a spécifiquement dit "fenêtres maximisées", et en maximisant une fenêtre respectera ce paramètre. Sans même passer à DX, vous pouvez positionner manuellement une fenêtre en dehors de la zone de travail. – Michael

5

Je me sens stupide de répondre à ma propre question, mais grâce à l'indice de Michael, j'ai trouvé un C# code sample approprié.

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); 
    } 
} 
Questions connexes