<# .SYNOPSIS Background Lua injection into Roblox Studio via UI Automation .DESCRIPTION Injects Lua code into Roblox Studio's command bar using UIAutomation. Works when Studio is minimized, behind other windows, or in background. No window focus required. .PARAMETER Code The Lua code to inject, or a path to a .lua file .PARAMETER File Path to a .lua file to inject .EXAMPLE .\bg_inject.ps1 -Code 'print("hello")' .\bg_inject.ps1 -File C:\scripts\build_map.lua #> param( [string]$Code = '', [string]$File = '' ) Add-Type -AssemblyName UIAutomationClient Add-Type -AssemblyName UIAutomationTypes function Find-StudioCommandBar { $root = [System.Windows.Automation.AutomationElement]::RootElement # Find Studio window $windows = $root.FindAll( [System.Windows.Automation.TreeScope]::Children, [System.Windows.Automation.Condition]::TrueCondition ) $studio = $null foreach ($w in $windows) { try { $n = $w.Current.Name if ($n -like "*Roblox Studio*") { $studio = $w; break } } catch {} } if (-not $studio) { $procs = Get-Process -Name "RobloxStudioBeta" -ErrorAction SilentlyContinue if (-not $procs) { return $null } $pidCond = New-Object System.Windows.Automation.PropertyCondition( [System.Windows.Automation.AutomationElement]::ProcessIdProperty, $procs[0].Id ) $studio = $root.FindFirst([System.Windows.Automation.TreeScope]::Children, $pidCond) } if (-not $studio) { return $null } # Find command bar by AutomationId $autoIdCond = New-Object System.Windows.Automation.PropertyCondition( [System.Windows.Automation.AutomationElement]::AutomationIdProperty, "commandBarScriptEditor" ) $cmdBar = $studio.FindFirst( [System.Windows.Automation.TreeScope]::Descendants, $autoIdCond ) return $cmdBar } function Inject-LuaCode { param([string]$luaCode) $cmdBar = Find-StudioCommandBar if (-not $cmdBar) { Write-Error "ERROR: Roblox Studio command bar not found" return $false } try { $vp = $cmdBar.GetCurrentPattern([System.Windows.Automation.ValuePattern]::Pattern) $vp.SetValue($luaCode) # Send Enter via keyboard (requires brief focus) Add-Type -AssemblyName System.Windows.Forms $cmdBar.SetFocus() Start-Sleep -Milliseconds 100 [System.Windows.Forms.SendKeys]::SendWait("{ENTER}") return $true } catch { Write-Error "Injection failed: $_" return $false } } # Main if ($File -and (Test-Path $File)) { $Code = Get-Content $File -Raw } elseif ($Code -eq '') { # Read from stdin $Code = @($input) -join "`n" } if ($Code.Trim() -eq '') { Write-Error "No code provided. Use -Code or -File" exit 1 } $result = Inject-LuaCode -luaCode $Code if ($result) { Write-Output "OK: Code injected successfully" } else { exit 1 }