Как определить, работает ли конкретный процесс приложение WPF или нет? - PullRequest
3 голосов
/ 12 сентября 2009

Как определить, запущен ли конкретный процесс приложение WPF или нет?

В Snoop автор использует следующий код для проверки этого условия ~

foreach (ProcessModule module in process.Modules)
{
     if (module.ModuleName.Contains("PresentationFramework.dll") ||
        module.ModuleName.Contains("PresentationFramework.ni.dll"))
    {
       isValid = true;
        break;
     }
}

Ответы [ 2 ]

3 голосов
/ 12 сентября 2009

Видимо, 32-битный процесс не может перечислить модули 64-битного процесса. Это вызывает следующее Win32Exception:

Только часть запроса ReadProcessMemory или WriteProcessMemory была выполнена

Это, вероятно, ограничение класса Process, должен быть способ обойти его, используя методы API ...

То же самое отлично работает, если процесс тоже 64-битный ...

Что касается Snoop, 64-разрядная версия недоступна для загрузки, но, поскольку исходный код также доступен, вы можете скомпилировать его в x64

РЕДАКТИРОВАТЬ: если ваш процесс является 64-битным, а запущенное приложение WPF 32-битным, Process.Modules, похоже, также не содержат PresentationFramework ...

System.Diagnostics.ProcessModule (TheWPFApp.exe)
System.Diagnostics.ProcessModule (ntdll.dll)
System.Diagnostics.ProcessModule (wow64.dll)
System.Diagnostics.ProcessModule (wow64win.dll)
System.Diagnostics.ProcessModule (wow64cpu.dll)
2 голосов
/ 12 сентября 2009

Я только что проверил это на 64-битной Vista, и это работает хорошо. Процесс WPF содержит файл PresentationFramework.ni.dll из папки собственных изображений (куда идут сборки, когда они были ngen'd).

Можете ли вы объяснить, почему вы думаете, что это не работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...