Вопрос по process, visual-studio-2010, c# – Как скрыть / показать процесс в C #?

5

Я пытаюсь запустить внешний процесс в приложении Visual C # 2010 - Windows Forms. Цель состоит в том, чтобы запустить процесс как скрытое окно и открыть его позже.

Я обновил свой прогресс:

<code>//Initialization
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool EnableWindow(IntPtr hwnd, bool enable);
[DllImport("user32.dll")]
private static extern bool MoveWindow(IntPtr handle, int x, int y, int width, 
int height, bool redraw);

SW_SHOW = 5;
</code>

Следующее было помещено в мою основную функцию:

<code>ProcessStartInfo info = new ProcessStartInfo("process.exe");
info.WindowStyle = ProcessWindowStyle.Hidden;
Process p = Process.Start(info);

p.WaitForInputIdle();
IntPtr HWND = p.MainWindowHandle;

System.Threading.Thread.Sleep(1000);    

ShowWindow(HWND, SW_SHOW);
EnableWindow(HWND, true);
MoveWindow(HWND, 0, 0, 640, 480, true);
</code>

Однако, поскольку окно было запущено как «скрытое»,p.MainWindowHandle = 0, Я не могу успешно показать окно. Я также пыталсяHWND = p.Handle без успеха.

Есть ли способ предоставить новый дескриптор моего окна? Это может потенциально решить мою проблему.

Рекомендации:

MSDN ShowWindow

Форумы MSDN

Как импортировать .dll

Я обновил свой прогресс выше. Пожалуйста, сообщите, и спасибо за ваш отзыв. Matt Barr
Сокрытие процесса? (хитроумно) - или скрывать форму? Marc Gravell♦
Скрытие окна процесса. В качестве аргумента давайте предположим, что это интернет-обозреватель:ProcessStartInfo info = new ProcessStartInfo("iexplore"); Matt Barr
CreateNoWindow работает только в приложении в режиме консоли. Для скрытого требуется приложение с графическим интерфейсом для взаимодействия иnCmdShow аргумент, который Windows передает своей функции WinMain (). Это, однако, часто игнорируется. Вы ничего не можете с этим поделать, кроме как связаться с владельцем. Hans Passant

Ваш Ответ

3   ответа
2

int hWnd;
Process[] processRunning = Process.GetProcesses();
foreach (Process pr in processRunning)
{
    if (pr.ProcessName == "notepad")
    {
        hWnd = pr.MainWindowHandle.ToInt32();
        ShowWindow(hWnd, SW_HIDE);
    }
}
После перечитывания этого у меня есть дальнейшие проблемы. Там нет никакого способа узнать, что прmy процесс. Например, что если моя программа открыла два окна блокнота? Интересно, есть ли лучший способ определить окно, которое я открыл? Matt Barr
Позвольте мне попробовать это, когда я вернусь домой. Если это сработает, я приму это. Не существует ли метода окна поиска? Matt Barr
1

ProcessWindowStyle.Hidden Вы также должны установитьProcessStartInfo.UseShellExecute ложно.http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle.aspx

Вы должны были бы как-то знать дескриптор окна, чтобы показать его позже.

Пожалуйста, предоставьте документацию. Тестирование показывает, чтоProcessStartInfo.UseShellExecute = true это единственный способ, которымProcessWindowStyle.Hidden  буду работать. Matt Barr
предполагался поиск ProcessWindowStyle на MSDN; но я добавил ссылку для вас.
Спасибо. К сожалению, по какой-то причине, это не работает в моем случае. Как уже упоминалось выше, я протестировал обаtrue а такжеfalse, При использованииfalseокно не скрылось. Matt Barr
11

процесс работает правильно. Благодаря всей вашей помощи, я придумал это исправление.

Значение p.MainWindowHandle было равно 0, поэтому мне пришлось использовать функцию user32 FindWindow (), чтобы получить дескриптор окна.

//Initialization
int SW_SHOW = 5;

[DllImport("user32.dll",SetLastError=true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);

[DllImport("user32.dll")]
private static extern bool EnableWindow(IntPtr hwnd, bool enabled);

И в моей основной функции:

ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "notepad";
info.UseShellExecute = true;
info.WindowStyle = ProcessWindowStyle.Hidden;

Process p = Process.Start(info);
p.WaitForInputIdle();
IntPtr HWND = FindWindow(null, "Untitled - Notepad");

System.Threading.Thread.Sleep(1000);

ShowWindow(HWND, SW_SHOW);
EnableWindow(HWND, true);

Рекомендации:

pinvoke.net: FindWindow ()

Редактировать: Удален WindowShowStyle из объявления dllImport: вместо этого вы можете определить это как int. Я определил перечисление с именем WindowShowStyle, чтобы определить константы, изложенные вЭта статья, Просто лучше подходит для моих шаблонов кодирования, чтобы определять перечисления вместо использования постоянных или жестко закодированных значений.

Я отредактирую свой ответ выше. Matt Barr
Извините за задержку в этом ответе! Надеюсь, вы нашли то, что вам нужно. Matt Barr
Привет, Мэтт, спасибо, что поделился. Я знаю, что уже поздно, но когда я попробую этот код, Visual Studio не сможет распознатьWindowShowStyle, Я проверил все предоставленные вами ссылки, но не могу найти упоминаний об этом типе - не могли бы вы сообщить мне, откуда это происходит? (Я имею в виду тип 2-го параметра вShowWindow импортная декларация)

Похожие вопросы