Показывает скрытый процесс в Windows? - PullRequest
0 голосов
/ 19 мая 2009

У меня есть небольшая проблема.

В связи с моими предыдущими вопросами о Slipstreamed SP3 против исправленного SP3 мы пришли к выводу, что запущен процесс Internet Explorer, и было дано указание загрузить простой файл .html из локальной диск, который содержит javascript, который открывает остальную часть большей системы чата / собраний. Internet Explorer запускается из клиента Lotus Notes.

К сожалению, все, что мы видим, - это процесс IExplore.exe, который появляется в диспетчере задач, а через несколько секунд снова исчезает.

Если мы попытаемся открыть локальный файл .html, который мы нашли на диске, он выдаст нам информационную панель вверху, сообщающую, что он отключил активное содержимое. Это, однако, не является реальной проблемой. У нас есть другая машина с такими же настройками, но там, где все работает, и загрузка файла .html вручную также дает нам ту же ошибку.

Однако, возможно, появляется другое сообщение об ошибке, когда IExplore запускается из заметок, но, поскольку предполагается, что этот процесс просто запускает остальную часть системы, и это окно скрыто, мы не можем его увидеть, то есть , сообщение об ошибке / проблема.

Итак, я подумал, что, возможно, мне следует попытаться создать небольшую программу, которая ожидает запуска IExplore.exe, а затем сразу показывает окно, чтобы мы могли увидеть сообщение об ошибке или что-то еще, что является проблемой. По крайней мере, надеюсь, мы сможем это увидеть.

Пока все хорошо, за исключением того, что если я запускаю процесс из собственной программы со скрытым окном, дескриптор главного окна равен 0, и, таким образом, я не могу показать окно в конце концов. Я ожидаю, что этот процесс IExplore.exe, запущенный из Lotus Notes, будет иметь такую ​​же проблему.

Моя программа мониторинга написана на C # и в основном выполняет этот цикл:

foreach (var process in Process.GetProcesses())
{
    if (process.ProcessName.ToLower() == "iexplore")
        result.Add(process);
}

Это подхватывает все процессы IExplore.exe, Windows или нет, и с IE8 я получаю 2 процесса для первого окна, как и ожидалось. Я запускаю это снова и снова и обрабатываю отличия от предыдущих запусков.

Тем не менее, процесс кратко имеет дескриптор окна 0 в начале, поэтому я изменил его на:

foreach (var process in Process.GetProcesses())
{
    if (process.ProcessName.ToLower() == "iexplore" &&
        process.MainWindowHandle != IntPtr.Zero)
    {
        result.Add(process);
    }
}

но теперь он вообще ничего не берет, даже после того, как окно получило дескриптор (и да, process.MainWindowHandle имеет ненулевое значение дескриптора после того, как окно было показано, но в том случае, когда окно никогда не отображается, оно остается на 0.)

Итак, вопрос в том, могу ли я взять этот скрытый процесс IExplore.exe и дать ему указание показать себя, когда у него уже нет дескриптора окна? Я сомневаюсь в этом, но, возможно, кто-то может доказать, что я неправ.

Если нет, то мой план резервного копирования заключается в создании программы shim IExplore.exe, которая перенаправляет все аргументы командной строки на исходную, за исключением того, что она указывает, что должно отображаться окно. Будет ли это решением?

1 Ответ

1 голос
/ 19 мая 2009

Я не верю, что существует какой-либо способ заставить окно IE, у которого нет дескриптора окна, выделить свой дескриптор окна (или использовать ранее выделенный) и отобразить себя.

Что касается вашего метода резервного копирования: я думаю, это сработает, но вы там работаете на опасной территории. На самом деле, я бы порекомендовал написать свою шимму, чтобы просто регистрировать каждый вызов iexplore.exe и все, что в него входит, и использовать это для характеристики вашей проблемы; только после тщательной характеристики вашей проблемы с полностью безопасным ведением журнала я мог бы предложить изменить параметры, чтобы заставить iexplore.exe отображать окно.

...