gpt4 book ai didi

c# - 如何在 32 位平台上调用 GetWindowLongPtr 和 SetWindowLongPtr?

转载 作者:可可西里 更新时间:2023-11-01 08:06:02 25 4
gpt4 key购买 nike

我想 P/Invoke 到 GetWindowLongPtrSetWindowLongPtr ,而且我看到了关于它们的相互矛盾的信息。

一些消息称,在 32 位平台上,GetWindowLongPtr 只是一个调用 GetWindowLong 的预处理器宏,而 GetWindowLongPtr 并不作为 user32.dll 中的入口点存在。例如:

  • pinvoke.net entry for SetWindowLongPtr有一个检查 IntPtr.Size 的静态方法,然后调用 SetWindowLong 或 SetWindowLongPtr,并附有一条评论说“遗留操作系统不支持 SetWindowLongPtr”。没有解释“遗留操作系统”的含义。
  • answer on StackOverflow声明“在 32 位系统上,GetWindowLongPtr 只是一个指向 GetWindowLong 的 C 宏”。

所以这些来源似乎表明 *Ptr 入口点根本不存在于 user32.dll 版本中,例如,32 位 Windows 7。

但我在 MSDN 文档中看不到这一点的指示。根据 MSDN,SetWindowLongPtr取代 SetWindowLong,简单明了。并根据SetWindowLongPtr page段的要求,似乎 SetWindowLongPtr 自 Windows 2000(客户端和服务器版本)以来一直在 user32.dll 中。同样,没有提到 32 位操作系统中缺少入口点。

怀疑事实介于两者之间:当您告诉 C++ 编译器针对较旧的操作系统(即编译将在 Win9x 和 NT4 上运行的东西)时,头文件将 SetWindowLongPtr 声明为调用 SetWindowLong 的宏,但入口点可能确实存在于 Windows 2000 及更高版本中,如果您告诉编译器以这些平台为目标,您将直接获取它(而不是宏)。但这只是一个猜测;我真的没有资源或专业知识来挖掘和验证它。

目标平台也有可能发挥作用——如果您为 x86 平台编译您的应用程序,那么您不应该在 64 位操作系统上调用 SetWindowLongPtr。同样,我知道的足以想到这个问题,但我不知道如何找到答案。 MSDN 似乎建议 SetWindowLongPtr 总是正确的。

谁能告诉我简单地 P/Invoke 到 SetWindowLongPtr 并完成它是否安全? (假设是 Windows 2000 及更高版本。)P/调用 SetWindowLongPtr 会给我正确的入口点吗:

  • 如果我在 32 位操作系统上运行针对 x86 平台的应用程序?
  • 如果我在 64 位操作系统上运行针对 x86 平台的应用程序?
  • 如果我在 64 位操作系统上运行针对 x64 平台的应用程序?

最佳答案

我建议您按照 Windows 窗体内部处理的方式处理此问题:

public static IntPtr GetWindowLong(HandleRef hWnd, int nIndex)
{
if (IntPtr.Size == 4)
{
return GetWindowLong32(hWnd, nIndex);
}
return GetWindowLongPtr64(hWnd, nIndex);
}


[DllImport("user32.dll", EntryPoint="GetWindowLong", CharSet=CharSet.Auto)]
private static extern IntPtr GetWindowLong32(HandleRef hWnd, int nIndex);

[DllImport("user32.dll", EntryPoint="GetWindowLongPtr", CharSet=CharSet.Auto)]
private static extern IntPtr GetWindowLongPtr64(HandleRef hWnd, int nIndex);

关于c# - 如何在 32 位平台上调用 GetWindowLongPtr 和 SetWindowLongPtr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3343724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com