c # MainWindowHandle всегда нулевой

Я прочитал несколько тем о MainWindowHandle, но я не смог найти решение своей проблемы, я запускаю приложение с графическим интерфейсом и хочу получить MainWindowHandle через объект процесса, но значение дескриптора всегда равно нулю, если я не собираюсь подождите с thread.sleep (), пока графический интерфейс не загрузится. Я также пытался использовать WaitForInputIdle, но это вообще не помогло.

process.Start();

process.WaitForInputIdle(1000);
while (process.MainWindowHandle == IntPtr.Zero)
{
     Thread.Sleep(100);
}
// do something with the handle

он никогда не уходит, если я заменяю waitforinputidle обычным thread.sleep, он получает дескриптор правильно.

Проще говоря: я хочу продолжить свой код, только если я получу дескриптор! = ноль, но я не хочу ждать статического времени для этого


person dontcare    schedule 11.04.2012    source источник


Ответы (1)


Значение, хранящееся в MainWindowHandle, кэшируется. Добавьте в свой цикл process.Refresh (), чтобы сделать это значение недействительным:

while (process.MainWindowHandle == IntPtr.Zero)
{
    Thread.Sleep(100);
    process.Refresh();
}
person Tung    schedule 11.04.2012
comment
вот и решение, спасибо. но какую роль играет waitforinputidle? чтение msdn: msdn.microsoft.com/en- us / library / это должно помочь с проблемой, что ручка не готова - person dontcare; 11.04.2012
comment
@dontcare, мне не совсем понятно, насколько на самом деле эффективен WaitInputIdle (). Мы можем отключить только то, что нам сообщает документация по методу - то есть он блокируется до тех пор, пока дочерний элемент не перейдет в состояние ожидания. Это наводит на мысль, что бездействие означает, что у ребенка есть MainWindowHandle, но, как вы можете видеть из вашего первоначального знакомства с этим методом, это не совсем верно. - person Tung; 11.04.2012