Положение формы над нажатием на иконку уведомления
Есть ли способ разместить форму прямо над значком уведомления в Windows 7 и Windows Vista?
2 ответа
Что касается вашего комментария: "как я могу узнать, как расположена панель задач?"
Ознакомьтесь со следующей статьей, в которой содержится класс, который предоставляет метод для извлечения прямоугольной структуры для лотка: [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));
}
}
Надеюсь это поможет.
Вот более простой способ.
Вы можете получить 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();
}