c# 调用 win32 API的 SendMessage 函数 ,里面的属性用法?
函数原型:LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMIParam);参数:hWnd:其窗口程序将接收消...
函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
上面是API上面写的东西,请问:
WPARAM 和 LPARAM 各是什么类型?
wParam 和IParam 都是干什么用的? 展开
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
上面是API上面写的东西,请问:
WPARAM 和 LPARAM 各是什么类型?
wParam 和IParam 都是干什么用的? 展开
展开全部
SendMessage 这个消息比较特别,因为它的参数返回值会根据不同的消息而不同
首先来解析一下这个函数
第一个参数HWND hWnd ,是要将这个消息发送的对象的句柄,hwnd一般指窗口句柄,但这里的窗口是广义上的,一个按钮,一个文本框,一个列表框等等控件这些都可以看成按钮,所以传它们的句柄也可以。
第二个参数UINT Msg就是要发送的消息是什么, 窗口消息一般都以WM开头,意思是WindowMessage 取了2个字母, 而按钮消息一般以BM开头即ButtonMessage,静态类的是
STM,列表框是LBM 等等。 总之你要发什么消息,这里就写什么消息。
第三个和第四个参数是针对消息的附加参数。 这2个参数会参着所传入的消息值的不同而变经。
WPARAM曾经在16位的WINDOWS当中是一个16位的整数即word parameter
LPARAM曾经在16位的WINDOWS当中是一个32位的整数即long parameter
当时要使用LPARAM一般都要用HIWORD和LOWORD宏来取LPARAM的高16位和低16位,因它们分别代表不同的东西。
而现在对于32位的操作系统来说,它们没啥区别了,都是一个32位的整数,之所以没改名称,大概微软为了兼容性吧。
其实在winuser.h中对它们都有定义,追踪过去一般都可以看到是long类型。
此函数的返回值也会因为所发消息的不同而不同
举个例子,当我们单击了窗口中一个按钮中,程序会将一个WM_COMMAND放入程序的消息队列中,于是窗口可以对WM_COMMAND消息进行处理
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
WM_COMMAND, // the message to send
WPARAM wParam, // notification code and identifier
LPARAM lParam // handle to control (HWND)
);
这是MSDN中的说明,第一个肯定是窗口的句柄,第二个就是消息
第三个参数,指明了按钮的通知码和ID
wParam
The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero.
The low-order word specifies the identifier of the menu item, control, or accelerator
高位的字代表通知码,低位字代表它的ID, 我们一般用HIWORD 和LOWORD来分离它们
比如id = LOWORD(wParam) 这样
lParam
Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL.
这个代表了控件的句柄,就是所点击的那个按钮的句柄。
再比如这个:
SendMessage(
(HWND) hWnd, // handle to destination window
BM_GETCHECK, // message to send
(WPARAM) wParam, // not used; must be zero
(LPARAM) lParam // not used; must be zero
);
这个BM_GETCHECK消息可以获得一个复选框是否打勾
第一个参数,很显然该写上那个复选框的句柄
第二个参数,就是那个消息
第三和第四个参数在MSDN中写的很清楚,不使用,必须写0
所以调用时我们很明确要写成
SendMessage(hwndCtrl,BM_GETCHECK,0,0);
而它的返回值可以是下边的几个
BST_CHECKED BST_INDETERMINATE BST_UNCHECKED
这个些在winuser.h中有宏定义的,它们本质就是一些整数,只不过这样宏定义以后更容易理解
所以有时候我们就可以用一个if句判断它是不是选中
if(BST_CHECKED == SendMessage(hwndCtrl,BM_GETCHECK,0,0))
{
//写上处理代码
}
这些东西都可以在MSDN中查到,OK 差不多就这些
首先来解析一下这个函数
第一个参数HWND hWnd ,是要将这个消息发送的对象的句柄,hwnd一般指窗口句柄,但这里的窗口是广义上的,一个按钮,一个文本框,一个列表框等等控件这些都可以看成按钮,所以传它们的句柄也可以。
第二个参数UINT Msg就是要发送的消息是什么, 窗口消息一般都以WM开头,意思是WindowMessage 取了2个字母, 而按钮消息一般以BM开头即ButtonMessage,静态类的是
STM,列表框是LBM 等等。 总之你要发什么消息,这里就写什么消息。
第三个和第四个参数是针对消息的附加参数。 这2个参数会参着所传入的消息值的不同而变经。
WPARAM曾经在16位的WINDOWS当中是一个16位的整数即word parameter
LPARAM曾经在16位的WINDOWS当中是一个32位的整数即long parameter
当时要使用LPARAM一般都要用HIWORD和LOWORD宏来取LPARAM的高16位和低16位,因它们分别代表不同的东西。
而现在对于32位的操作系统来说,它们没啥区别了,都是一个32位的整数,之所以没改名称,大概微软为了兼容性吧。
其实在winuser.h中对它们都有定义,追踪过去一般都可以看到是long类型。
此函数的返回值也会因为所发消息的不同而不同
举个例子,当我们单击了窗口中一个按钮中,程序会将一个WM_COMMAND放入程序的消息队列中,于是窗口可以对WM_COMMAND消息进行处理
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
WM_COMMAND, // the message to send
WPARAM wParam, // notification code and identifier
LPARAM lParam // handle to control (HWND)
);
这是MSDN中的说明,第一个肯定是窗口的句柄,第二个就是消息
第三个参数,指明了按钮的通知码和ID
wParam
The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero.
The low-order word specifies the identifier of the menu item, control, or accelerator
高位的字代表通知码,低位字代表它的ID, 我们一般用HIWORD 和LOWORD来分离它们
比如id = LOWORD(wParam) 这样
lParam
Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL.
这个代表了控件的句柄,就是所点击的那个按钮的句柄。
再比如这个:
SendMessage(
(HWND) hWnd, // handle to destination window
BM_GETCHECK, // message to send
(WPARAM) wParam, // not used; must be zero
(LPARAM) lParam // not used; must be zero
);
这个BM_GETCHECK消息可以获得一个复选框是否打勾
第一个参数,很显然该写上那个复选框的句柄
第二个参数,就是那个消息
第三和第四个参数在MSDN中写的很清楚,不使用,必须写0
所以调用时我们很明确要写成
SendMessage(hwndCtrl,BM_GETCHECK,0,0);
而它的返回值可以是下边的几个
BST_CHECKED BST_INDETERMINATE BST_UNCHECKED
这个些在winuser.h中有宏定义的,它们本质就是一些整数,只不过这样宏定义以后更容易理解
所以有时候我们就可以用一个if句判断它是不是选中
if(BST_CHECKED == SendMessage(hwndCtrl,BM_GETCHECK,0,0))
{
//写上处理代码
}
这些东西都可以在MSDN中查到,OK 差不多就这些
展开全部
就是给目标窗口hwnd发送一个消息Msg。消息是什么,就是一个约定好了的数字(UINT无符号整形)。用宏定义换成人容易记住的名字,如WM_SETFOCUS,WM_PAINT,WM_SIZE等等,以及你自己约定的新消息(不要和预定义的重复就好)
WPARAM和LPARAM是你传给处理这个消息的函数的参数.它的使用很灵活,不同的消息有不同的约定.你可以查找MSDN相关的消息就有他两个参数的用法.脱去宏定义WPARAM其实就是一个UINT而LPARAM就是一个LONG当然也可以传指针都没有问题的.
比如下面是WM_SIZE的说明
[wParam]表示改变尺寸的方式类型
Specifies the type of resizing requested. This parameter can be one of the following values.
SIZE_MAXHIDE
Message is sent to all pop-up windows when some other window is maximized.
SIZE_MAXIMIZED
The window has been maximized.
SIZE_MAXSHOW
Message is sent to all pop-up windows when some other window has been restored to its former size.
SIZE_MINIMIZED
The window has been minimized.
SIZE_RESTORED
The window has been resized, but neither the SIZE_MINIMIZED nor SIZE_MAXIMIZED value applies.
[lParam]一个参数放了宽高两个数
The low-order word of lParam specifies the new width of the client area.
The high-order word of lParam specifies the new height of the client area.
还有很大一部分消息是不需要参数的.两个参数传0就行
WPARAM和LPARAM是你传给处理这个消息的函数的参数.它的使用很灵活,不同的消息有不同的约定.你可以查找MSDN相关的消息就有他两个参数的用法.脱去宏定义WPARAM其实就是一个UINT而LPARAM就是一个LONG当然也可以传指针都没有问题的.
比如下面是WM_SIZE的说明
[wParam]表示改变尺寸的方式类型
Specifies the type of resizing requested. This parameter can be one of the following values.
SIZE_MAXHIDE
Message is sent to all pop-up windows when some other window is maximized.
SIZE_MAXIMIZED
The window has been maximized.
SIZE_MAXSHOW
Message is sent to all pop-up windows when some other window has been restored to its former size.
SIZE_MINIMIZED
The window has been minimized.
SIZE_RESTORED
The window has been resized, but neither the SIZE_MINIMIZED nor SIZE_MAXIMIZED value applies.
[lParam]一个参数放了宽高两个数
The low-order word of lParam specifies the new width of the client area.
The high-order word of lParam specifies the new height of the client area.
还有很大一部分消息是不需要参数的.两个参数传0就行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询