Processing Ajax...

Title

Message

Confirm

Confirm

Confirm

Confirm

Are you sure you want to delete this item?

Confirm

Are you sure you want to delete this item?

Move New Outlook Message Windows to Monitor 3

Description
This is a script that loops in the background, looking for new Outlook message windows that need to be moved to monitor 3. 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
Feb 22, 2022
Date Last Modified
Feb 22, 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 monitor you want the windows to move to
        uint targetMonitor = 3;
        
        // 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)))
                {
                    BFS.Window.MoveToMonitorMaximized(targetMonitor, window);
                    BFS.General.LogText("MoveNewOutlookWindows: Window moved to monitor " + targetMonitor.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;
	}
}