open System open System.Diagnostics open System.Runtime.InteropServices open System.Text [] extern IntPtr FindWindow(string lpClassName, string lpWindowName) [] extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow) [] extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount) [] extern uint GetWindowThreadProcessId(IntPtr hWnd, uint& lpdwProcessId) let getClassName (hWnd: IntPtr) = let sb = StringBuilder(256) if GetClassName(hWnd, sb, sb.Capacity) > 0 then sb.ToString() else "" let getProcessIdFromWindow (hWnd: IntPtr) = let mutable processId = 0u GetWindowThreadProcessId(hWnd, &processId) |> ignore int processId let killTuneBlade () = try let processes = Process.GetProcessesByName("TuneBlade") for proc in processes do printfn "Killing TuneBlade process (PID: %d)..." proc.Id proc.Kill() proc.WaitForExit(5000) |> ignore processes.Length > 0 with | ex -> printfn "Error killing TuneBlade: %s" ex.Message false let startTuneBlade (exePath: string) = try printfn "Starting TuneBlade from: %s" exePath Process.Start(exePath) |> ignore true with | ex -> printfn "Error starting TuneBlade: %s" ex.Message false [] let main _ = let tuneBladeExe = @"C:\Program Files (x86)\TuneBlade\TuneBlade\TuneBlade.exe" printfn "TuneBlade Suppressor" printfn "Monitoring for errors and restarting from: %s" tuneBladeExe printfn "Press Ctrl+C to exit" printfn "" while true do let hwnd = FindWindow(null, "TuneBlade") if hwnd <> IntPtr.Zero then let cls = getClassName hwnd if cls = "#32770" then printfn "TuneBlade error dialog detected - restarting application..." if killTuneBlade() then System.Threading.Thread.Sleep(1000) startTuneBlade tuneBladeExe |> ignore System.Threading.Thread.Sleep(3000) let child = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "#32770", "TuneBlade") if child <> IntPtr.Zero then printfn "TuneBlade dialog window detected — restarting application..." if killTuneBlade() then System.Threading.Thread.Sleep(1000) startTuneBlade tuneBladeExe |> ignore System.Threading.Thread.Sleep(3000) System.Threading.Thread.Sleep(2000) 0