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 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;
	}
}