API-----SendMessage

操作系统: win95
编程工具: vb6.0
问题: 请教 SendMessage() API 函数如何使用?

                        回答:

以下内容节选自我的书《Visual Basic编程晋级:ActiveX控件》:
要发送消息,我们就需要使用API函数SendMessage。这个函数的定义如下:
Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
这个函数有四个参数,它们的含义如下:
第一个参数hwnd是窗口句柄,是一个长整型数。Windows给每个控件一个编号,这个编号就称为窗口句柄。有了这个句柄,我们就可以告诉Windows我们要控制哪个控件,所以这个句柄在API调用中至关重要。Visual Basic的大多数控件都包括hwnd属性,如下拉框、TreeView等,窗体也有这个属性。但也有一些控件没有这个属性,如标签控件。没有这个属性就无法利用Windows API函数,但可以节省系统资源。
第二个参数是要传递的消息。API文档中包括了所有消息的含义和用法,而每个消息所定义的常数在Win32api.txt中有可以找到。使用SendMessage传递消息,大多是为了完成以下几个工作:
1、设置控件的一些选项,象我们要使用的CB_SETDROPPEDWIDTH的就属于这种情况。尽管Visual Basic的每个控件都提供了许多属性,但仍然有许多控件的选项没有包括在其中。而这些选项中的大多数都可以利用SendMessage进行设置。
2、获得控件的一些设置。同上一种情况相反,有时我们需要获得控件的一些设置,这相当于读取属性。例如,如果想知道一个下拉框的下拉部分的宽度是多少,就可以向控件发送CB_GETDROPPEDWIDTH消息。对于这种情况,SendMessage函数的返回值就是结果。
3、执行一定的操作。例如,我们要在下拉框中寻找是否"ABC"这个字符串。当然,我们可以编写一个循环,逐条比较看是否存在这样的字符串。如果使用API,我们只需要向下拉框发送CB_FINDSTRING消息,这条消息就会自动进行查找工作并返回结果。
4、模拟用户操作。我们有时希望模拟用户的操作,比如关闭其他应用程序的窗口。其实只要我们能知道那个窗口的句柄,我们就可以发送WM_CLOSE消息给那个窗口,窗口接受到这条消息就会关闭,如同用户关闭窗口一样。
API消息的妙用很多,我们这里只是介绍如何使用SendMessage来发送消息,更进一步的应用就留给读者继续探索了。
SendMessage还有两个参数wParam和lParam。每个消息都具有这两个参数,它们可能包括一些其他信息,其含义由具体的消息来决定的。比如,我们要调用的CB_SETDROPPEDWIDTH消息,其wParam 表示要设置下拉部分的宽度是多少,以象素为单位;而lParam参数没有使用,必须设置为0。
可能你已经注意到了,这里SendMessage中的lParam定义为Any类型。前面我们已经提到,指定 Any类型禁止Visual Basic进行类型检查,从而允许将任意数据类型传递给该过程。由于每条消息对参数的类型和传递方式的要求都不同:有的可能要求为Long型,有的可能要求为自定义类型;大多数要求按传值方式传递,但也有一些要求按传地址方式。为了满足各种要求,我们将这个参数定义为Any类型。比如,我们要传递一个Long型变量lData。如果消息要求传地址方式传递,可以使用:
SendMessage ……, lData
而如果要求传值方式传递,则使用
SendMessage ……, ByVal lData
如果传递常数,我们则需要使用类型后缀来指定常数的类型,比如"0&",表示Long型的常数0,如
SendMessage ……, ByVal 0&
我们也可以使用类型转换函数CLng将常数指定为Long型,如CLng(0)。

此问题由李海回答。

TTreeView:
(引用CommCtrl)
SendMessage(TreeView.Handle,TVM_SETBKCOLOR,0,RGB(255,0,0)); 设置TV背景颜色

SendMessage(Button.Handle,WM_LBUTTONDOWN,0,0);  鼠标左键按下
SendMessage(Button.Handle,WM_LBUTTONUP,0,0);   鼠标左键抬起
SendMessage(Edit.Handle,WM_SETTEXT,255,Integer(PChar('abc'))); 传递文本
SendMessage(Edit.Handle,WM_Char,Wparam('Q'),2);  传递字符
SendMessage(Button.Handle,BM_SETSTYLE,BS_RADIOBUTTON,1);  改变Button风格
SendMessage(ComboBox.Handle,CB_SETDROPPEDWIDTH,300,0);  改变CBDownWidth
WM_CUT、WM_COPY和WM_PASTE  剪切,复制,粘帖

实现任意组合键
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0);
keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), 0, 0);
keybd_event(ord('V'), MapVirtualKey(ord('V'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);

源地址:

http://www.china-askpro.com/msg23/qa41.shtml

http://www.cnblogs.com/shengshuai/archive/2006/10/19/533579.html

 -----------------------------------摘自百度某某大侠的博客-----------------------------------------------------------------

posted @ 2012-11-07 21:06  斗天!  阅读(462)  评论(0编辑  收藏  举报