using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; using System.Text; using HWND = System.IntPtr; namespace InABox.WPF { /// Contains functionality to get all the open windows. public static class OpenWindowGetter { [DllImport("USER32.DLL")] private static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam); [DllImport("USER32.DLL")] private static extern int GetWindowText(HWND hWnd, StringBuilder lpString, int nMaxCount); [DllImport("USER32.DLL")] private static extern int GetWindowTextLength(HWND hWnd); [DllImport("USER32.DLL")] private static extern bool IsWindowVisible(HWND hWnd); [DllImport("USER32.DLL")] private static extern IntPtr GetShellWindow(); [DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); [DllImport("user32")] private static extern uint GetWindowThreadProcessId(HWND hWnd, out int lpdwProcessId); /// Returns a dictionary that contains the handle and title of all the open windows. /// A dictionary that contains the handle and title of all the open windows. public static IDictionary GetOpenWindows() { var shellWindow = GetShellWindow(); var windows = new Dictionary(); EnumWindows(delegate(HWND hWnd, int lParam) { if (hWnd == shellWindow) return true; if (!IsWindowVisible(hWnd)) return true; var length = GetWindowTextLength(hWnd); if (length == 0) return true; var builder = new StringBuilder(length); GetWindowText(hWnd, builder, length + 1); windows[hWnd] = builder.ToString(); return true; }, 0); return windows; } public static string GetActiveWindowTitle() { const int nChars = 256; var Buff = new StringBuilder(nChars); var handle = GetForegroundWindow(); if (GetWindowText(handle, Buff, nChars) > 0) return Buff.ToString(); return null; } public static string GetActiveWindowProcess() { var handle = GetForegroundWindow(); GetWindowThreadProcessId(handle, out var pid); var p = Process.GetProcessById(pid); return p?.ProcessName; } private delegate bool EnumWindowsProc(HWND hWnd, int lParam); } }