Получить идентификатор процесса из дескриптора окна без GetWindowThreadProcessId (c # .net 4.0) - PullRequest
2 голосов
/ 17 июня 2011

Наше приложение недавно переключилось с .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 по-другому, чтобы избежать этой ошибки?

1 Ответ

1 голос
/ 23 февраля 2012

Вы пытались заменить возвращаемое значение на 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);
...