大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 拦截Windows消息

拦截Windows消息

时间: 2021-07-31 作者:daque

c++ builder不愧为borland公司的特出产物,用它来开拓windows步调特殊赶快高效,但在编制程序进程中你也会创造它的少许控制性,让你没辙实行本人的办法。比方你没辙在窜改表单的体例菜单;比方运用盯梢栏时,你找不到starttrack和endtrack事变,而偏巧你的步调须要这两个事变。windows api编制程序中,你就不会有那些烦恼,只需处置一下wm_syscommand和wm_hscroll(或wm_vscroll)动静,就能实行上述功效。windows api的缺陷是编制程序格外烦恼,太多的功夫要耗在详细上头,但它的功效却是最宏大的。c++ builder的vcl在功效上不过它的一个子集,由于vcl是在api的普通上封装的,封装时唾弃了少许不常用到的功效。然而步调员的设想力没有被封装,她们总怀着更大的关切去实行标新立异的办法,窜改体例菜单和给盯梢栏减少starttrack和endtrack事变不过个中的小花招罢了。然而vcl并没有那些功效,如何办?   好在,borland公司没有把路堵死,而是留了个方便之门——承诺步调员本人阻挡并处置windows动静,就象api编制程序一律。所以,方法有了... ------ 本领 拦截Windows消息须要以次几步: 在表单头文献内(如unit1.h) 1. 在类证明中创造动静映照表,把某条动静的处置权交给自设置的动静处置因变量。 begin_message_map message_handler(windows动静名,tmessage,动静处置因变量名) message_handler(...) end_message_map(tform) 2. 在类证明的private区内证明动静处置因变量。 private: // user declarations void __fastcall 动静处置因变量名(tmessage &message); 在表单文献内(如unit1.cpp) 3. 写出动静处置因变量,在这边实行你须要的功效。比方 void __fastcall mainform::onwmhscroll (tmessage &message) { ... // 在此介入你本人的代码 tform::dispatch(&message); } ------ 证明 1. 对于tmessage tmessage是vcl预订义的构造,设置如次: struct tmessage { unsigned int msg; //动静 int wparam; //字参数 int lparam; //长字参数 int result; //动静截止 }; 2. 对于tform::dispatch(&message)   自设置的动静处置因变量结束最佳加一句tform::dispatch(&message),这一句的效率是让动静连接传播下来。即使没有这一句,动静将被实足阻挡,vcl类大概因为得不到动静而没辙实行平常功效。 ------ 范例一:窜改体例菜单    有少许步调,主窗口很小,菜单也没有,即使想介入对于或树立对话框,最佳的方法是拿体例菜单动手术。windows api编制程序中,窜改体例菜单与实行其余功效一律,不太简单,也不会太难。但在c++ builder中,表单类(tform)没有供给相关体例菜单的任何属性与本领,实行其余功效轻而易举,而窜改体例菜单犹如难于上苍天。    还好,borland公司承诺步调员自已处置window动静,所以时机来了! 一、用window api因变量窜改体例菜单   假设表单名为mainform,树立mainform::oncreate()因变量: 用getsystemmenu(mainform->handle,false)博得体例菜复句柄; 用appendmenu,deletemenu,modifymenu因变量窜改体例菜单,把新的id号赋于自设置的菜单项。   这时候运路途序,不妨看到体例菜单也被窜改,但自设置的菜单项却不许被相应。 二、阻挡wm_syscommand动静以相应自设置的菜单项 在表单头文献内(如unit1.h) 在表单类设置结束介入动静相应表,博得wm_syscommand动静的处置权 begin_message_map message_handler(wm_syscommand,tmessage,onwmsyscommand) end_message_map(tform) 在表单类设置的private区内介入动静处置因变量证明 private: // user declarations void __fastcall onwmsyscommand(tmessage& message); 在表单文献内(如unit1.h) 写出动静相应因变量 void __fastcall tform1::onwmsyscommand(tmessage& message) { if(message.wparam==id_sysmenu_myitem) { // your code here, do something } tform::dispatch(&message); } 三、完备步调示例 范例二:给盯梢栏减少onstarttrack和onendtrack事变   当盯梢栏用来进度遏制时,onstarttrack和onendtrack很大概是你须要的事变。比方在遏制多媒介播放进度的场所,当用户挪动滑块时,你须要onstarttrack事变让播放遏止,须要onendtrack事变定位新的播放场所。但borland公司没有供给这两个事变,我等编制程序喜好者只好白手起家,打拦截Windows消息的办法了。 一、阻挡wm_hscroll动静,给盯梢栏减少onstarttrack和onendtrack事变 在表单头文献内(如unit.h) 在表单类设置结束介入动静相应表,把wm_hscroll动静处置权交给onwmhscroll因变量。 begin_message_map message_handler(wm_hscroll,tmessage,onwmhscroll) end_message_map(tform) 在表单类设置的private区内介入onwmhscroll因变量证明。 private: // user declarations void __fastcall onwmhscroll(tmessage &message); 在表单类设置的private区内介入starttrack和endtrack因变量证明。 private: // user declarations void __fastcall trackbar1starttrack(tobject *sender); void __fastcall trackbar1endtrack(tobject *sender); 在表单文献内(如unit.cpp) 写出onwmhscroll因变量,使它能按照动静参数挪用starttrack和endtrack因变量,在本质意旨上爆发onstarttrack和onendtrack事变。 写出starttrack和endtrack因变量。 即使是笔直盯梢栏,把上头的wm_hscroll改为wm_vscroll即可。 煞尾   borland c++ builder编制程序中,拦截Windows消息是一项高档编制程序本领,能让你尽管发掘windows的后劲,更加让曾用api编制程序的步调员感触心慰。拦截Windows消息是api纵情表现的戏台,当vcl不许为你做什么时,请想起底层的api。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.