Собственно необходимо при даблклике на иконке приложения в трее показать окно около иконки.
Пытался переловить координаты курсора мыши и показать окно около координат:
[DllImport("user32.dll")]
static extern bool GetCursorPos(ref Point lpPoint);
...
Point Pnt = new Point();
GetCursorPos(ref Pnt);
this.Top = Pnt.Y - this.Height-50;
this.Left = Pnt.X - this.Width - 50;
Вроде работает. Но если необходимо покать окно программы по событию оно всплывает не в том месте.
Есть идеи как правильно реализовать этот функционал?
12.10.09 00:03: Перенесено модератором из '.NET' — AndrewVK
Здравствуйте, coddy, Вы писали:
C>Пытался переловить координаты курсора мыши и показать окно около координат:
C>C>[DllImport("user32.dll")]
C>static extern bool GetCursorPos(ref Point lpPoint);
C>...
C>Point Pnt = new Point();
C>GetCursorPos(ref Pnt);
C>this.Top = Pnt.Y - this.Height-50;
C>this.Left = Pnt.X - this.Width - 50;
C>
C>Вроде работает. Но если необходимо покать окно программы по событию оно всплывает не в том месте.
ответа у меня нет, только вопрос

что будет если панелька сбоку или вверху экрана?
Здравствуйте, coddy, Вы писали:
C>Собственно необходимо при даблклике на иконке приложения в трее показать окно около иконки.
C>Есть идеи как правильно реализовать этот функционал?
система уже знает куда выводить окно, эту информацию можно найти в:
notifyIcon1.ContextMenuStrip.DisplayRectangle
Здравствуйте, Caracrist, Вы писали:
C>Здравствуйте, coddy, Вы писали:
C>>Собственно необходимо при даблклике на иконке приложения в трее показать окно около иконки.
C>>Есть идеи как правильно реализовать этот функционал?
C>система уже знает куда выводить окно, эту информацию можно найти в:
C>C>notifyIcon1.ContextMenuStrip.DisplayRectangle
C>
И как этим воспользоваться?
Здравствуйте, coddy, Вы писали:
C>И как этим воспользоваться?
Я тут "на досуге" изучил то что вам нужно... В общем отталкиваться придётся от позиции Systray без какой либо связи с иконкой (она может быть спрятана в данный момент) и позиция systray изменится в процессе работы.
надеюсь вот это поможет:
[DllImport("User32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll")]
private static extern IntPtr FindWindowEx(IntPtr hWnd1, IntPtr hWnd2, string lpsz1, string lpsz2);
[DllImport("User32.dll")]
private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
private Rectangle GetSystemTrayLocation()
{
//Get the location of the system tray
RECT rect = new RECT();
Rectangle retval = Rectangle.Empty;
IntPtr hTaskbarHandle = FindWindow("Shell_TrayWnd", null);
if (hTaskbarHandle != IntPtr.Zero)
{
IntPtr hSystemTray = FindWindowEx(hTaskbarHandle, IntPtr.Zero, "TrayNotifyWnd", null);
if (hSystemTray != IntPtr.Zero)
{
GetWindowRect(hSystemTray, ref rect);
retval = Rectangle.FromLTRB(rect.left, rect.top, rect.right, rect.bottom);
}
}
return retval;
}
Взято от сюда
Здравствуйте, Caracrist, Вы писали:
C>Здравствуйте, coddy, Вы писали:
C>>И как этим воспользоваться?
C>Я тут "на досуге" изучил то что вам нужно... В общем отталкиваться придётся от позиции Systray без какой либо связи с иконкой (она может быть спрятана в данный момент) и позиция systray изменится в процессе работы.
C>надеюсь вот это поможет:
C>C> [DllImport("User32.dll")]
C> private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
C> [DllImport("User32.dll")]
C> private static extern IntPtr FindWindowEx(IntPtr hWnd1, IntPtr hWnd2, string lpsz1, string lpsz2);
C> [DllImport("User32.dll")]
C> private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
C> private struct RECT
C> {
C> public int left;
C> public int top;
C> public int right;
C> public int bottom;
C> }
C> private Rectangle GetSystemTrayLocation()
C> {
C> //Get the location of the system tray
C> RECT rect = new RECT();
C> Rectangle retval = Rectangle.Empty;
C> IntPtr hTaskbarHandle = FindWindow("Shell_TrayWnd", null);
C> if (hTaskbarHandle != IntPtr.Zero)
C> {
C> IntPtr hSystemTray = FindWindowEx(hTaskbarHandle, IntPtr.Zero, "TrayNotifyWnd", null);
C> if (hSystemTray != IntPtr.Zero)
C> {
C> GetWindowRect(hSystemTray, ref rect);
C> retval = Rectangle.FromLTRB(rect.left, rect.top, rect.right, rect.bottom);
C> }
C> }
C> return retval;
C> }
C>
C>Взято от сюда
MyForm f2 ;
void ShowMyForm()
{
Rectangle rec = GetSystemTrayLocation();
if (SystemInformation.PrimaryMonitorSize.Height / 2 > rec.Top)
f2.Top = rec.Top + rec.Height;
else
f2.Top = rec.Top - f2.Height;
if (SystemInformation.PrimaryMonitorSize.Width / 2 > rec.Left)
f2.Left = rec.Left + rec.Width;
else
f2.Left = rec.Left - f2.Width;
f2.Visible = true;
}