从没有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)的主要内容,如果未能解决你的问题,请参考以下文章