diff --git a/Core/Management/VideoPlayer.cs b/Core/Management/VideoPlayer.cs
index 07359fae..17170013 100644
--- a/Core/Management/VideoPlayer.cs
+++ b/Core/Management/VideoPlayer.cs
@@ -40,7 +40,7 @@ public void Launch(string url, string username){
 
                 if ((process = Process.Start(new ProcessStartInfo{
                     FileName = Path.Combine(Program.ProgramPath, "TweetDuck.Video.exe"),
-                    Arguments = $"{owner.Handle} {Config.VideoPlayerVolume} \"{url}\" \"{pipe.GenerateToken()}\"",
+                    Arguments = $"{owner.Handle} {(int)Math.Floor(100F*owner.GetDPIScale())} {Config.VideoPlayerVolume} \"{url}\" \"{pipe.GenerateToken()}\"",
                     UseShellExecute = false,
                     RedirectStandardOutput = true
                 })) != null){
diff --git a/video/FormPlayer.cs b/video/FormPlayer.cs
index 4335fd40..4ea8f546 100644
--- a/video/FormPlayer.cs
+++ b/video/FormPlayer.cs
@@ -13,6 +13,7 @@ sealed partial class FormPlayer : Form{
         protected override bool ShowWithoutActivation => true;
 
         private readonly IntPtr ownerHandle;
+        private readonly float ownerDpi;
         private readonly string videoUrl;
         private readonly DuplexPipe pipe;
         
@@ -23,10 +24,11 @@ sealed partial class FormPlayer : Form{
 
         private WindowsMediaPlayer Player => player.Ocx;
 
-        public FormPlayer(IntPtr handle, int volume, string url, string token){
+        public FormPlayer(IntPtr handle, int dpi, int volume, string url, string token){
             InitializeComponent();
 
             this.ownerHandle = handle;
+            this.ownerDpi = dpi / 100F;
             this.videoUrl = url;
             this.pipe = DuplexPipe.CreateClient(token);
             this.pipe.DataIn += pipe_DataIn;
@@ -78,6 +80,10 @@ public FormPlayer(IntPtr handle, int volume, string url, string token){
             Application.AddMessageFilter(new MessageFilter(this));
         }
 
+        private int DpiScaled(int value){
+            return (int)Math.Round(value*ownerDpi);
+        }
+
         // Events
 
         private void FormPlayer_Load(object sender, EventArgs e){
@@ -139,15 +145,20 @@ private void timerSync_Tick(object sender, EventArgs e){
                 int ownerHeight = rect.Bottom-rect.Top+1;
                 
                 // roughly matches MinimumSize for client bounds
-                const int minWidth = 334;
-                const int minHeight = 388;
+                int minWidth = DpiScaled(332);
+                int minHeight = DpiScaled(386);
 
-                int maxWidth = Math.Min(media.imageSourceWidth, ownerWidth*3/4);
-                int maxHeight = Math.Min(media.imageSourceHeight, ownerHeight*3/4);
+                if (NativeMethods.GetClientRect(ownerHandle, out NativeMethods.RECT clientSize)){
+                    minWidth = Math.Min(minWidth, clientSize.Right);
+                    minHeight = Math.Min(minHeight, clientSize.Bottom);
+                }
+
+                int maxWidth = Math.Min(DpiScaled(media.imageSourceWidth), ownerWidth*3/4);
+                int maxHeight = Math.Min(DpiScaled(media.imageSourceHeight), ownerHeight*3/4);
                 
                 bool isCursorInside = ClientRectangle.Contains(PointToClient(Cursor.Position));
                 
-                Size newSize = new Size(Math.Max(minWidth, maxWidth), Math.Max(minHeight, maxHeight));
+                Size newSize = new Size(Math.Max(minWidth+2, maxWidth), Math.Max(minHeight+2, maxHeight));
                 Point newLocation = new Point(ownerLeft+(ownerWidth-newSize.Width)/2, ownerTop+(ownerHeight-newSize.Height+SystemInformation.CaptionHeight)/2);
                 
                 if (ClientSize != newSize || Location != newLocation){
diff --git a/video/NativeMethods.cs b/video/NativeMethods.cs
index 3542d883..157b36fc 100644
--- a/video/NativeMethods.cs
+++ b/video/NativeMethods.cs
@@ -9,6 +9,10 @@ static class NativeMethods{
         [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
 
+        [DllImport("user32.dll")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);
+
         [DllImport("user32.dll")]
         private static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
 
diff --git a/video/Program.cs b/video/Program.cs
index 0dbff2b9..96ed1dc6 100644
--- a/video/Program.cs
+++ b/video/Program.cs
@@ -25,21 +25,23 @@ private static int Main(string[] args){
             CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
 
             IntPtr ownerHandle;
+            int ownerDpi;
             int defaultVolume;
             string videoUrl;
             string pipeToken;
 
             try{
                 ownerHandle = new IntPtr(int.Parse(args[0], NumberStyles.Integer));
-                defaultVolume = int.Parse(args[1], NumberStyles.Integer);
-                videoUrl = new Uri(args[2], UriKind.Absolute).AbsoluteUri;
-                pipeToken = args[3];
+                ownerDpi = int.Parse(args[1], NumberStyles.Integer);
+                defaultVolume = int.Parse(args[2], NumberStyles.Integer);
+                videoUrl = new Uri(args[3], UriKind.Absolute).AbsoluteUri;
+                pipeToken = args[4];
             }catch{
                 return CODE_INVALID_ARGS;
             }
 
             try{
-                Application.Run(new FormPlayer(ownerHandle, defaultVolume, videoUrl, pipeToken));
+                Application.Run(new FormPlayer(ownerHandle, ownerDpi, defaultVolume, videoUrl, pipeToken));
             }catch(Exception e){
                 Console.Out.WriteLine(e);
                 return CODE_LAUNCH_FAIL;