Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Windows7中保留屏幕区域_C#_.net_Windows 7_Taskbar - Fatal编程技术网

C# 在Windows7中保留屏幕区域

C# 在Windows7中保留屏幕区域,c#,.net,windows-7,taskbar,C#,.net,Windows 7,Taskbar,是否可以在Windows 7中为您的应用程序保留靠近屏幕边缘的屏幕区域?它的行为类似于Windows任务栏(即最大化的窗口不会与其重叠) 我正在编写一个支持多个显示器的任务栏应用程序。主要目的是在每个屏幕上显示一个仅包含该屏幕上的应用程序的任务栏。据我所知,没有一个现有的解决方案(,)可以为Win7工作,也没有一个是开源的 C#代码会很好,但任何提示也很感激 我不确定如何在C#中直接执行此操作,但在本机代码中,您可以使用SPI_SETWORKAREA调用SystemParametersInfo。

是否可以在Windows 7中为您的应用程序保留靠近屏幕边缘的屏幕区域?它的行为类似于Windows任务栏(即最大化的窗口不会与其重叠)

我正在编写一个支持多个显示器的任务栏应用程序。主要目的是在每个屏幕上显示一个仅包含该屏幕上的应用程序的任务栏。据我所知,没有一个现有的解决方案(,)可以为Win7工作,也没有一个是开源的


C#代码会很好,但任何提示也很感激

我不确定如何在C#中直接执行此操作,但在本机代码中,您可以使用SPI_SETWORKAREA调用SystemParametersInfo。这就是任务栏、侧边栏等应用程序防止最大化窗口重叠的方法

是SystemParametersInfo的文档


/显示此方法的p/Invoke签名。

我觉得回答自己的问题很傻,但多亏了Michael的提示,我找到了一个合适的方法


我会说,这是不可能做到完美的,因为这是有办法的。例如,全屏、信息亭和directx应用程序将忽略这一点。但后来我意识到,由于他正在构建一个“类似任务栏”的应用程序,允许与任务栏相同的工作方式是完全合适的。他特别提到“最大化窗口”,最大化窗口将尊重此设置。即使不跳到DX,您也可以在工作区域外手动定位窗口。
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);
  }
}