Появление формы около иконки в таскбаре.
От: coddy  
Дата: 10.10.09 05:26
Оценка:
Собственно необходимо при даблклике на иконке приложения в трее показать окно около иконки.

Пытался переловить координаты курсора мыши и показать окно около координат:
[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
Re: Появление формы около иконки в таскбаре.
От: Caracrist https://1pwd.org/
Дата: 11.10.09 07:55
Оценка: 3 (1)
Здравствуйте, 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>Вроде работает. Но если необходимо покать окно программы по событию оно всплывает не в том месте.

ответа у меня нет, только вопрос
что будет если панелька сбоку или вверху экрана?
~~~~~
~lol~~
~~~ Single Password Solution
Re: Появление формы около иконки в таскбаре.
От: Caracrist https://1pwd.org/
Дата: 11.10.09 08:16
Оценка: 3 (1)
Здравствуйте, coddy, Вы писали:

C>Собственно необходимо при даблклике на иконке приложения в трее показать окно около иконки.


C>Есть идеи как правильно реализовать этот функционал?


система уже знает куда выводить окно, эту информацию можно найти в:

notifyIcon1.ContextMenuStrip.DisplayRectangle
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: Появление формы около иконки в таскбаре.
От: coddy  
Дата: 11.10.09 09:44
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, coddy, Вы писали:


C>>Собственно необходимо при даблклике на иконке приложения в трее показать окно около иконки.


C>>Есть идеи как правильно реализовать этот функционал?


C>система уже знает куда выводить окно, эту информацию можно найти в:


C>
C>notifyIcon1.ContextMenuStrip.DisplayRectangle
C>


И как этим воспользоваться?
Re[3]: Появление формы около иконки в таскбаре.
От: Caracrist https://1pwd.org/
Дата: 11.10.09 12:17
Оценка: 3 (1)
Здравствуйте, 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;
        }

Взято от сюда
~~~~~
~lol~~
~~~ Single Password Solution
Re[4]: Появление формы около иконки в таскбаре.
От: Caracrist https://1pwd.org/
Дата: 11.10.09 12:56
Оценка:
Здравствуйте, 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;
}
~~~~~
~lol~~
~~~ Single Password Solution
Re[4]: Появление формы около иконки в таскбаре.
От: coddy  
Дата: 11.10.09 14:39
Оценка:
Спасибо, попробую.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.