windows消息浅析.doc

上传人:hw****26 文档编号:3172939 上传时间:2019-05-24 格式:DOC 页数:5 大小:47.50KB
下载 相关 举报
windows消息浅析.doc_第1页
第1页 / 共5页
windows消息浅析.doc_第2页
第2页 / 共5页
windows消息浅析.doc_第3页
第3页 / 共5页
windows消息浅析.doc_第4页
第4页 / 共5页
windows消息浅析.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、在 PB 中使用 Windows 消息(一)Wm_syscommand 参数使用消息,就是指 Windows 发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使 Windows 发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做 TMsg。它在 Windows 单元中是这样声明的: hwnd: HWND; / /窗口句柄message: UINT; / /消息常量标识符wParam: WPARAM ; / 3

2、2 位消息的特定附加信息lParam: LPARAM ; / 32 位消息的特定附加信息time: DWORD; / /消息创建时的时间pt: TPoint; / /消息创建时的鼠标位置hwnd 32 位的窗口句柄。窗口可以是任何类型的屏幕对象,因为 Win32 能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。message 用于区别其他消息的常量值,这些常量可以是 Windows 单元中预定义的常量,也可以是自定义的常量。wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。lParam 通常是一个指向内存中数据的指针。由于 W P a r a m、l P a

3、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 =

4、 &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 执行关闭功能。常用点:屏蔽掉关闭功能,使

5、窗口系统的“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_hw

6、ndMenu 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 (l

7、l_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,Ul

8、ong 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“仍是

9、暗灰色,要等到我们做了某些固定的动作之後如单击下状态栏,它才会再度变 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, M

10、F_BYCOMMAND)下面的语句屏蔽掉 size 窗口大小的功能,此时拉动窗口边框不能改变大小,但仍支持Max 和 MinDeleteMenu(ll_hwndMenu, SC_SIZE, MF_BYCOMMAND)2、SC_MOVE 61456、61458(分为客户区和非客户区,非客户区= 客户区 + HTCAPTION HTCAPTION = 2)窗口移动常用点:屏蔽窗口拖动和拖动非状态栏移动窗口实现方法:屏蔽窗口拖动 / 可使用上面禁止关闭功能的办法禁止拖动,也可使用下面的办法:窗口 other 事件中:/* 注意,要把客户区和非客户区的两种移动方法全部屏蔽才能彻底屏蔽,如果单屏蔽掉非客

11、户区 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 ),

12、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 系统热键常用点:为系统注册些热键值,方便操作下例中

13、为窗口注册热键 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 Consta

14、nt 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 THENSend(Handle(This), WM_SYSCOMMAND, SC_RESTORE, 0)END IF备注:想注册热键键值的获得办法:高 8 位字节与低 8 位字节组成 16 位字节,然后将它换算成十进制数,即得到所需的HK-MYHOTKEY 值。高 8 位字节值为一些辅助键(Control、Alt、Shift 等),低 8 位字节为使用键的 ASCII 码。如果我们要使用 CtrlAltA 作为热键,则 A=65,转换成十六进制为 41,CtrlAlt=24=6,转换成十六进制仍然是 6,两则组合即为 641,再重新转换回十进制得到 1601。至此本文结束后记:我也是最近才对 windows 系统消息产生的兴趣,正在一点一点的学习,随后把使用后的心得写出来与大家分享,之后,将继续与大家探讨学习。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。