Skip to content

Instantly share code, notes, and snippets.

@igoravl
Created July 8, 2024 03:04
Show Gist options
  • Save igoravl/21a2e148d29dbe4e81782b3b781f0824 to your computer and use it in GitHub Desktop.
Save igoravl/21a2e148d29dbe4e81782b3b781f0824 to your computer and use it in GitHub Desktop.
GetTerminalWindowHandle.cs
private static IntPtr GetTerminalWindowHandle()
{
try
{
var currentProcess = Process.GetCurrentProcess();
do
{
var parentProcess = GetParentProcess(currentProcess.Handle);
if (parentProcess == null)
{
return IntPtr.Zero;
}
var parentHandle = parentProcess.MainWindowHandle;
if (parentHandle != IntPtr.Zero)
{
return parentHandle;
}
currentProcess = parentProcess;
} while (true);
}
catch
{
return IntPtr.Zero;
}
}
private static Process GetParentProcess()
{
return GetParentProcess(Process.GetCurrentProcess().Handle);
}
public static Process GetParentProcess(IntPtr handle)
{
var pbi = new ParentProcessUtilities();
int status = NtQueryInformationProcess(handle, 0, ref pbi, Marshal.SizeOf(pbi), out _);
if (status != 0) { throw new Win32Exception(status); }
try
{
return Process.GetProcessById(pbi.InheritedFromUniqueProcessId.ToInt32());
}
catch (ArgumentException)
{
return null;
}
}
[StructLayout(LayoutKind.Sequential)]
private struct ParentProcessUtilities
{
// These members must match PROCESS_BASIC_INFORMATION
internal IntPtr Reserved1;
internal IntPtr PebBaseAddress;
internal IntPtr Reserved2_0;
internal IntPtr Reserved2_1;
internal IntPtr UniqueProcessId;
internal IntPtr InheritedFromUniqueProcessId;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment