2009-05-07 4 views
5

Windows 7에서 앱의 화면 가장자리 근처에 화면 영역을 예약 할 수 있습니까? Windows 작업 표시 줄과 유사하게 동작합니다 (즉, 최대화 된 창이 겹치지 않음).Windows 7의 화면 영역 예약

여러 대의 모니터를 지원하는 작업 표시 줄 앱을 쓰고 있습니다. 주요 목적은 각 화면에 해당 화면에있는 응용 프로그램 만 포함하는 작업 표시 줄을 표시하는 것입니다. 기존 솔루션 (Ulltramon, DisplayFusion) 중 어떤 것도 Win 7에서 작동하는 것으로 알고 있으며 오픈 소스는 없습니다.

C# 코드는 좋지만 모든 힌트도 좋을 것입니다.

답변

3

C#에서이 작업을 직접 수행하는 방법이 확실하지 않지만 원시 코드에서 SPI_SETWORKAREA를 사용하여 SystemParametersInfo를 호출 할 수 있습니다. 이것은 작업 표시 줄, 사이드 바 등의 응용 프로그램이 최대화 된 윈도우가 겹치지 않도록 방지하는 방법입니다.

http://msdn.microsoft.com/en-us/library/ms724947.aspx은 SystemParametersInfo에 대한 설명서입니다.

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/9fe831e5-ccfb-4e8d-a129-68c301c83acb/쇼에서는이 메소드에 대한 서명을 호출합니다.

+0

주위에는 여러 가지 방법이 있으므로 _perfectly_ 할 수는 없다고 말했을 것입니다. 예를 들어, 전체 화면 및 키오스크 및 DirectX 응용 프로그램은이를 무시합니다. 하지만 그는 "작업 표시 줄과 같은"응용 프로그램을 만들었으므로 작업 표시 줄과 동일한 해결 방법이 완벽하게 적합하다는 것을 깨달았습니다. –

+1

그는 특히 "최대화 된 창"이라고 말했고 창을 최대화하면이 설정을 존중합니다. DX로 점프하지 않고도 작업 영역 바깥에 창을 수동으로 배치 할 수 있습니다. – Michael

5

나는 내 자신의 질문에 어리석게 대답하지만 마이클의 힌트 덕분에 적절한 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); 
    } 
}