mirror of
https://github.com/ckaczor/wpf-notifyicon.git
synced 2026-02-16 18:49:54 -05:00
Fix GetDeviceCoordinates. In some cases PresentationSource.FromVisual(this) may return null.
This commit is contained in:
@@ -0,0 +1,39 @@
|
|||||||
|
using System;
|
||||||
|
using System.Windows.Interop;
|
||||||
|
|
||||||
|
namespace Hardcodet.Wpf.TaskbarNotification.Interop
|
||||||
|
{
|
||||||
|
public static class SystemInfo
|
||||||
|
{
|
||||||
|
private static Tuple<double, double> dpiFactors;
|
||||||
|
|
||||||
|
private static Tuple<double, double> DpiFactors
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (dpiFactors == null)
|
||||||
|
using (var source = new HwndSource(new HwndSourceParameters()))
|
||||||
|
dpiFactors = Tuple.Create(source.CompositionTarget.TransformToDevice.M11, source.CompositionTarget.TransformToDevice.M22);
|
||||||
|
return dpiFactors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double DpiXFactor
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var factors = DpiFactors;
|
||||||
|
return factors != null ? factors.Item1 : 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double DpiYFactor
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var factors = DpiFactors;
|
||||||
|
return factors != null ? factors.Item2 : 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -47,6 +47,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="BalloonIcon.cs" />
|
<Compile Include="BalloonIcon.cs" />
|
||||||
|
<Compile Include="Interop\SystemInfo.cs" />
|
||||||
<Compile Include="Interop\TrayInfo.cs">
|
<Compile Include="Interop\TrayInfo.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
|||||||
@@ -962,25 +962,7 @@ namespace Hardcodet.Wpf.TaskbarNotification
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private Point GetDeviceCoordinates(Point point)
|
private Point GetDeviceCoordinates(Point point)
|
||||||
{
|
{
|
||||||
if (double.IsNaN(scalingFactor))
|
return new Point() { X = (int)(point.X / SystemInfo.DpiXFactor), Y = (int)(point.Y / SystemInfo.DpiYFactor) };
|
||||||
{
|
|
||||||
//calculate scaling factor in order to support non-standard DPIs
|
|
||||||
var presentationSource = PresentationSource.FromVisual(this);
|
|
||||||
if (presentationSource == null)
|
|
||||||
{
|
|
||||||
scalingFactor = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var transform = presentationSource.CompositionTarget.TransformToDevice;
|
|
||||||
scalingFactor = 1/transform.M11;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//on standard DPI settings, just return the point
|
|
||||||
if (scalingFactor == 1.0) return point;
|
|
||||||
|
|
||||||
return new Point() {X = (int) (point.X*scalingFactor), Y = (int) (point.Y*scalingFactor)};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Dispose / Exit
|
#region Dispose / Exit
|
||||||
|
|||||||
Reference in New Issue
Block a user