gpt4 book ai didi

c# - 如何根据任务栏的系统托盘图标的位置设置通知自定义表单的正上方或下方的位置?

转载 作者:行者123 更新时间:2023-12-04 08:15:06 28 4
gpt4 key购买 nike

有没有办法在 c# winforms 中识别系统托盘的位置?
enter image description here
我想创建一个放置在系统托盘上方或下方的表单,具体取决于系统托盘所在的位置。
我计划创建一个自定义表单而不是上下文菜单,因为我需要增强 UI,但我对如何将我的表单放置在系统托盘上方/下方感到困惑。
我附上了我想象我的表格将如何定位的图像。

最佳答案

使用此帖子获取任务栏的坐标:
Taskbar location

static public Rectangle GetTaskbarCoordonates()
{
var data = new NativeMethods.APPBARDATA();
data.cbSize = Marshal.SizeOf(data);
IntPtr retval = NativeMethods.SHAppBarMessage(NativeMethods.ABM_GETTASKBARPOS, ref data);
if ( retval == IntPtr.Zero )
throw new Win32Exception("Windows Taskbar Error in " + nameof(GetTaskbarCoordonates));
return new Rectangle(data.rc.left, data.rc.top,
data.rc.right - data.rc.left, data.rc.bottom - data.rc.top);
}
此方法将任务栏的 anchor 样式返回到屏幕边缘:
public const int TaskbarWidthCheckTrigger = 250;

static public AnchorStyles GetTaskbarAnchorStyle()
{
var coordonates = GetTaskbarCoordonates();
if ( coordonates.Left == 0 && coordonates.Top == 0 )
if ( coordonates.Width > TaskbarWidthCheckTrigger )
return AnchorStyles.Top;
else
return AnchorStyles.Left;
else
if ( coordonates.Width > TaskbarWidthCheckTrigger )
return AnchorStyles.Bottom;
else
return AnchorStyles.Right;
}
这个值 250 是任意的,可以在特殊条件下校准或更改为更好的东西。
那么我们就可以利用上面的帖子,根据任务栏的边缘位置以及托盘图标的位置和大小,精确计算自定义工具提示通知表单的所需位置。
或者我们可以简单地确定表单的角落:
  • 顶部 => 右上角
  • 左 => 左下
  • 底部 => 右下
  • 右 => 右下

  • 例如:
    var form = new Form();
    form.StartPosition = FormStartPosition.Manual;
    var anchor = DisplayManager.GetTaskbarAnchorStyle();
    switch ( anchor )
    {
    case AnchorStyles.Top:
    form.SetLocation(ControlLocation.TopRight);
    break;
    case AnchorStyles.Left:
    form.SetLocation(ControlLocation.BottomLeft);
    break;
    case AnchorStyles.Bottom:
    case AnchorStyles.Right:
    form.SetLocation(ControlLocation.BottomRight);
    break;
    }
    form.Show();
    拥有:
    static public void SetLocation(this Form form, ControlLocation location)
    {
    if ( form == null ) return;
    var area = SystemInformation.WorkingArea;
    switch ( location )
    {
    case ControlLocation.TopLeft:
    form.Location = new Point(area.Left, area.Top);
    break;
    case ControlLocation.TopRight:
    form.Location = new Point(area.Left + area.Width - form.Width, area.Top);
    break;
    case ControlLocation.BottomLeft:
    form.Location = new Point(area.Left, area.Top + area.Height - form.Height);
    break;
    case ControlLocation.BottomRight:
    form.Location = new Point(area.Left + area.Width - form.Width,
    area.Top + area.Height - form.Height);
    break;
    case ControlLocation.Center:
    form.Center(area);
    break;
    case ControlLocation.Fixed:
    form.CenterToMainFormElseScreen();
    break;
    case ControlLocation.Loose:
    break;
    default:
    throw new NotImplementedExceptionEx(location);
    }
    }
    然后:
    [Serializable]
    public enum ControlLocation
    {
    Loose,
    TopLeft,
    TopRight,
    BottomLeft,
    BottomRight,
    Center,
    Fixed
    }
    备注:这仅适用于主屏幕,应调整以使用其他屏幕。

    关于c# - 如何根据任务栏的系统托盘图标的位置设置通知自定义表单的正上方或下方的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65747226/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com