diff --git a/Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/Interop/TrayInfo.cs b/Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/Interop/TrayInfo.cs
index 468a833..1516e1c 100644
--- a/Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/Interop/TrayInfo.cs
+++ b/Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/Interop/TrayInfo.cs
@@ -3,6 +3,7 @@
using System;
using System.Drawing;
using System.Runtime.InteropServices;
+using System.Windows;
namespace Hardcodet.Wpf.TaskbarNotification.Interop
@@ -18,6 +19,7 @@ namespace Hardcodet.Wpf.TaskbarNotification.Interop
/// Tray coordinates.
public static Point GetTrayLocation()
{
+ int space = 2;
var info = new AppBarInfo();
info.GetSystemTaskBarPosition();
@@ -26,31 +28,42 @@ namespace Hardcodet.Wpf.TaskbarNotification.Interop
int x = 0, y = 0;
if (info.Edge == AppBarInfo.ScreenEdge.Left)
{
- x = rcWorkArea.Left + 2;
+ x = rcWorkArea.Right + space;
y = rcWorkArea.Bottom;
}
else if (info.Edge == AppBarInfo.ScreenEdge.Bottom)
{
x = rcWorkArea.Right;
- y = rcWorkArea.Bottom;
+ y = rcWorkArea.Bottom - rcWorkArea.Height - space;
}
else if (info.Edge == AppBarInfo.ScreenEdge.Top)
{
x = rcWorkArea.Right;
- y = rcWorkArea.Top;
+ y = rcWorkArea.Top + rcWorkArea.Height + space;
}
else if (info.Edge == AppBarInfo.ScreenEdge.Right)
{
- x = rcWorkArea.Right;
+ x = rcWorkArea.Right - rcWorkArea.Width - space;
y = rcWorkArea.Bottom;
}
- return new Point {X = x, Y = y};
+ return GetDeviceCoordinates(new Point {X = x, Y = y});
+ }
+
+ ///
+ /// Recalculates OS coordinates in order to support WPFs coordinate
+ /// system if OS scaling (DPIs) is not 100%.
+ ///
+ ///
+ ///
+ public static Point GetDeviceCoordinates(Point point)
+ {
+ return new Point() { X = (int)(point.X / SystemInfo.DpiXFactor), Y = (int)(point.Y / SystemInfo.DpiYFactor) };
}
}
- internal class AppBarInfo
+ public class AppBarInfo
{
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
@@ -80,27 +93,15 @@ namespace Hardcodet.Wpf.TaskbarNotification.Interop
get { return (ScreenEdge) m_data.uEdge; }
}
-
public Rectangle WorkArea
{
- get
- {
- Int32 bResult = 0;
- var rc = new RECT();
- IntPtr rawRect = Marshal.AllocHGlobal(Marshal.SizeOf(rc));
- bResult = SystemParametersInfo(SPI_GETWORKAREA, 0, rawRect, 0);
- rc = (RECT) Marshal.PtrToStructure(rawRect, rc.GetType());
-
- if (bResult == 1)
- {
- Marshal.FreeHGlobal(rawRect);
- return new Rectangle(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
- }
-
- return new Rectangle(0, 0, 0, 0);
- }
+ get { return GetRectangle(m_data.rc); }
}
+ private Rectangle GetRectangle(RECT rc)
+ {
+ return new Rectangle(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
+ }
public void GetPosition(string strClassName, string strWindowName)
{
diff --git a/Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/TaskbarIcon.cs b/Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/TaskbarIcon.cs
index e59a5d5..26af691 100644
--- a/Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/TaskbarIcon.cs
+++ b/Hardcodet.NotifyIcon.Wpf/Source/NotifyIconWpf/TaskbarIcon.cs
@@ -145,6 +145,14 @@ namespace Hardcodet.Wpf.TaskbarNotification
#endregion
#region Custom Balloons
+ public delegate Point GetCustomPopupPosition();
+
+ public GetCustomPopupPosition CustomPopupPosition;
+
+ public Point GetPopupTrayPosition()
+ {
+ return TrayInfo.GetTrayLocation();
+ }
///
/// Shows a custom control as a tooltip in the tray location.
@@ -217,8 +225,8 @@ namespace Hardcodet.Wpf.TaskbarNotification
popup.Placement = PlacementMode.AbsolutePoint;
popup.StaysOpen = true;
- Point position = TrayInfo.GetTrayLocation();
- position = GetDeviceCoordinates(position);
+
+ Point position = this.CustomPopupPosition != null ? this.CustomPopupPosition() : this.GetPopupTrayPosition();
popup.HorizontalOffset = position.X - 1;
popup.VerticalOffset = position.Y - 1;
@@ -394,7 +402,7 @@ namespace Hardcodet.Wpf.TaskbarNotification
WinApi.GetCursorPos(ref cursorPosition);
}
- cursorPosition = GetDeviceCoordinates(cursorPosition);
+ cursorPosition = TrayInfo.GetDeviceCoordinates(cursorPosition);
bool isLeftClickCommandInvoked = false;
@@ -954,16 +962,7 @@ namespace Hardcodet.Wpf.TaskbarNotification
#endregion
- ///
- /// Recalculates OS coordinates in order to support WPFs coordinate
- /// system if OS scaling (DPIs) is not 100%.
- ///
- ///
- ///
- private Point GetDeviceCoordinates(Point point)
- {
- return new Point() { X = (int)(point.X / SystemInfo.DpiXFactor), Y = (int)(point.Y / SystemInfo.DpiYFactor) };
- }
+
#region Dispose / Exit