从没有GetWindowThreadProcessId的窗口句柄中获取进程ID(c#.net 4.0)

Posted

技术标签:

【中文标题】从没有GetWindowThreadProcessId的窗口句柄中获取进程ID(c#.net 4.0)【英文标题】:Get the process id from a window handle without GetWindowThreadProcessId (c#.net 4.0) 【发布时间】:2011-06-17 14:26:18 【问题描述】:

我们的应用程序最近从 .net 3.5 切换到 .net 4。出现的一个问题是 GetWindowThreadProcessId 不再有效。

Microsoft 有一个可用的修补程序,但必须在每台客户计算机上安装它会很痛苦,并且可能会导致其他问题。我更喜欢解决方法。

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

问题是,如 microsoft 所述:

“在 .NET Framework 远程应用程序中,您有一个 MarshalByRefObject 对象。该对象包含一个返回 IntPtr 类型的方法。该对象跨进程边界传递。当对象被序列化时,会引发 SerializationException 异常,并且您收到以下错误消息: 流“无效”中的类型代码无效 出现此问题的原因是,当 CLR 序列化 IntPtr 时,远程处理代码将 IntPtr 类型视为基本类型。但是,当二进制格式化程序序列化 IntPtr 时,远程处理代码稍后会将 IntPtr 类型视为无效类型。"

那么,还有其他选择吗?我有什么不同的方法可以从窗口句柄中获取进程 ID?或者我可以对我的 IntPtr 进行不同的编组以避免这个错误吗?

【问题讨论】:

【参考方案1】:

您是否尝试用 void 替换返回值? (因为我认为你不需要线程 ID)

[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);

【讨论】:

以上是关于从没有GetWindowThreadProcessId的窗口句柄中获取进程ID(c#.net 4.0)的主要内容,如果未能解决你的问题,请参考以下文章

如何从没有索引的数据框中选择值

从没有参数的函数返回泛型

从没有参数的函数返回整数数组[重复]

如果成功,从没有结果的函数返回错误的惯用方法是啥?

从没有属性的 web api 返回 JsonResult

从没有响应 iPad 的其他 ViewController 调用 didSelectRowAtIndexPath