Processing Ajax...
Save 25% on our desktop apps during our Black Friday/Cyber Monday sale!Save 25% on our desktop apps during our Black Friday/Cyber Monday sale, including DisplayFusion, ClipboardFusion, FileSeek, LogFusion, TrayStatus, and VoiceBot!Save 25% on our desktop apps during our Black Friday/Cyber Monday sale!

Title
Close Dialog

Message

Confirm
Close Dialog

Confirm
Close Dialog

Centre Window Over Mouse Cursor

Description
This function will centre the mouse over the mouse cursor, only if the mouse cursor is on a different monitor than the window's current location. Note that the window moves to the target monitor first, before moving again to its final location. I had to use this hack to make it work correctly when moving to monitors of different scaling levels. If all of your monitors are the same scaling level, you can comment out line 22.
Language
C#.net
Minimum Version
Created By
Keith Lammers (BFS)
Contributors
-
Date Created
Jan 24, 2019
Date Last Modified
Jan 24, 2019

Scripted Function (Macro) Code

using System;
using System.Drawing;

// The 'windowHandle' parameter will contain the window handle for the:
//   - Active window when run by hotkey
//   - Trigger target when run by a Trigger rule
//   - TitleBar Button owner when run by a TitleBar Button
//   - Jump List owner when run from a Taskbar Jump List
//   - Currently focused window if none of these match
public static class DisplayFusionFunction
{
	public static void Run(IntPtr windowHandle)
	{
        // Get the mouse co-ordinates and the current monitor ID
		int mouseX = BFS.Input.GetMousePositionX();
		int mouseY = BFS.Input.GetMousePositionY();
		uint currentMonitor = BFS.Monitor.GetMonitorIDByXY(mouseX, mouseY);

        // If the window isn't on the current monitor, move it
        // If it is, exit the script
        if (BFS.Monitor.GetMonitorIDByWindow(windowHandle) != currentMonitor)
            BFS.Window.MoveToMonitor(currentMonitor, windowHandle);
        else
            return;
	
		// Get the target monitor work area
		Rectangle monitorWorkArea = BFS.Monitor.GetMonitorWorkAreaByMouseCursor();
		
		// Get the bounds of the window
		Rectangle windowBounds = BFS.Window.GetBounds(windowHandle);
		
		// Calculate the new X,Y locations
		int windowTargetX = mouseX - (windowBounds.Width / 2);
		int windowTargetY = mouseY - (windowBounds.Height / 2);
		
		// Check if the window will fit on the monitor at the new location, if not, change the target X,Y values to keep it in the monitor
		int windowTargetWidth = windowBounds.Width;
		int windowTargetHeight = windowBounds.Height;
		
		if ((windowTargetX + windowBounds.Width) > (monitorWorkArea.X + monitorWorkArea.Width))
		{
            windowTargetX = (monitorWorkArea.X + monitorWorkArea.Width) - windowBounds.Width;
		}
		else if (windowTargetX < monitorWorkArea.X)
		{
            windowTargetX = monitorWorkArea.X;
		}
		
		if ((windowTargetY + windowBounds.Height) > (monitorWorkArea.Y + monitorWorkArea.Height))
		{
            windowTargetY = (monitorWorkArea.Y + monitorWorkArea.Height) - windowBounds.Height;
		}
		else if (windowTargetY < monitorWorkArea.Y)
		{
            windowTargetY = monitorWorkArea.Y;
		}
		
		BFS.Window.SetSizeAndLocation(windowHandle, windowTargetX, windowTargetY, windowTargetWidth, windowTargetHeight);
	}
}