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