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常用WindowsAPI调用类

 

C#程序员开发WinForm必须知道的 Window 消息大全

 

posted @ 2019-11-10 17:33  德丽莎·阿波卡利斯  阅读(360)  评论(0编辑  收藏  举报