已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SendMessage PostMessage 详解 Windows API 应用程序接口 是 Windows 系列软件为程序开发人员提供的火力强大的 武 器库 在这个武器库中 有很多极具威力的武器 SendMessage 就是其中之一 它的功能 非常丰富 灵活使用这个函数 会给编程工作带来很多便利 本文以 Visual Basic 为例 结合几个具体的例子介绍该函数的功能 一 SendMeaasge 函数简介 顾名思义 SendMessage 函数的功能是 发送消息 即将一条消息发送到指定对象 操作 系统 窗口或控件等 上 以产生特定的动作 如滚屏 修改对象外观等 SendMessage 函数在 VB 中的函数说明如下 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 对象的句柄 希望将消息传送给哪个对象 就把该对象的句柄作为实参传送 在 VB 中可以简单地用 对象 hWnd 获得某个对象的句柄 如 Text1 hWnd 和 Form1 hWnd 分 别可以得到 Text1 和 Form1 的句柄 wMsg 被发送的消息 根据具体需求和不同的对象 将不同的消息作为实参传送 以产生 预期的动作 wParam lParam 附加的消息信息 这两个是可选的参数 用来提供关于 wMsg 消息更多 的信息 不同的 wMsg 可能使用这两个参数中的 0 1 或 2 个 如果不需要哪个附加参数 则将实参赋为 NULL 在 VB 中赋为 0 在简单了解了 SendMessage 函数的格式和功能后 让我们以几个例子来看看它的威力 二 SendMessage 函数使用实例 例 1 多行 TextBox 中的快速处理功能在处理多行 TextBox 时我们经常会碰到以下几种情况 希望了解多行 TextBox 中目前共有多少行文字 想快速返回第 N 行的文字 对于上面的情况 如果用 VB 自身的语句或函数来实现的话 要写不短的代码 而且由于 要采用顺序查找的办法来完成 因此代码的执行效率也很低 如果使用 SendMessage 函数 则可以大大减少代码量 并大幅度的提高执行效率 用 SendMessage 函数完成上面两个任务的方法非常简单 每个任务只需简单地发送一条消 息给多行 TextBox 即可 两个消息分别为 EM GETLINECOUNT EM GETLINE 其它 参数和返回值见附表 下面用一个简单的实例演示这两个功能 新建工程 在 Form1 上添加三个 TextBox 名称分别为 Text1 txtLineCount TxtString 将 Text1 的 Multi Line 属性置为 True 三个标签和一个命令按钮 为工程添加一个模块 Moudle1 在其中 写如下声明 其中 SendMessage 函数的声明可以从 VB 的 API 浏览器 中复制 消息常量名 消息值 wParam lParam 返回值 EM GETLINECOUNT 计数 MaxWidth 0 Query1 SQL Clear Query1 SQL Add select Company from Customer Query1 Open 读客户列表到下拉框 while not Query1 Eof do begin ComboBox1 Items add Query1 FieldByName Company AsString Width ComboBox1 Font Size Length ComboBox1 Items i if Width MaxWidth then MaxWidth Width 找出最大值 Query1 Next i i 1 end Query1 Close ComboBox1 Text ComboBox1 Items 0 发送消息以确定显示区域的宽度 SendMessage ComboBox1 Handle CB SETDROPPEDWIDTH MaxWidth 0 利用 SendMessage 函数还可以实现一些有趣的效果 例如在按钮的 Click 事件中加入如下 语句 SendMessage Button Handle BM SETSTYLE BS RADIOBUTTON 1 运行后点击按钮 就可以把按钮变成一个收音机按钮 控件接收 SendMessage 消息 上面讨论了用 SendMessage 向控件发送消息的过程 但凡事有利就有弊 用 SendMessage 发送的消息在处理上存在着一定困难 因为该消息不经过消息队列 所以无法用 OnMessage 方式来指定对消息的响应 甚至用 HookMainWindow 也不行 因为消息直接发 送到控件 绕过了主窗体 要对这种类型的消息作出响应 需要重载控件的 WndProc 方法 例如 对于一个列表框 滚动条的滚动消息就是用 SendMessage 方式发送的 因此该消息 不在 TlistBox 的事件列表中 下面是处理控件响应该滚动消息的具体步骤 1 首先从 TlistBox 继承一个 TmyListBox 类 并重载 WndProc 方法 在程序中加入下列定 义 type TMyListBox class TListBox private procedure WndProc var Msg TMessage override 重载 WndProc 处理发送到控件的消息 public end 其中 WndProc 方法指定控件对消息的响应 输入参数是 TMessage 类型 该数据类型是一 个记录 包含了消息代码和消息的参数 消息参数可以用 Longint 或 Word 方式获得 2 对滚动事件做出响应 在 WndProc 方法中加入如下处理代码 if Msg Msg WM VSCROLL and Msg WParamLo SB ENDSCROLL then begin 获得鼠标位置对应的列 ItemIndex ItemAtPos Point true Form1 Edit1 Text inttostr ItemIndex inherited end else inherited 当程序接收到 WM VSCROLL 消息 且 WParamLo 参数为 SB ENDSCROLL 时 表示竖 直滚动条停止滚动 就可以用 ItemAtPos 方法确定与鼠标位置对应的 ItemIndex ItemAtPos 方法的 Point 参数是一个 TPoint 类型的变量 用来保存鼠标的位置 3 定义方法 ListBoxMouseMove 在鼠标移动时 将当前位置保存在 Point 中 procedure TForm1 ListBoxMouseMove Sender TObject Shift TShiftState X Y Integer begin Point X X Point Y Y end 4 在运行期创建和初始化列表框 并指定列表框的 MouseMove 事件对应上一步定义的 ListBoxMouseMove 方法 在主窗体的 Create 事件中输入下面的代码 begin Point X 0 Point Y 0 创建自定义列表框 List TMyListBox Create Form1 List Parent Form1 List Left 5 List Top 30 List Width 150 List Height 200 for i 0 to 300 do begin List Items Add inttostr i 初始化 end 指定处理 MouseMove 事件的方法 List OnMouseMove ListBoxMouseMove end 其他举例 1 获得 MEMO 中的光标位置 Lops SendMessage memol Handle EM LINEFROMCHAR Memol SelStart 0 光标所在的行 号 Cpos SendMessage meno1 Handle EM LINEINDEX Lpos 0 光标所在的字符位置 LineLength SendMessage memol handle EM LINELENGTH Cpos 0 这行的字符数 2 开关显示器 SendMessage Handle WM SYSCOMMAND SC MONITORPOWER 0 关闭显示器 SendMessage Handle WM SYSCOMMAND SC MONITORPOWER 1 打开显示器 3 有人问我如何让 Memo 翻页 我试了一下 Next sendmessage memo1 handle wm keydown VK NEXT 1 sendmessage memo1 handle wm keyup VK NEXT 1 Prev sendmessage memo1 handle wm keydown VK PRIOR 1 sendmessage memo1 handle wm keyup VK PRIOR 1 参数 hWnd 窗口过程接收消息的窗口句柄 如果此参数为 HWND BROADCAST 则消息被送到系统 的所有顶层窗口 包括无效或不可见的非自身拥有的窗口 被覆盖的窗口和弹出式窗口 消息不被送到子窗口 Msg 指定被发送的消息 wParam 指定附加消息的特定信息 lParam 指定附加消息的特定信息 返回值 返回值返回消息处理的结果 其依赖于所发送的消息 常见问题 1 使用 SendMessage 来实现剪切 复制和粘贴 SendMessage hwnd WM COPY 0 0 SendMessage hwnd WM CUT 0 0 SendMessage hwnd WM PASTE 0 0 2 SendMessage 与 PostMessage 的区别 PostMessage 将消息放入消息队列后马上返回 而 SendMessage 直到窗口过程处理完消息后 才返回 3 SendMessage 发送 WM COPYDATA 消息在进程间传送数据 WM COPYDATA 消息主要目的是允许在进程间传递少量只读
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 46405-2025空间科学数据元数据
- 商铺租赁外墙清洗合同协议2025
- 商场物业费代缴合同协议2025年商业版
- 软件开发测试验收协议2025年
- 全职员工年度薪资调整合同协议2025
- 第6章第1节质量课件-学年人教版物理八年级上册
- 民宿燃气使用安全合同协议2025
- 2025年销售技巧提升专项培训考试试题及答案
- 四方协议还款合同范本
- 土地荒地租用合同范本
- 模切机课件教学课件
- 南昌市总工会招聘工会社会工作者考试真题2024
- 2025年新版交管12123学法减分全部试题及答案和解析
- 老年科医生知识培训内容课件
- 带犬民警警犬技能培训考试题库(含各题型)
- 人工智能+数据安全智能数据加密与解密技术研究报告
- 安全培训厂区车辆课件
- 住宅建筑质量管理体系建设方案
- 公司战略与风险管理第五章风险与风险管理
- 八年级上册《记承天寺夜游》中考真题10篇(分师生版)
- 新疆博物馆课件介绍
评论
0/150
提交评论