C#.Winform Winfows API Message 参数解析
在我们的程序和WindowAPI打交道时,特别是在处理鼠标键盘消息时,LPARAM 和 WPARAM 参数会经常出现。
在Win32 API中,LPARAM 和 WPARAM 都是32位,所以在数据类型上没有什么本质的区别。
但是对于不同的WinAPI,LPARAM 与 WPARAM 参数被承载者不同的含义。
(1)LPARAM的值和意思取决于主事件消息类型。
在不同的情况下,LPARAM变元可能提供一个字符串或记录结构的指针,分解为一组字、字节或标志值,或者往往完全没有用。
(2)WPARAM的值及格式取决于主要的事件消息类型。
在不同的情况下,WPARAM变元可能传输一个坐标点对,使用低字值标识次要的消息类型,提供某些其他的数据类型,或被完全忽略。
在很多情况下,WPARAM值将被看成两个独立的字值,分别具有不同的功能。
(3)Windows的消息必须参考帮助文件才能知道具体的含义。
如果是你定义的消息,愿意怎么使这两个参数都行。
但是习惯上,我们愿意使用LPARAM传递地址,而WPARAM传递其他参数。
根据消息类型: ------WM_PAINT,WM_COMMAND等: LOWORD(wParam): 子窗口ID HIWORD(wParam): 通知码(告诉父窗口到底发生了什么变化,通知码和控件的类型以及事件相关,系统对每一类控件的每一个事件的通知码都有明确的定义,用一个系统整常量来表示) lParam: 子窗口句柄 ------WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_LBUTTONUP等: LOWORD(lParam): 坐标的x值 HIWORD(lParam): 坐标的y值
然后是常见的C#版的WPARAM 与 LPARAM 参数的解析函数
public static ushort LOWORD(uint value) { return (ushort)(value & 0xFFFF); } public static ushort HIWORD(uint value) { return (ushort)(value >> 16); } public static byte LOWBYTE(ushort value) { return (byte)(value & 0xFF); } public static byte HIGHBYTE(ushort value) { return (byte)(value >> 8); }
C#程序员开发WinForm必须知道的 Window 消息大全