【问题标题】:EnumWindows lParam argument while calling from 32bit to target 64bit process从 32 位调用目标 64 位进程时的 EnumWindows lParam 参数
【发布时间】:2013-06-10 15:08:42
【问题描述】:

我正在编写一个自定义函数来枚举子窗口并返回一个窗口句柄列表。这是根据 P/Invoke 的函数声明。

[System.Runtime.InteropServices.DllImport("user32.Dll")]
public static extern bool EnumWindows (EnumWindowsCallback lpEnumCallbackFunc, int lParam);

[System.Runtime.InteropServices.DllImport("user32")]
public static extern bool EnumChildWindows (IntPtr hWnd, EnumWindowsCallback lpEnumCallbackFunc, int lParam);

问题是我需要能够在一种情况下传递 Int32 值,在另一种情况下传递 IntPtr。

  • 如果我将参数更改为 IntPtr,我是否可以将其转换为 int 并在以后可靠地将其转换回 Int32?
  • 如果我将参数保留为 Int32,由于我自己的应用程序是 32 位但目标进程是 64 位(Windows 边栏),因此 IntPtr.ToInt32 是否始终有效?

【问题讨论】:

    标签: c# .net winapi pinvoke


    【解决方案1】:

    必须使用IntPtr 作为lParam 值,但始终保证它对于Int32 足够大。

    由于放入 lParam 的值在您的控制之下(而不是其他窗口的),您可以保证您将在 IntPtr 中放入一个值,您可以再次读出该值。

    【讨论】:

    • 谢谢。马修就是这样。我从 System.Diagnostics.Process.GetProcesses()[0].MainWindowHandle 获取 IntPtr hWnd。由于目标进程是 64 位,我不确定 hWnd 是 32 位还是 64 位。我对 Win-API 不熟悉,所以请多多包涵。
    • @RaheelKhan 我认为您不能从 32 位进程中枚举任何 64 位进程,所以我认为不会出现这种情况。你试过了吗?我认为它不会工作......
    • 只要您不尝试访问该进程的内部结构(例如模块等),它就可以工作。我的应用程序是 32 位的,可以轻松获取 64 位的侧边栏应用程序。
    • 重载工作正常。但是当我为回调重载委托时,即使 Int32 和 IntPtr 的第二个参数不同,它也会给我一个重复的重复错误。
    • @RaheelKhan 这很奇怪 - 我确信我无法从 32 位程序中枚举 64 位进程,当我尝试它时......奇怪。
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 2010-09-12
    • 2015-01-02
    • 2011-01-28
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多