Ho una situazione in cui sto avviando un processo nel mio codice per configurare un canale IPC. Il processo che sto avviando è un'applicazione MFC senza supporto CLR. L'applicazione da cui sto avviando questo processo è un modulo C# in un'applicazione WPF (ho pensato che non ritengo che ciò sia consequenziale al mio problema). Questo funziona con una versione dell'applicazione che fa il supporto CLR, e funziona su tutti i computer, tranne la destinazione di distribuzione, un computer touch screen con Windows 7. Ma per qualche ragione, quando provo con questo scenario esatto, l'oggetto processo senza risolve un handle della finestra principale (Process.MainWindowHandle
). Esiste un altro metodo (forse persino in voga) per farlo? È una cosa di sicurezza? Sono quello che sta guardando il processo. La maniglia della finestra principale del processo esiste. Non vedo cosa potrebbe essere sbagliato.Perché non è possibile ottenere l'handle della finestra principale per un processo avviato?
Se aiuta, ecco il mio codice.
_applicationProcess = new Process();
_applicationProcess.StartInfo.FileName = _strProcessPath;
_applicationProcess.StartInfo.Arguments = _strProcessArguments;
_applicationProcess.Start();
long nTicks = Environment.TickCount;
if (_applicationProcess.WaitForInputIdle(1 /*minute(s)*/ * 60000))
{
try
{
do
{
// Don't let total processing take more than 1 minute(s).
if (Environment.TickCount > nTicks + 1 /*minute(s)*/ * 60000)
throw new ApplicationException("MFCApplication.Startup failed! The main window handle is zero!");
_applicationProcess.Refresh();
}
while (_applicationProcess.MainWindowHandle.ToInt32() == 0);
_applicationHandle = new IntPtr(_applicationProcess.MainWindowHandle.ToInt32());
}
catch (Exception ex)
{
//Do some stuff...
throw;
}
}
else
{
// Do exception handling.
}
Il ApplicationException
viene colpito dopo un minuto di cercare di ottenere una maniglia finestra principale diverso da zero.
Sei stanco di usare 'WaitForInputIdle' come suggerito dai documenti MSDN? Inoltre è buona norma usare 'throw' invece di' buttare ex', come si perderanno pila informazioni di traccia con 'ex' tiro (tiro' ex' riavvia il tiro eccezione e quindi traccia dello stack). –
Controllare le modifiche. :) – Jordan
@jordan Vedo la tua modifica. Devi includere @username nei tuoi commenti in modo che l'altro utente a cui stai rispondendo sia avvisato. –