Я делаю программу для портативных КПК, используя компактную среду .net 2.0, и у меня есть одна часть, которой я не горжусь, и я надеялся на более элегантное решение.
По сути, проблема заключается в другом процессе, использующем мой файл, в данном случае это Windows Media Player. Я запускаю процесс, передавая расположение файла в Process.Start, но кажется, что возвращаемый процесс недолговечен и порождает другой процесс? Поэтому я попытался найти информацию о том, как получить информацию о дочерних процессах, но у меня возникли некоторые проблемы (я думаю, что по каким-то причинам процессы не возвращались).
Так что я сейчас делаю это хитрое исправление
string processName = item.Text;
Process proc = Process.Start(processName, null);
if (!proc.Start())
MessageBox.Show("Failed to start process", "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
else
{
IntPtr newWindow = IntPtr.Zero;
TimeSpan limit = TimeSpan.FromSeconds(3);
DateTime start = DateTime.Now;
DateTime now = start;
// do while the following:
// window is not null
// window is not ourself
// under 3 seconds
do
{
newWindow = Win32.GetForegroundWindow();
now = DateTime.Now;
// taking too long
if (now - start > limit)
break;
}
while (newWindow == IntPtr.Zero || newWindow == this.Handle);
if (newWindow != IntPtr.Zero && newWindow != this.Handle)
{
uint processID = 0;
if (Win32.GetWindowThreadProcessId(newWindow, out processID) != 0)
{
//const int stringSize = 1024;
//StringBuilder sb = new StringBuilder(1024);
//Win32.GetWindowText(newWindow, sb, stringSize);
m_processes.Add(new ProcessIDWithName(processID, processName));
}
}
}
Как видите, мне это не нравится, и оно ненадежно, но пока работает (мне нужно было решение, было ли это плохо или нет).
Зачем мне нужен идентификатор процесса? Поскольку Windows Media Player держит файл открытым для меня, и я не могу переместить / удалить файл, и поэтому мне нужно прекратить процесс, прежде чем я это сделаю. Я мог бы сделать подобное исправление с FindWindow, но я думал более обобщенно, поскольку это может быть не медиа-файл, открытый в Windows Media Player.
Так что, в принципе, я бы хотел лучшего решения, если это возможно!
Кроме того, если вам интересно, почему я не использую его секундомер, потому что, кажется, его нет в .net 2.0 cf, мне также не нужна точность в этом отношении.