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

Move New Outlook Message Windows to Current Monitor

Description
This is a script that loops in the background, looking for new Outlook message windows that need to be moved to the monitor that the mouse cursor is on. This is a workaround because Window Created Trigger rules don't work with Outlook, due to the fact that they re-use window handles from closed windows. You can change the target monitor on line 10 (for split monitors, use a 0 instead of a period, like this: 202).
Language
C#.net
Minimum Version
Created By
Keith Lammers (BFS)
Contributors
-
Date Created
Oct 7, 2022
Date Last Modified
Oct 7, 2022

Scripted Function (Macro) Code

using System;
using System.Drawing;
using System.Collections.Generic;

public static class DisplayFusionFunction
{
	public static void Run(IntPtr windowHandle)
	{
        // Set the amount of time (in milliseconds) between loops (lowering this time will increase CPU usage)
        uint waitTime = 1000;
        
        // Script setup stuff
        var previousList = new List<IntPtr>();
        var currentList = new List<IntPtr>();

		while (true) // Loop forever (exit the script via its icon in the system tray)
		{
            // Clear the current list of windows
            currentList.Clear();
            BFS.General.LogText("MoveNewOutlookWindows: Current list cleared: " + currentList.Count.ToString());
            
            // Add the current Outlook or Word window handles to a list
            currentList = GetOpenOutlookWindows();
            
            // Compare the list from the previous run to the list from the current run and move any new ones
            foreach (IntPtr window in currentList)
            {
                if (!(previousList.Contains(window)))
                {
                    // Get the current monitor
					uint currentMonitor = BFS.Monitor.GetMonitorIDByXY(BFS.Input.GetMousePositionX(),BFS.Input.GetMousePositionY());
					// Move the window to the current monitor
					BFS.Window.MoveToMonitorMaximized(currentMonitor, window);
					
                    BFS.General.LogText("MoveNewOutlookWindows: Window moved to monitor " + currentMonitor.ToString() + ": " + window.ToString() + " " + BFS.Window.GetText(window));
                    previousList.Add(window);
                    BFS.General.LogText("MoveNewOutlookWindows: Window added to previous list: " + window.ToString() + " " + previousList.Count.ToString());
                }
            }
            
            // If the previous list has windows that aren't in the new list, mark them for deletion
            var closedWindows = new List<IntPtr>();
            foreach (IntPtr window in previousList)
            {
                if (!(currentList.Contains(window)))
                {
                    // Re-check the current list for Outlook windows that were quickly removed/re-added
                    var refreshedList = new List<IntPtr>();
                    refreshedList = GetOpenOutlookWindows();
                    if (!(refreshedList.Contains(window)))
                    {                    
                        closedWindows.Add(window);
                        BFS.General.LogText("MoveNewOutlookWindows: Window marked for deletion: " + window.ToString());
                    }
                }
            }
            
            // Delete the closed windows from the previous list
            foreach (IntPtr window in closedWindows)
            {
                previousList.Remove(window);
                BFS.General.LogText("MoveNewOutlookWindows: Window deleted: " + window.ToString()  + " " + previousList.Count.ToString());
            }
            
            // Wait before looping to prevent the CPU from running up
            BFS.General.ThreadWait(waitTime);
		}
	}
	
	private static List<IntPtr> GetOpenOutlookWindows()
	{
        var windowList = new List<IntPtr>();
        foreach (IntPtr window in BFS.Window.GetVisibleAndMinimizedWindowHandles())
        {
            if ((BFS.Application.GetMainFileByWindow(window).ToLower().Contains("outlook.exe") && BFS.Window.GetText(window).Contains("Message (")))
            {
                windowList.Add(window);
                BFS.General.LogText("MoveNewOutlookWindows: Window added to current list: " + window.ToString() + " " + windowList.Count.ToString());
            }
        }
        return windowList;
	}
}