diff --git a/src/platform/win/drop_target.rs b/src/platform/win/drop_target.rs index 5d79e6b2..489a6aec 100644 --- a/src/platform/win/drop_target.rs +++ b/src/platform/win/drop_target.rs @@ -10,7 +10,12 @@ use windows::Win32::System::Ole::*; use windows::Win32::System::SystemServices::MODIFIERKEYS_FLAGS; use windows_core::Ref; use windows_sys::Win32::{ - Foundation::POINT, Graphics::Gdi::ScreenToClient, UI::Shell::DragQueryFileW, + Foundation::POINT, + Graphics::Gdi::ScreenToClient, + UI::{ + HiDpi::{LogicalToPhysicalPointForPerMonitorDPI, PhysicalToLogicalPointForPerMonitorDPI}, + Shell::DragQueryFileW, + }, }; use crate::{DropData, DropEffect, Event, EventStatus, MouseEvent, PhyPoint, Point}; @@ -63,7 +68,19 @@ impl DropTarget { return; }; let mut pt = POINT { x: pt.x, y: pt.y }; - unsafe { ScreenToClient(window_state.hwnd, &mut pt as *mut POINT) }; + + // ScreenToClient isn't DPI-aware + if unsafe { PhysicalToLogicalPointForPerMonitorDPI(null_mut(), &mut pt) == 0 } { + return; + } + + if unsafe { ScreenToClient(window_state.hwnd, &mut pt) == 0 } { + return; + } + + if unsafe { LogicalToPhysicalPointForPerMonitorDPI(null_mut(), &mut pt) == 0 } { + return; + } let phy_point = PhyPoint::new(pt.x, pt.y); self.drag_position.set(phy_point.to_logical(&window_state.window_info())); }