Получить идентификатор процесса из дескриптора окна без GetWindowThreadProcessId (c#.net 4.0)

Наше приложение недавно перешло с .net 3.5 на .net 4. Возникла одна проблема: GetWindowThreadProcessId больше не работает.

У Microsoft есть доступное исправление, но было бы неудобно устанавливать его на каждый клиентский компьютер, и это может вызвать другие проблемы. Я бы предпочел обходной путь.

http://support.microsoft.com/kb/982638

Проблема в том, как описано Microsoft:

«В приложении удаленного взаимодействия .NET Framework у вас есть объект MarshalByRefObject. Этот объект содержит метод, который возвращает тип IntPtr. Объект передается через границу процесса. Когда объект сериализуется, создается исключение SerializationException, и вы получаете следующее сообщение об ошибке: Недопустимый код типа в потоке "Недопустимый" Эта проблема возникает из-за того, что код удаленного взаимодействия обрабатывает тип IntPtr как примитивный тип, когда среда CLR сериализует IntPtr. Однако позже код удаленного взаимодействия обрабатывает тип IntPtr как недопустимый тип, когда средство форматирования двоичных файлов сериализует IntPtr."

Итак, есть ли альтернатива? Есть ли другой способ получить идентификатор процесса из дескриптора окна? Или я могу маршалировать свой IntPtr по-другому, чтобы избежать этой ошибки?


person Sugrue    schedule 17.06.2011    source источник


Ответы (1)


Вы пытались заменить возвращаемое значение на void? (Потому что я думаю, что вам не нужен идентификатор потока)

[DllImport("user32.dll", SetLastError=true)]
static extern void GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

вместо:

[DllImport("user32.dll", SetLastError=true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
person Mauro H. Leggieri    schedule 22.02.2012