Così come un controllo MainWindowHandle
, si possono elencare i fili di processo e verificare se qualcuno di loro riferimento una finestra visibile tramite P/richiama. Questo sembra fare un buon lavoro catturando qualsiasi finestra che manchi al primo controllo.
private Boolean isProcessWindowed(Process externalProcess)
{
if (externalProcess.MainWindowHandle != IntPtr.Zero)
{
return true;
}
foreach (ProcessThread threadInfo in externalProcess.Threads)
{
IntPtr[] windows = GetWindowHandlesForThread(threadInfo.Id);
if (windows != null)
{
foreach (IntPtr handle in windows)
{
if (IsWindowVisible(handle))
{
return true;
}
}
}
}
return false;
}
private IntPtr[] GetWindowHandlesForThread(int threadHandle)
{
results.Clear();
EnumWindows(WindowEnum, threadHandle);
return results.ToArray();
}
private delegate int EnumWindowsProc(IntPtr hwnd, int lParam);
private List<IntPtr> results = new List<IntPtr>();
private int WindowEnum(IntPtr hWnd, int lParam)
{
int processID = 0;
int threadID = GetWindowThreadProcessId(hWnd, out processID);
if (threadID == lParam)
{
results.Add(hWnd);
}
return 1;
}
[DllImport("user32.Dll")]
private static extern int EnumWindows(EnumWindowsProc x, int y);
[DllImport("user32.dll")]
public static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);
[DllImport("user32.dll")]
static extern bool IsWindowVisible(IntPtr hWnd);
fonte
2017-03-12 04:51:31
Purtroppo file batch sembra essere utente interattiva (questo restituisce "vero" sia per il file batch e la finestra). – Lunivore
Quando si dice che Process.MainWindowHandle potrebbe essere usato per fare questo - come? Stai pensando di metterlo in un'altra risposta? – Lunivore
se Process.MainWindowHandle == IntPtr.Zero non ha una finestra principale –