windows消息浅析.doc_第1页
windows消息浅析.doc_第2页
windows消息浅析.doc_第3页
windows消息浅析.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在PB中使用Windows消息(一)Wm_syscommand参数使用消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg。它在Windows单元中是这样声明的: hwnd: HWND; / /窗口句柄message: UINT; / /消息常量标识符wParam: WPARAM ; / 32位消息的特定附加信息lParam: LPARAM ; / 32位消息的特定附加信息time: DWORD; / /消息创建时的时间pt: TPoint; / /消息创建时的鼠标位置hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。lParam 通常是一个指向内存中数据的指针。由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的,因此,它们之间可以相互转换。对于我们使用来说,在众多的消息当中,WM_SYSCOMMAND,使用率是最高的,对於WM_SYSCOMMAND,功能表ID指示系统功能表中的哪一项被选中,所参数对应值如下:MF_BYCOMMAND = &H0&MF_BYPOSITION = &H400&SC_ARRANGE = &HF110SC_CLOSE = &HF060SC_HOTKEY = &HF150SC_HSCROLL = &HF080SC_KEYMENU = &HF100SC_MAXIMIZE = &HF030SC_MINIMIZE = &HF020SC_MOVE = &HF012 或 F010SC_NEXTWINDOW = &HF040SC_PREVWINDOW = &HF050SC_RESTORE = &HF120SC_SIZE = &HF000SC_VSCROLL = &HF070SC_TASKLIST = &HF130SC_SCREENSAVE = &HF140下面,介绍一下SC_COLSE、SC_MAXIMIZE、SC_MINIMIZE、SC_MOVE、SC_RESTORE、SC_SIZE、SC_HOTKEY这几个常用参数在PB中的应用:1、SC_CLOSE:61536 执行关闭功能。常用点:屏蔽掉关闭功能,使窗口系统的“X”变成灰色,并且不可用。实现方法:FUNCTION ulong GetSystemMenu(ulong hwnd,ulong bRevert) LIBRARY user32.dll FUNCTION ulong DeleteMenu(ulong hMenu,ulong nPosition,ulong wFlags) LIBRARY user32.dll FUNCTION ulong GetMenuItemCount(ulong hMenu) LIBRARY user32.dll 窗体Open中/ 按命令Long MF_BYCOMMAND = 0Long ll_hwndMenu ll_hwndMenu = GetSystemMenu(handle(this), 0) /得到系统菜单句柄DeleteMenu(ll_hwndMenu, SC_CLOSE, MF_BYCOMMAND) /屏蔽掉关闭功能/也可使用按位置屏蔽,即单击窗口左上脚弹出系统菜单上的位置long MF_BYPOSITION =1024 Long ll_hwndMenu Long value Integer ill_hwndMenu = GetSystemMenu(handle(this), 0) i = GetMenuItemCount(ll_hwndMenu) DeleteMenu (ll_hwndMenu, c - 1, MF_BYPOSITION)有时候,屏蔽掉关闭功能一段时间后,还需要把此功能找回来,那么可以这样实现:Function Ulong AppendMenu(Ulong hMenu ,Ulong wFlags ,Ulong wIDNewItem ,Ref String lpNewItem ) Library User32 Alias For AppendMenuA Function Ulong GetMenuString(Ulong hMenu ,Ulong wIDItem , Ref String lpString,Ulong nMaxCount,Ulong wFlag ) Library User32 Alias For GetMenuStringA按钮Cb_back click事件中:Long ll_hwndMenuLong WM_NCLBUTTONDOWN = 161Long HTCAPTION = 2 String ls_closeLl_hwndMenu = GetSystemMenu(handle(Parent), 0) ls_str = 我要关闭AppendMenu(hwndMenu, 0, 61536, ls_close) /添加关闭功能/* 此处需注意,上步操作虽然成功的添加了关闭功能,但加回去之後X仍是暗灰色,要等到我们做了某些固定的动作之後如单击下状态栏,它才会再度变Enable的颜色,所以,模拟一个单击状态栏的操作,使得X出现Enable的颜色。 Ps:此时,单击窗口左上脚弹出系统菜单,你会发现,原来的“关闭”字样变成了“我要关闭”*/Send(handle(Parent), WM_NCLBUTTONDOWN, HTCAPTION,0)引申:SC_MAXIMIZE、SC_MINIMIZE、SC_MOVE、SC_RESTORE、SC_SIZE这个功能参数也可同样适用。如:下面的语句能实现屏蔽掉拖拽窗口移动功能DeleteMenu(ll_hwndMenu, SC_MOVE, MF_BYCOMMAND)下面的语句屏蔽掉size窗口大小的功能,此时拉动窗口边框不能改变大小,但仍支持Max 和 MinDeleteMenu(ll_hwndMenu, SC_SIZE, MF_BYCOMMAND)2、SC_MOVE 61456、61458(分为客户区和非客户区,非客户区= 客户区 + HTCAPTION HTCAPTION = 2)窗口移动常用点:屏蔽窗口拖动和拖动非状态栏移动窗口实现方法:屏蔽窗口拖动 / 可使用上面禁止关闭功能的办法禁止拖动,也可使用下面的办法:窗口other事件中:/* 注意,要把客户区和非客户区的两种移动方法全部屏蔽才能彻底屏蔽,如果单屏蔽掉非客户区 61458,那在窗口系统菜单中仍可移动窗口 */If wparam = 61456 or wparam = 61458 Then Message.Processed = TrueMessage.ReturnValue=0End If引申:也可以使用同样的办法来屏蔽掉带有titlebar的dw的拖动拖动非状态栏移动窗口比如拖动一图片拖动所在窗口,图片控件上自定义事件,ue_drag,ID:pbm_lbuttondownLong WM_SYSCOMMAND = 274 Long SC_MOVE = 61458 / or = 61456Send ( Handle( parent ), WM_SYSCOMMAND, SC_MOVE, 0 )引申:通过更换sc_move可实现其他系统功能相关的操作。如下面语句实现指定数据窗口的最大化:Send(Handle(dw_1), WM_SYSCOMMAND, SC_MAXIMIZE, 0)下面语句实现指定数据窗口的最小化:Send(Handle(dw_1), WM_SYSCOMMAND, SC_MINIMIZE, 0)下面语句恢复指定数据窗口的默认大小 Send(Handle(dw_1), WM_SYSCOMMAND, SC_RESTORE, 0)3、SC_HOTKEY 61776 系统热键常用点:为系统注册些热键值,方便操作下例中为窗口注册热键 Ctrl + Alt + X,实现窗口在最小化时,还原窗口大小实现方法:function long SendMessageA(long lhWnd,uint uiMsg,long lwMsg,long lwParam) library user32.dllPublic:Constant Long WM_SETHOTKEY = 50 Constant Long HK_MYHOTKEY = 1624 /热键参数值 Ctrl + Alt + XConstant Long SC_HOTKEY = 61776Constant Long WM_SYSCOMMAND = 274 Constant Long SC_RESTORE = 61728/ Open事件中long ll_rtnll_rtn = SendMessageA(Handle(this), WM_SETHOTKEY, HK_MYHOTKEY, 0)If ll_rtn 1 Thenmessagebox(注册失败,注册热键失败,无法使用热键服务)End If/ Other事件中IF wparam = SC-HOTKEY THEN Send(Handle(This), WM_SYSCOMMAND, SC_RESTORE, 0)END IF备注:想注册热键键值的获得办法:高8位字节与低8位字节组成16位字节,然后将它换算成十进制数,即得到所需的HK-MYHOTK

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论