关于c#:LRESULT,WPARAM和LPARAM是什么意思?

What do LRESULT, WPARAM and LPARAM mean?

我正在导入WinApi函数,用C#编写回调等(示例),并且总是想知道:

  • 他们的意思是什么 ? LRESULT作为最后结果? W-PARAM? L-参数
  • 如何安全地"package"它们

    • WPARAMLPARAM有时包含结构。因此,我需要将它们用作IntPtrLRESULT怎么样?我可以使用int或更好的IntPtr安全吗?

在C#中对LRESULT使用什么类型? intIntPtr


enter image description here

那是Microsoft的应用软件小组的前负责人Charles Simonyi,该小组是开发Word和Excel的小组。他是设置标识符命名标准的人。由于没人知道他的姓氏如何发音,因此他们选择了他出生的国家,并将其称为匈牙利符号。 Windows小组也采用了它,但是选择了"坏"类系统匈牙利语。选择标识符的第一个字母以记录变量的类型。与"好"类型相反,Apps匈牙利语通过逻辑类型名称而不是物理类型名称选择前缀。西蒙尼的版本。

所以它是L,如Long,W如Word。 LPCWSTR就是这样一个笨拙的东西,它是指向常量宽字符串的长指针。 System Hungarian的一个明显问题是,当体系结构发生更改时,它不再能很好地工作了。最初是为16位操作系统(L = 32位,W = 16-位)选择的,然后迁移到32位而未更改名称(W = 32位),今天我们是64位(L = W = 64位)。

因此,忽略这些前缀,这只是历史性的意外。您确实必须为LRESULT类型选择IntPtr,在Windows 64位版本上,它肯定可以是64位值。如果不这样做,很难诊断出问题,这是一个常见问题。

主题之外,您在照片背景中看到的模糊图像也是关于西蒙尼的有趣花絮。微软与员工分享了巨大的成功,并将他们中的许多人变成了千万富翁。您在背景中看到的是停靠在国际空间站的航天飞机的镜头。西蒙尼(Simonyi)是七个"太空游客"之一,并为自己购买了国际空间站(ISS)的机票。唯一两次这样做的人,让他退回了6000万美元:)


该名称来自历史原因。在Windows时代,WPARAM在匈牙利表示法中是指Word-Parameter和LPARAM Long-Parameter。移至32位会折叠成相同的大小(32位整数),但名称保持不变。 LRESULT意味着长远的结果,并且再次出于历史原因保留了名称。 Windows64位出现时,会发生另一种变化。
请在此处查看MSDN中的完整列表。
详细信息:LPARAM和LRESULT都是LONG_PTR的typedef,其中LONG_PTR为:

1
2
3
4
5
#if defined(_WIN64)
 typedef __int64 LONG_PTR;
#else
 typedef long LONG_PTR;
#endif

WPARAM是UINT_PTR的typedef,其中UINT_PTR为:

1
2
3
4
5
#if defined(_WIN64)
 typedef unsigned __int64 UINT_PTR;
#else
 typedef unsigned int UINT_PTR;
#endif

您基本上可以看到最终指向相同大小位的类型:唯一真正的不同是,如果您使用的是Windows 32或64。
从用法的意义上讲,它们是通用的目标参数,您可以根据窗口过程需要执行的操作来使用它们。通常,由于只有几个数字是不够的,因此会使用复杂的数据结构,其值将以WPARAM或LPARAM的形式传递,因此除非您关注上下文,否则您无法分配任何特定的含义。


这是匈牙利表示法的一个示例:

  • LPARAMLRESULT中的L均表示" long ",表示32位int
  • WPARAM中的w表示" word "(以前是16位int,但现在至少在以32位体系结构为目标时也是32位int)

类型名称/别名的其余部分应该暗示其含义,即LRESULT包含某种结果值,LPARAMWPARAM用于参数变量。

WPARAMLPARAM参数内容的实际含义取决于所发送的特定消息。它们只是消息参数的通用存储桶。因此很有可能您将无法规避不安全的类型转换。


LPARAM是LONG_PTR的typedef,在win32上是long(带符号32位),在x86_64上是__int64(带符号64位)。

WPARAM是UINT_PTR的typedef,它是win32上的无符号int(无符号32位)和x86_64上的无符号__int64(无符号64位)。

typedef UINT_PTR WPARAM;

typedef LONG_PTR LPARAM;

在c#中,您可以使用IntPtr

请参阅LPARAM和WPARAM的定义是什么?