2009-05-07 30 views
5

Có thể đặt trước khu vực màn hình gần cạnh màn hình cho ứng dụng của bạn trong Windows 7 không? Nó sẽ hoạt động tương tự như thanh tác vụ Windows (tức là các cửa sổ tối đa sẽ không chồng lên nhau).Khu vực màn hình dự trữ trong Windows 7

Tôi đang viết một ứng dụng thanh tác vụ với sự hỗ trợ thích hợp cho nhiều màn hình. Mục đích chính là hiển thị thanh tác vụ trên mỗi màn hình chỉ chứa các ứng dụng trên màn hình đó. Không có giải pháp hiện có nào (Ulltramon, DisplayFusion) Tôi biết công việc cho Win 7 và không có giải pháp nào là nguồn mở.

Mã C# sẽ đẹp, nhưng mọi gợi ý đều được đánh giá cao.

Trả lời

3

tôi không chắc chắn làm thế nào để làm điều này trực tiếp trong C#, nhưng trong mã nguồn gốc bạn có thể gọi SystemParametersInfo với SPI_SETWORKAREA. Đây là cách các ứng dụng như thanh tác vụ, thanh bên, v.v. có thể ngăn các cửa sổ tối đa trùng lặp chúng.

http://msdn.microsoft.com/en-us/library/ms724947.aspx là tài liệu cho SystemParametersInfo.

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/9fe831e5-ccfb-4e8d-a129-68c301c83acb/shows P/Gọi chữ ký cho phương thức này.

+0

Tôi đã nói rằng không thể thực hiện điều này _perfectly_, bởi vì có nhiều cách xung quanh nó. Ví dụ: toàn màn hình và kiosk và ứng dụng directx sẽ bỏ qua điều này. Nhưng sau đó tôi nhận ra rằng kể từ khi anh ấy xây dựng một ứng dụng "giống như thanh tác vụ", cho phép các work-around tương tự như thanh tác vụ là hoàn toàn thích hợp. –

+1

Ông đặc biệt nói "Cửa sổ tối đa hóa" và tối đa hóa cửa sổ sẽ tôn trọng cài đặt này. Thậm chí không cần nhảy tới DX, bạn có thể tự định vị một cửa sổ bên ngoài vùng làm việc. – Michael

5

tôi cảm thấy ngớ ngẩn trả lời câu hỏi của riêng tôi, nhưng nhờ gợi ý của Michael, tôi tìm thấy một phù hợp 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); 
    } 
} 
Các vấn đề liên quan