Windows消息机制要点
1. 窗口过程每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wParam, lParam), 当窗口收到消息时系统就会调用此窗口过程来处理消息。(所以叫回调函数)
2消息类型
1)系统定义消息(System-Defined Messages)
在SDK中事先定义好的消息,非用户定义的,其范围在[0x0000, 0x03ff]之间, 可以分为以下三类:
1>窗口消息(Windows Message)
与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。可以是一般的窗口,也可以是Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...
2>命令消息(Command Message)
与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。
WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。如果是控件, HIWORD(wParam)表示控件消息类型
3>控件通知(Notify Message)
控件通知消息, 这是最灵活的消息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。NMHDR包含控件通知的内容, 可以任意扩展。
2)程序定义消息(Application-Defined Messages)
用户自定义的消息, 对于其范围有如下规定:WM_USER: 0x0400-0x7FFF (ex. WM_USER+10) WM_APP(winver>4.0): 0x8000-0xBFFF (ex.WM_APP+4)
RegisterWindowMessage: 0xC000-0xFFFF
3消息队列(Message Queues)
Windows中有两种类型的消息队列
1)系统消息队列(System Message Queue)
这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理
2)线程消息队列(Thread-specific Message Queue)
每一个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数时才会创建,默认不创建)。然后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理.注意: 线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其他消息的时候才会被处理,WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出(FIFO)的方式被处理。
4队列消息(Queued Messages)和非队列消息(Non-Queued Messages)
1)队列消息(Queued Messages)
消息会先保存在消息队列中,消息循环会从此队列中取消息并分发到各窗口处理如鼠标,键盘消息。
2)非队列消息(NonQueued Messages)
消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理
如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED注意: postMessage发送的消息是队列消息,它会把消息Post到消息队列中; SendMessage发送的消息是非队列消息, 被直接送到窗口过程处理
5 PostMessage(PostThreadMessage), SendMessage PostMessage:把消息放到指定窗口所在的线程消息队列中后立即返回。 PostThreadMessage:把消息放
到指定线程的消息队列中后立即返回。
SendMessage:直接把消息送到窗口过程处理, 处理完了才返回。
6 GetMessage, PeekMessage
PeekMessage会立即返回可以保留消息
GetMessage在有消息时返回会删除消息
7 TranslateMessage, TranslateAccelerator TranslateMessage: 把一个virtual-key消息转化成字符消息(character message),并放到当前线程的消息队列中,消息循环下一次取出处理。
TranslateAccelerator: 将快捷键对应到相应的菜单命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快捷键表中相应的WM_COMMAND 或WM_SYSCOMMAND消息, 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口过程处理, 处理完后才会返回。
8(消息死锁( Message Deadlocks)
假设有线程A和B, 现在有以下下步骤1) 线程A SendMessage给线程B, A等待消息在线程B中处理后返回2) 线程B收到了线程A发来的消息,并进行处理, 在处理过程中,B也向线程A SendMessgae,然后等待从A返回。
因为此时, 线程A正等待从线程B返回, 无法处理B发来的消息, 从而导致了线程A,B相互等待, 形成死锁。多个线程也可以形成环形死锁。
可以使用 SendNotifyMessage或SendMessageTimeout来避免出现死锁。
9 BroadcastSystemMessage
我们一般所接触到的消息都是发送给窗口的, 其实, 消息的接收者可以是多种多样的,它可以是应用程序(applications), 可安装驱动(installable drivers), 网络设备(network drivers), 系统级设备驱动(system-level device drivers)等,BroadcastSystemMessage这个API可以对以上系统组件发送消息。
为什么不支持多重继承:依据Sun的官方说法是,避免c++那样管理多重继承的层次关系而带来的复杂性
(主要是在多态覆盖方法的时候采用的动态绑定机制),换成用接口来实现多重继承的大部分功能,一个
类只能有一个父类,但可以有多个接口,以此对多继承提供了有力的支持。
2.类中声明了系统可以提供的服务,类似于电路中的模块,但是不包含具体的实现。例如:
public interface Photographable{ public void takePhoto(); } |
3.接口中的成员变量默认都是public、static、final类型,因此必须被显示初始化。方法默认都是
public、abstract。这是必须遵守的。
4.接口没有构造方法,不能被实例化。
5.一个接口不能实现另一个接口,但是它可以继承多个接口。例如:
public interface C extends A,B{ void methodC(); } |
6.接口必须通过类来实现它的抽象方法,例如:
public class Glass implements Transparency{...} |
要是一个类要实现某个接口时,它必须实现接口中所有的抽象方法,除非这个类被定义为抽象类。
7.允许定义接口类型的引用变量去引用实现了该接口的类的实例:
Transparency t=new Glass(); |
8.抽象类与接口都是位于继承树的上方,都不能被实例化,都可以包含抽象方法。但前者可以提供默认实
现,而后者则必须包含抽象方法。接口一旦确定就不能随意改动了,否则就带来太大的麻烦。接口不要求
它的实现类在语义上是同一种类型,所以要是非同类型的相同方法类型则使用接口,利于继承树的合理化
。接口是系统最高层次的抽象类型。而抽象类则是介于“抽象”和“实现”之间的半成品,抽象类力所能
及地完成了部分实现。定制模式就是一种接口颗粒度细化的设计模式。
9.适配器模式:
当两个系统的接口不匹配的时候使用。采用组合关系来实现较好。这就类似于平时使用的笔记本电脑适配
器。而在JAVA中有许多实现了接口的默认适配器类,例如MouseListener提供了一个默认适配器
MouseAdapter类,继承这个类然后覆盖相应方法即可。
10.代理模式:
代理的共同特征是可以替代委托人去和第三方通信,对信息进行初步判断后转发或过滤消息,但是不能取
代委托人的任务。常用于对象分布在不同的机器上时,为了节约通信而进行的本地代理。
11.标志类型模式:
作为某种东西,比如食物,而单独抽象出来的一个接口(里面是空的),在方法中只有传入该类型的变量
才允许。也就是说,保护了方法的可实施性。在JAVA中的两个典型例子是,java.io.Serialize接口和
java.io.Remote接口。
12.常量接口模式:
相关的常量放在专门的一个常量接口中定义,使用import static XXX进行静态引用。
在我们用cms时经常会出现这样那样的错误哦,下面我在用动易时出来这种错误下面我们来看看这个问题原因分析与解决办法吧。
错误信息:
Microsoft VBScript 编译器错误 错误 '800a03f6'
缺少 'End' /iisHelp/common/500-100.asp,行242
请求对象 错误 'ASP 0107 : 80004005'
堆栈溢出
D:WWWROOTWZYUYING_COMPOWEREASYADMIN../Start.asp,行172
处理中的数据超过允许的极限。
解决方法:服务器200K限制,解决方法:到官网看看吧。
解决:在循环标签中,parentid="@RequestInt_id"其值@RequestInt_id在这里循环需要用{PE.field fieldname="NodeID" /},即改成:
{PE.Label id="普通图片列表标签" tablename="PE_U_Article" parentid="{PE.field fieldname="NodeID" /}" shownum="10" border="0" titlelen="24" /}
<div class="bbox">
<dl>
<!-- 栏目循环列表开始 -->
{PE.DataSource id="categorylist" datasource="栏目循环列表" parentid="@RequestInt_id" page="true"
pagesize="20" pagemain="true" urlpage="true" xslt="true" /}
{PE.Repeat id="categorylist" loop="10"}
<dt>{PE.Field id="categorylist" fieldname="NodeLink" /}
</dt>
<dd>
<ul>
{PE.Label id="普通图片列表标签" tablename="PE_U_Article" parentid="@RequestInt_id" shownum="10" border="0" titlelen="24" /} </ul>
</dd>
{/PE.Repeat}
<!-- 栏目循环列表结束 -->
</dl>
</div>
绑定栏目目录
我们需要将这个二级域名绑定到栏目目录中去,因为我们需要绑定的栏目在根目录的edu文件夹下面,我们可以通过http://www.111cn.net来进行访问,所以我们将edu这个二级域名绑定到这个目录中去,如果是虚拟主机需要有绑定二级域名到栏目的功能,这里我就举例说明:
图片3
第三步:系统后台设置
接下来我们来设置系统后台,我们在栏目设置中来绑定二级域名,我们在系统后台[核心]-[网站栏目管理]中编辑“站长学院”这个栏目的信息。我们在高级选项部分先启用多站点支持,并且绑定域名为asp.111cn.net">http://asp.111cn.net。(需加 http://,一级或二级域名的根网址)
图片4
启用了二级域名之后,我们需要指定内容页的模板为{style}/article_article_frame.htm,以避免某些功能无法使用。同时我们需要进入系统后台,进入[系统]-[系统基本参数],在核心设置中,将“(是/否)支持多站点,开启此项后附件、栏目连接、arclist内容启用绝对网址”这个选项开启。
图片5
这样我们就完成了二级域名的设置。
5. 生成与访问
至此我们已经完成了我们的设置,接下来我们需要生成网站内容,需要更新栏目页的HTML以及内容页的HTML,我们可以通过php.111cn.net">http://php.111cn.net访问查看二级域名的效果。
相关文章
- VPN可以虚拟出一个专用网络,让远处的计算机和你相当于处在同一个局域网中,而中间的数据也可以实现加密传输,用处很大,特别是在一些大公司,分公司处在不同的区域。...2016-01-27
- 这篇文章主要介绍了Windows批量搜索并复制/剪切文件的批处理程序实例,需要的朋友可以参考下...2020-06-30
- 这篇文章主要为大家详细介绍了C#创建一个简单windows窗体应用的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了Powershell 查询 Windows 日志的方法,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了jquery自定义插件开发之window的实现过程的相关资料,需要的朋友可以参考下...2016-05-09
- 这篇文章主要介绍了C#实现windows form限制文本框输入的方法,涉及C#限制文本框输入的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 本文实例讲述了JS实现不使用图片仿Windows右键菜单效果代码。分享给大家供大家参考,具体如下:这里演示JS不使用图片仿Windows右键菜单效果,这款代码灵活使用了文鼎字,配合CSS和JS做出了这个和系统右键菜单很相似的东东。...2015-10-23
C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法
这篇文章主要介绍了C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法,结合实例形式分析了GetDesktopWindow函数用于获取窗口句柄的具体使用方法与相关注意事项,需要的朋友可以参考下...2020-06-25- 作为一个新生事物,Linux吸引了不少眼球,但是它能否快捷、方便地与Windows资源共享,是一个很重要的问题。大家知道,Windows之间可以利用“网络邻居”来实现资源共享,而Linux...2016-11-25
- 这篇文章主要介绍了利用C#修改Windows操作系统时间,帮助大家更好的利用c#操作系统,感兴趣的朋友可以了解下...2020-12-08
- 本篇文章主要介绍了详解Windows下安装Nodejs步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...2017-05-22
C#3.0使用EventLog类写Windows事件日志的方法
这篇文章主要介绍了C#3.0使用EventLog类写Windows事件日志的方法,以简单实例形式分析了C#写windows事件日志的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25浅谈vue 组件中的setInterval方法和window的不同
这篇文章主要介绍了浅谈vue 组件中的setInterval方法和window的不同,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30Windows Server 2012 R2或2016无法安装.NET Framework 3.5.1的解决方法
这篇文章主要为大家详细介绍了Windows Server 2012 R2或2016无法安装.NET Framework 3.5.1,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-07-06- 这篇文章主要介绍了C#实现控制Windows系统关机、重启和注销的方法,涉及C#调用windows系统命令实现控制开机、关机等操作的技巧,非常简单实用,需要的朋友可以参考下...2020-06-25
Windows Server 2016 上配置 APACHE+SSL+PHP+perl的教程详解
Windows Server 2016 上配置 APACHE+SSL+PHP+perl怎么配置?小编推荐了一篇介绍Windows Server 2016 上配置 APACHE+SSL+PHP+perl的教程,有需要的同学快来看看吧! ...2017-07-06- 下面小编就为大家带来一篇jquery自定义插件——window的实现【示例代码】。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-09
- web打印 window.print()介绍,需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了Windows窗口消息,以实例形式详细罗列了Windows窗口消息,非常具有实用价值,需要的朋友可以参考下...2020-04-25
- rsync是linux下功能强大的同步软件。现在在windows下也可以使用rsync(cwrsync)来同步数据了...2016-01-27