Положение формы над нажатием на иконку уведомления - PullRequest
4 голосов
/ 03 сентября 2011

Есть ли способ разместить форму чуть выше щелкающего значка уведомления в Windows 7 и Windows Vista?

Ответы [ 2 ]

5 голосов
/ 07 июля 2014

Вот более простой способ.

Вы можете получить X, Y позицию мыши, когда происходит событие OnClick.Вы также можете получить положение панели задач с помощью некоторых проверок из этих объектов Screen.PrimaryScreen.Bounds, Screen.PrimaryScreen.WorkingArea.

    private void OnTrayClick(object sender, EventArgs e)
    {
        _frmMain.Left = Cursor.Position.X;
        _frmMain.Top = Screen.PrimaryScreen.WorkingArea.Bottom -_frmMain.Height;
        _frmMain.Show();        
    }
1 голос
/ 03 сентября 2011

Относительно вашего комментария: «Как я могу узнать, как расположена панель задач?»

Ознакомьтесь со следующей статьей, которая содержит класс, который предоставляет метод для извлечения структуры прямоугольника для лотка: [c #] NotifyIcon - Detect MouseOut

Используя этот класс, вы можете получить Прямоугольную структуру для лотка следующим образом:

Rectangle trayRectangle = WinAPI.GetTrayRectangle();

, которая предоставит вам верхнюю, левую, правую и нижнюю координаты лотка, а также его ширину и высоту.

Я включил класс ниже:

using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.ComponentModel;

public class WinAPI
{
    public struct RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;

        public override string ToString()
        {
            return "(" + left + ", " + top + ") --> (" + right + ", " + bottom + ")";
        }
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindow(string strClassName, string strWindowName);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);


    public static IntPtr GetTrayHandle()
    {
        IntPtr taskBarHandle = WinAPI.FindWindow("Shell_TrayWnd", null);
        if (!taskBarHandle.Equals(IntPtr.Zero))
        {
            return WinAPI.FindWindowEx(taskBarHandle, IntPtr.Zero, "TrayNotifyWnd", IntPtr.Zero);
        }
        return IntPtr.Zero;
    }

    public static Rectangle GetTrayRectangle()
    {
        WinAPI.RECT rect;
        WinAPI.GetWindowRect(WinAPI.GetTrayHandle(), out rect);
        return new Rectangle(new Point(rect.left, rect.top), new Size((rect.right - rect.left) + 1, (rect.bottom - rect.top) + 1));
    }
}

Надеюсь, это поможет.

...