gpt4 book ai didi

c# - 在 C# 中赢得 api。从 IntPtr 获取高位和低位字

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

我正在尝试在 C# 中处理 WM_MOUSEMOVE 消息。

从 IntPtr 类型的 lParam 获取 X 和 Y 坐标的正确方法是什么?

最佳答案

尝试:
(请注意,这是初始版本,阅读下面的最终版本)

IntPtr xy = value;
int x = unchecked((short)xy);
int y = unchecked((short)((uint)xy >> 16));

通常不需要 unchecked(因为“默认”c# 项目未选中)

考虑这些是所用宏的定义:

#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))

#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))

其中 WORD == ushortDWORD == uint。我正在削减一些 ushort->short 转换。

附录:

一年半后,经历了 64 位 .NET 的“变幻莫测”,我同意 Celess 的观点(但请注意,出于兼容性原因,99% 的 Windows 消息仍然是 32 位的,所以我不认为现在问题并不大。更多的是为了 future ,因为如果你想做某事,你应该正确地做。)

唯一不同的是:

IntPtr xy = value;
int x = unchecked((short)(long)xy);
int y = unchecked((short)((long)xy >> 16));

我没有检查“IntPtr 是 4 字节还是 8 字节长”,而是采用最坏情况(8 字节长)并将 xy 转换为 。运气好的话,编译器将优化双重转换(到long然后到short/到uint)(最后, IntPtrint 的显式转换是一个转移注意力的问题...如果您使用它,您将来会处于危险之中。您应该始终使用 转换,然后直接使用它/将其重新转换为您需要的内容,向 future 的程序员展示您知道您在做什么。

测试示例:http://ideone.com/a4oGW2 (遗憾的是只有 32 位,但如果你有一台 64 位机器,你可以测试相同的代码)

关于c# - 在 C# 中赢得 api。从 IntPtr 获取高位和低位字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7913325/

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