2009-05-07 18 views
5

Ist es möglich, einen Bildschirmbereich nahe der Bildschirmkante für Ihre App in Windows 7 zu reservieren? Sie würde sich ähnlich wie die Windows-Taskleiste verhalten (d. H. Maximierte Fenster würden sich nicht mit ihr überschneiden).Bildschirmbereich in Windows 7 reservieren

Ich schreibe eine Taskleiste App mit der richtigen Unterstützung für mehrere Monitore. Der Hauptzweck besteht darin, auf jedem Bildschirm eine Taskleiste anzuzeigen, die nur die Apps auf diesem Bildschirm enthält. Keine der vorhandenen Lösungen (Ulltramon, DisplayFusion) Ich weiß von Arbeit für Win 7, und keiner ist Open Source.

C# -Code wäre nett, aber alle Hinweise werden auch geschätzt.

Antwort

3

Ich bin nicht sicher, wie dies direkt in C# zu tun, aber in systemeigenem Code können Sie SystemParametersInfo mit SPI_SETWORKAREA aufrufen. Auf diese Weise können Apps wie die Taskleiste, die Seitenleiste usw. verhindern, dass maximierte Fenster sie überlappen.

http://msdn.microsoft.com/en-us/library/ms724947.aspx ist die Dokumentation für SystemParametersInfo.

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/9fe831e5-ccfb-4e8d-a129-68c301c83acb/zeigt P/Signaturen für diese Methode aufrufen.

+0

Ich hätte gesagt, dass es unmöglich ist, dies _perfectly_ zu tun, weil es Möglichkeiten gibt. Vollbild- und Kiosk- und DirectX-Apps ignorieren dies zum Beispiel. Aber dann erkannte ich, dass, da er eine App "wie die Taskleiste" baut, die gleichen Workarounds wie die Taskleiste ist perfekt geeignet. –

+1

Er sagte speziell "maximierte Fenster", und die Maximierung eines Fensters wird diese Einstellung respektieren. Ohne direkt zum DX zu springen, können Sie ein Fenster manuell außerhalb des Arbeitsbereichs positionieren. – Michael

5

Ich fühle mich dumm meine eigene Frage zu beantworten, aber dank Michaels Hinweis fand ich eine entsprechende C# code sample.

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