2015-03-20 3 views
0

Я хочу скрыть окно, которое создается при вызове p.Start(). Код, который у меня есть сейчас, работает, но моя программа зависает примерно 20-40 секунд из-за цикла while, который там находится.Скрыть окно, созданное процессом

Текущий код:

[System.Runtime.InteropServices.DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

const int SW_HIDE = 0; 

//Process p is already created and initialized 
p.Start(); 
while(p.MainWindowHandle == IntPtr.Zero) 
{ 
    p.Refresh(); 
} 

ShowWindow(p.MainWindowHandle, SW_HIDE); 

Снятие время цикла предотвращает замерзание моей программы, но окно не скрывает то. Я сделал p.StartInfo.CreateNoWindow = true, но это работает только для окон консоли.

Итак, мой вопрос: Как я могу скрыть окно, созданное с помощью процесса, не замерзает мою программу в течение 20 секунд

+0

Вы пытались запустить его с помощью Task.Factory.StartNew (() => {/ * YOUR WHILE LOOP * /})? Возможно, p.Refresh вызывает большую операцию в очереди, которая заставляет вашу программу зависать на 20-40 секунд после этого из-за наполнения материала. Попробуйте Thread.sleep (100); или таймер для ожидания перед вызовом p.Refresh снова. – Measuring

+0

Создание новой задачи и ее запуск не работает – bramhaag

+0

Создайте processstartinfo с помощью WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true работал для меня в блокноте. Пробовал? – Measuring

ответ

0

Вы можете попробовать поставить этот код:

while(p.MainWindowHandle == IntPtr.Zero) 
{ 
    p.Refresh(); 
} 

ShowWindow(p.MainWindowHandle, SW_HIDE); 

в задаче и запустить его? Он должен удалить замораживание программы.

+0

Это не затормозит программу, но теперь открывается окно – bramhaag