2010-09-24 7 views
9

Я использую автоматизацию для тестирования приложения, но иногда я хочу запустить приложение через пакетный файл. Когда я запускаю «process.WaitForInputIdle (100)», я получаю сообщение об ошибке:Как узнать, имеет ли процесс графический интерфейс?

«Ошибка WaitForInputIdle. Это может быть потому, что процесс не имеет графического интерфейса».

Как узнать, имеет ли процесс графический интерфейс или нет?

ответ

6

См. Environment.UserInteractive. Это определит, имеет ли этот процесс интерфейс вообще, например. услуги не являются интерактивными пользователем.

Вы также можете посмотреть Process.MainWindowHandle, который расскажет вам, есть ли графический интерфейс.

Комбинация этих двух проверок должна охватывать все возможности.

+0

К сожалению, командные файлы выглядят интерактивными (это возвращает «истина» как для командного файла, так и для окна). – Lunivore

+0

Когда вы говорите, что Process.MainWindowHandle можно использовать для этого - как? Не возражаете ли вы ответить другим? – Lunivore

+1

if Process.MainWindowHandle == IntPtr.Zero нет главного окна –

0

Вы можете просто попытаться поймать исключение:

Process process = ... 
try 
{ 
    process.WaitForInputIdle(100); 
} 
catch (InvalidOperationException ex) 
{ 
    // no graphical interface 
} 
+0

Да, я могу ... по какой-то причине это кажется мне уродливым. Большинство достойных библиотек и API обычно являются способом определения того, действительна ли операция, которую вы собираетесь выполнить. Обычно Microsoft предоставляет это. Если вы не возражаете, я подожду один день, посмотрю, есть ли у кого-нибудь идеи. – Lunivore

+0

Я согласен, его довольно уродливое использование исключений, подобных этому –

+0

@Lunivore, @Bear Monkey: Мне кажется, что это исключение где-то между [раздражающим исключением и экзогенным исключением] (http://blogs.msdn.com /b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx). Чтобы избежать исключения, вы можете P/вызывать функцию 'WaitForInputIdle'. –

0

Я думаю, что по линии этого, все же некрасивым, но пробует избежать исключения.

Process process = ... 

bool hasUI = false; 

if (!process.HasExited) 
{ 
    try 
    { 
     hasUI = process.MainWindowHandle != IntPtr.Zero; 
    } 
    catch (InvalidOperationException) 
    { 
     if (!process.HasExited) 
      throw; 
    } 
} 

if (!process.HasExited && hasUI) 
{ 

    try 
    { 
     process.WaitForInputIdle(100); 
    } 
    catch (InvalidOperationException) 
    { 
     if (!process.HasExited) 
      throw; 
    } 
} 
0

А также MainWindowHandle чек, можно перечислить технологические потоки и проверить, если любой из них ссылок видимого окна с помощью P/вызывающего. Кажется, что это хорошая работа, улавливающая любые окна, которые первая проверка пропускает.

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); 
Смежные вопросы