Приложение без иконки окна трея 2
Это продолжение приложения Windowless иконки в трее
Я наконец-то получил то, что хочу, с этим значком на панели задач: 1. Значок в области уведомлений 2. Нажмите на открытые окна в области уведомлений 3. Нажмите в окне на панели задач и откройте главное окно
Единственная проблема заключается в том, что я хочу, чтобы маленькое промежуточное окно начиналось далеко от лотка. Я хотел бы, чтобы он был рядом со значком в трее, который запустил его, как показано на следующем рисунке.
Код для иконки в трее (запускается из главного окна):
var tim = new TrayIconMenuWindow.TrayIconMenuWindow();
tim.WindowStartupLocation = WindowStartupLocation.CenterOwner;<------
tim.ShowDialog();
this.Visibility = Visibility.Visible;
Я перепробовал все места запуска, но ни один не помог. Thanx
2 ответа
Если вы хотите окно в правом нижнем углу экрана, вы можете использовать что-то вроде этого:
Rectangle workingArea = Screen.GetWorkingArea(this);
this.Location = new Point(workingArea.Right - Size.Width,
workingArea.Bottom - Size.Height);
редактировать
Я только что понял, что вы работаете в WPF. Если это так, используйте этот код:
var screenSize = System.Windows.SystemParameters.WorkArea;
this.Left = screenSize.Right - this.Width;
this.Top = screenSize.Bottom - this.Height;
Если вы ожидаете, что окно будет отображаться рядом с NotifyIcon, как ContextMenuStrip, связанный с NotifyIcon, вам потребуется получить точное местоположение NotifyIcon на экране, а затем отрегулировать местоположение окна. Вы можете найти пример в:
Это довольно долго, но код для определения местоположения NotifyIcon может быть короче, как это:
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Forms;
public static class NotifyIconRect
{
#region Win32
[DllImport("Shell32.dll", SetLastError = true)]
private static extern int Shell_NotifyIconGetRect(
[In] ref NOTIFYICONIDENTIFIER identifier,
out RECT iconLocation);
[StructLayout(LayoutKind.Sequential)]
private struct NOTIFYICONIDENTIFIER
{
public uint cbSize;
public IntPtr hWnd;
public uint uID;
public GUID guidItem; // System.Guid can be used.
}
[StructLayout(LayoutKind.Sequential)]
private struct GUID
{
public uint Data1;
public ushort Data2;
public ushort Data3;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] Data4;
}
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
public static implicit operator Rect(RECT rect)
{
if ((rect.right - rect.left < 0) || (rect.bottom - rect.top < 0))
return Rect.Empty;
return new Rect(
rect.left,
rect.top,
rect.right - rect.left,
rect.bottom - rect.top);
}
}
#endregion
public static Rect GetNotifyIconRect(NotifyIcon notifyIcon)
{
NOTIFYICONIDENTIFIER identifier;
if (!TryGetNotifyIconIdentifier(notifyIcon, out identifier))
return Rect.Empty;
RECT iconLocation;
int result = Shell_NotifyIconGetRect(ref identifier, out iconLocation);
switch (result)
{
case 0: // 0 means S_OK.
case 1: // 1 means S_FALSE.
return iconLocation;
default:
return Rect.Empty;
}
}
private static bool TryGetNotifyIconIdentifier(NotifyIcon notifyIcon, out NOTIFYICONIDENTIFIER identifier)
{
identifier = new NOTIFYICONIDENTIFIER { cbSize = (uint)Marshal.SizeOf(typeof(NOTIFYICONIDENTIFIER)) };
int id;
if (!TryGetFieldValue(notifyIcon, "id", out id))
return false;
NativeWindow window;
if (!TryGetFieldValue(notifyIcon, "window", out window))
return false;
identifier.uID = (uint)id;
identifier.hWnd = window.Handle;
return true;
}
private static bool TryGetFieldValue<T>(object instance, string fieldName, out T fieldValue)
{
fieldValue = default(T);
var fieldInfo = instance.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldInfo == null)
return false;
var value = fieldInfo.GetValue(instance);
if (!(value is T))
return false;
fieldValue = (T)value;
return true;
}
}
Этот код немного сложен, потому что он получает значения приватных полей NotifyIcon путем отражения, но я не знаю другого способа выполнить эту операцию.