Rise的自留地

记录生活中的点滴,分享编程技术和游戏开发经验。

0%

一、底层开发包和工具
1. ::URL::http://www.mesa3d.org
Mesa 是一个类OpenGL( ::URL::http://www.opengl.org  )的开源实现。
2. ::URL::http://openil.sourceforge.net
DevIL (即以前的OpenIL)是一个跨平台的图形处理包,支持
BMP、JPG、GIF 等多种图形文件格式。
二、2D 游戏开发包
1. ::URL::http://www.libsdl.org/
::URL::http://www-900.ibm.com/developerWorks/cn/linux/theme/special/
SDL(Simple DirectMedia Layer)是一个跨平台的多媒体和游戏开
发包,提供2D、音频、事件驱动、多线程和定时器等服务,并有大
量的扩充开发包,如TCP/IP 网络、游戏角色、混音等。SDL 是用C
开发的,但也有Perl、PHP、Delphi 等多种语言的版本。
2. ::URL::http://www.clanlib.org
ClanLib 是一个通用的C++游戏开发包,提供游戏资源操作、网络
对象处理、GUI 主题和游戏脚本等支持。支持Windows 和Linux。
PMT Files – Open Source Game Development
三、3D 引擎和游戏开发包
1. ::URL::http://crystal.sourceforge.net/
Crystal Space 是一个用C++开发的3D 游戏开发包。有丰富的
功能,支持Direct3D、OpenGL、Glide 等。
2. ::URL::http://ogre.sourceforge.net/
OGRE 是一个面向对象的3D 引擎,支持DirectX、OpenGL 和
Glide 等。
3. ::URL::http://hem.passagen.se/opengl/glfw/
GLFW 是一个OpenGL 的应用框架,支持Linux 和Windows。
4. ::URL::http://apocalyx.sourceforge.net/
Apocalyx 是一个基于OpenGL 的3D 引擎。
5. ::URL::http://www.faktiss.net/
Nive 是一个C++ 3D 引擎,基于OpenGL 和
DevIL,支持Windows 和Linux/Xwindow。
6. ::URL::http://plib.sourceforge.net/
Plib 是一个3D 游戏开发包。
7. ::URL::http://alleg.sourceforge.net/ Allegro 是一个跨平台的C/C++游戏开发包,提供2D、3D、声效、用
户输入、文件、压缩、GUI 等功能。
PMT Files – Open Source Game Development
四、游戏和游戏框架
1. ::URL::http://www.freecraft.org/
FreeCraft 是一个实时战略游戏(RTS)框架。
2. ::URL::http://www.worldforge.org/ Worldforge 是一个完整的大型网络RPG 游戏框架。
3. ::URL::http://arianne.info/
Arianne 是一个大型网络RPG 游戏,同时也是一个游戏框架。
五、其他
1. ::URL::http://openai.sourceforge.net/ OpenAI 是一个人工智能的工具包,包括神经网络、遗传算
法、有限状态机等。
一、英文网站
1. ::URL::http://www.flipcode.com/
Daily Game Development News & Resources
2. ::URL::http://www.gamedev.net/
All Your Game Development Needs
3. ::URL::http://www.gamedeveloper.net/
4. ::URL::http://www.gametutorials.com/
Game Programming with Personality, From Start to Finish
5. ::URL::http://www.cfxweb.net/
Demo & Game Development
6. ::URL::http://www.gdse.com
The Game Programming and Design Search Engine
7. ::URL::http://www.2dgame-tutorial.com
8. ::URL::http://www.gamasutra.com/
CMP - The Art & Science of Making Games
9. ::URL::http://www.gdmag.com/
CMP - Game Developer Magazine
二、中文网站
1. ::URL::http://www.gameres.com/
中文游戏开发技术资料和交流
2. ::URL::http://mays.soage.com/
中国游戏开发者
3. ::URL::http://www.gpgame.net
金点工作室
4. ::URL::http://www.codingnow.com
云风工作室
5. ::URL::http://lightwing.myrice.com/
琴心剑胆
6. ::URL::http://www.diamondgarden.net/
钻石花园
7. ::URL::http://www.joynb.com/
无名鸟游戏工作室
8. ::URL::http://www.npc6.com/
何苦做游戏,游戏制作的文化
PMT Files – Game Development Website
三、Linux 游戏及其开发网站
1. ::URL::http://www.happypenguin.org
The Linux Game Tome
2. ::URL::http://linuxgames.com/
Linux Games - For the people
3. ::URL::http://h.webring.com/webring?ring=linuxgp;list
Linux Game Programming Webring

  • 优化
  • /O1 最小化空间 minimize space
  • /Op[-] 改善浮点数一致性 improve floating-pt consistency
  • /O2 最大化速度 maximize speed
  • /Os 优选代码空间 favor code space
  • /Oa 假设没有别名 assume no aliasing
  • /Ot 优选代码速度 favor code speed
  • /Ob 内联展开(默认 n=0) inline expansion (default n=0)
  • /Ow 假设交叉函数别名 assume cross-function aliasing
  • /Od 禁用优化(默认值) disable optimizations (default)
  • /Ox 最大化选项。(/Ogityb2 /Gs) maximum opts. (/Ogityb1 /Gs)
  • /Og 启用全局优化 enable global optimization
  • /Oy[-] 启用框架指针省略 enable frame pointer omission
  • /Oi 启用内建函数 enable intrinsic functions
  • 代码生成
  • /G3 为 80386 进行优化 optimize for 80386
  • /G4 为 80486 进行优化 optimize for 80486
  • /GR[-] 启用 C++ RTTI enable C++ RTTI
  • /G5 为 Pentium 进行优化 optimize for Pentium
  • /G6 为 Pentium Pro 进行优化 optimize for Pentium Pro
  • /GX[-] 启用 C++ 异常处理(与 /EHsc 相同) enable C++ EH (same as /EHsc)
  • /EHs 启用同步 C++ 异常处理 enable synchronous C++ EH
  • /GD 为 Windows DLL 进行优化 optimize for Windows DLL
  • /GB 为混合模型进行优化(默认) optimize for blended model (default)
  • /EHa 启用异步 C++ 异常处理 enable asynchronous C++ EH
  • /Gd __cdecl 调用约定 __cdecl calling convention
  • /EHc extern "C"默认为 nothrow extern “C” defaults to nothrow
  • /Gr __fastcall 调用约定 __fastcall calling convention
  • /Gi[-] 启用增量编译 enable incremental compilation
  • /Gz __stdcall 调用约定 __stdcall calling convention
  • /Gm[-] 启用最小重新生成 enable minimal rebuild
  • /GA 为 Windows 应用程序进行优化 optimize for Windows Application
  • /Gf 启用字符串池 enable string pooling
  • /QIfdiv[-] 启用 Pentium FDIV 修复 enable Pentium FDIV fix
  • /GF 启用只读字符串池 enable read-only string pooling
  • /QI0f[-] 启用 Pentium 0x0f 修复 enable Pentium 0x0f fix
  • /Gy 分隔链接器函数 separate functions for linker
  • /GZ 启用运行时调试检查 enable runtime debug checks
  • /Gh 启用钩子函数调用 enable hook function call
  • /Ge 对所有函数强制堆栈检查 force stack checking for all funcs
  • /Gs[num] 禁用堆栈检查调用 disable stack checking calls
  • 输出文件
  • /Fa[file] 命名程序集列表文件 name assembly listing file
  • /Fo 命名对象文件 name object file
  • /FA[sc] 配置程序集列表 configure assembly listing
  • /Fp 命名预编译头文件 name precompiled header file
  • /Fd[file] 命名 .PDB 文件 name .PDB file
  • /Fr[file] 命名源浏览器文件 name source browser file
  • /Fe 命名可执行文件 name executable file
  • /FR[file] 命名扩展 .SBR 文件 name extended .SBR file
  • /Fm[file] 命名映射文件 name map file
  • 预处理器
  • /FI 命名强制包含文件 name forced include file
  • /C 不吸取注释 don’t strip comments
  • /U 移除预定义宏 remove predefined macro
  • /D{=|#} 定义宏 define macro
  • /u 移除所有预定义宏 remove all predefined macros
  • /E 将预处理定向到标准输出 preprocess to stdout
  • /I 添加到包含文件的搜索路径 add to include search path
  • /EP 将预处理定向到标准输出,不要带行号 preprocess to stdout, no #line
  • /X 忽略"标准位置" ignore “standard places”
  • /P 预处理到文件 preprocess to file
  • 语言
  • /Zi 启用调试信息 enable debugging information
  • /Zl 忽略 .OBJ 中的默认库名 omit default library name in .OBJ
  • /ZI 启用调试信息的"编辑并继续"功能 enable Edit and Continue debug info
  • /Zg 生成函数原型 generate function prototypes
  • /Z7 启用旧式调试信息 enable old-style debug info
  • /Zs 只进行语法检查 syntax check only
  • /Zd 仅要行号调试信息 line number debugging info only
  • /vd{0|1} 禁用/启用 vtordisp disable/enable vtordisp
  • /Zp[n] 在 n 字节边界上包装结构 pack structs on n-byte boundary
  • /vm 指向成员的指针类型 type of pointers to members
  • /Za 禁用扩展(暗指 /Op) disable extensions (implies /Op)
  • /noBool 禁用bool关键字 disable “bool” keyword
  • /Ze 启用扩展(默认) enable extensions (default)
  • 杂项
  • /?, /help 打印此帮助消息 print this help message
  • /c 只编译,不链接 compile only, no link
  • /W 设置警告等级(默认 n=1) set warning level (default n=1)
  • /H 最大化外部名称长度 max external name length
  • /J 默认 char 类型是 unsigned default char type is unsigned
  • /nologo 取消显示版权消息 suppress copyright message
  • /WX 将警告视为错误 treat warnings as errors
  • /Tc 将文件编译为 .c compile file as .c
  • /Yc[file] 创建 .PCH 文件 create .PCH file
  • /Tp 将文件编译为 .cpp compile file as .cpp
  • /Yd 将调试信息放在每个 .OBJ 中 put debug info in every .OBJ
  • /TC 将所有文件编译为 .c compile all files as .c
  • /TP 将所有文件编译为 .cpp compile all files as .cpp
  • /Yu[file] 使用 .PCH 文件 use .PCH file
  • /V 设置版本字符串 set version string
  • /YX[file] 自动的 .PCH 文件 automatic .PCH
  • /w 禁用所有警告 disable all warnings
  • /Zm 最大内存分配(默认为 %) max memory alloc (% of default)
  • 链接
  • /MD 与 MSVCRT.LIB 链接 link with MSVCRT.LIB
  • /MDd 与 MSVCRTD.LIB 调试库链接 link with MSVCRTD.LIB debug lib
  • /ML 与 LIBC.LIB 链接 link with LIBC.LIB
  • /MLd 与 LIBCD.LIB 调试库链接 link with LIBCD.LIB debug lib
  • /MT 与 LIBCMT.LIB 链接 link with LIBCMT.LIB
  • /MTd 与 LIBCMTD.LIB 调试库链接 link with LIBCMTD.LIB debug lib
  • /LD 创建 .DLL Create .DLL
  • /F 设置堆栈大小 set stack size
  • /LDd 创建 .DLL 调试库 Create .DLL debug libary
  • /link 链接器选项和库 linker options and libraries

《Advanced Animation with DirectX》

这本书主要讲的是怎样用DirectX9来完成游戏中的动画,主要是移动、骨骼动画等等,也涉及了不少的3d模型的知识。这本书起步比较的高,没有讲太多的DirectX9的基础,但是章节安排得十分合理,由简入难,是一本初学者和高手都比较适用的书。

其实很简单,但如像我一样不怎么用UltraEdit的朋友们来说,可能不太清楚。首先去UltraEdit的官网下载支持Lua的Wordfiles文件(这里),是个文本文件(lua.txt)。打开UltraEdit安装目录下的wordfile.txt,把lua.txt文件中的内容拷贝粘贴到wordfile.txt的末尾,存盘,OK,于是UltraEdit语法高亮项多出Lua一项,可以选择使用了。其他语言的语法高亮支持与此类似。

直接贴代码吧,保存成**.reg,导入就可以了,感谢cnnod32cn.cn提供服务器.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Eset\Nod\CurrentVersion\Modules\Update\Settings]

“PROFILES_ENABLED”=dword:00000000

“DefaultServerCount”=dword:00000005

“DefaultServer0”=“ http://u1.cnnod32.cn

“DefaultServer1”=“ http://u2.cnnod32.cn

一个人真正睡着觉最多只有两个钟头,其余都是浪费时间,躺在枕头上做梦,没有哪个人不做梦。至于醒来觉得自己没有做梦,那是因为他忘记了。通常一个人睡两个钟头就够了,为什么有人要睡七、八个钟头?那是你赖床躺在枕头上休息的习惯养成的,并非我们需要那么久的睡眠时间,尤其打坐做功夫的人晓得,正午只要闭眼真正睡着三分钟,等于睡两个钟头,不过要对好正午的时间。夜晚则要在正子时睡着,五分钟等于六个钟头。就这个时间的学问又大了,同宇宙法则、地球法则、易经阴阳的道理有关系,而且你会感觉到,心脏下面硬是有一股力量降下来,与丹田(肾上)的力量融合,所谓“水火既济”,豁然一下,那你睡眠够了,精神百倍。所以失眠或真要夜里熬夜的人,正子时的时刻,哪怕   二十分钟也一定要睡,睡不着也要训练自己睡着。过了正子时大约十二点半以后,你不会想睡了,这很糟糕。更严重的,到了天快亮,四、五点钟,五、六点卯时的时候,你又困得想睡,这时如果一睡,一天都会昏头。所以想从事熬夜工作的人,正子时,即使有天大的事也要摆下来,睡它半小时,到了卯时(7:00)想睡觉千万不要睡,那一天精神就够了。不过失眠的人都挨过十二点,在床上翻来覆去睡不着,结果快天亮睡着了,到第二天下午都昏头昏脑,因此你会感觉失眠、睡眠不足,实际上是你没有经验。
大家可以试试看看效果吧。

消息的接收

消息的接收主要有3个函数:GetMessagePeekMessageWaitMessage

  • GetMessage原型如下:BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax); 该函数用来获取与hWnd参数所指定的窗口相关的且wMsgFilterMin和wMsgFilterMax参数所给出的消息值范围内的消息。需要注意的是,如果hWnd为NULL,则GetMessage获取属于调用该函数应用程序的任一窗口的消息,如果wMsgFilterMin和wMsgFilterMax都是0,则GetMessage就返回所有可得到的消息。函数获取之后将删除消息队列中的除WM_PAINT消息之外的其他消息,至于WM_PAINT则只有在其处理之后才被删除。

什么是消息?

   消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。

   消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做MSG,MSG含有来自windows应用程序消息队列的消息信息,它在Windows中声明如下:

typedef struct tagMsg
{
HWND hwnd; 接受该消息的窗口句柄
UINT message; 消息常量标识符,也就是我们通常所说的消息号
WPARAM wParam; 32位消息的特定附加信息,确切含义依赖于消息值
LPARAM lParam; 32位消息的特定附加信息,确切含义依赖于消息值
DWORD time; 消息创建时的时间
POINT pt; 消息创建时的鼠标/光标在屏幕坐标系中的位置
}MSG;

   消息可以由系统或者应用程序产生。系统在发生输入事件时产生消息。举个例子, 当用户敲键, 移动鼠标或者单击控件。系统也产生消息以响应由应用程序带来的变化, 比如应用程序改变系统字体改变窗体大小。应用程序可以产生消息使窗体执行任务,或者与其他应用程序中的窗口通讯。

   消息中有什么?

   我们给出了上面的注释,是不是会对消息结构有了一个比较清楚的认识?如果还没有,那么我们再试着给出下面的解释:

   hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。

   message用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。消息标识符以常量命名的方式指出消息的含义。当窗口过程接收到消息之后,他就会使用消息标识符来决定如何处理消息。例如、WM_PAINT告诉窗口过程窗体客户区被改变了需要重绘。符号常量指定系统消息属于的类别,其前缀指明了处理解释消息的窗体的类型。

   wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。

   lParam 通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换。

消息标识符的值

   系统保留消息标识符的值在0x0000在0x03ff(WM_USER-1)范围。这些值被系统定义消息使用。 应用程序不能使用这些值给自己的消息。应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,我们顺便说一下具有标志性的消息值:

WM_NULL---0x0000 空消息。
0x0001----0x0087 主要是窗口消息。
0x00A0----0x00A9 非客户区消息
0x0100----0x0108 键盘消息
0x0111----0x0126 菜单消息
0x0132----0x0138 颜色控制消息
0x0200----0x020A 鼠标消息
0x0211----0x0213 菜单循环消息
0x0220----0x0230 多文档消息
0x03E0----0x03E8 DDE消息
0x0400 WM_USER
0x8000 WM_APP
0x0400----0x7FFF 应用程序自定义私有消息

   消息有的分类?

   其实,windows中的消息虽然很多,但是种类并不繁杂,大体上有3种:窗口消息、命令消息和控件通知消息。

   窗口消息大概是系统中最为常见的消息,它是指由操作系统和控制其他窗口的窗口所使用的消息。例如CreateWindow、DestroyWindow和MoveWindow等都会激发窗口消息,还有我们在上面谈到的单击鼠标所产生的消息也是一种窗口消息。

   命令消息,这是一种特殊的窗口消息,他用来处理从一个窗口发送到另一个窗口的用户请求,例如按下一个按钮,他就会向主窗口发送一个命令消息。

   控件通知消息,是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows公共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本、操作控件的滚动条都会产生通知消息。 她类似于命令消息,当用户与控件窗口交互时,那么控件通知消息就会从控件窗口发送到它的主窗口。但是这种消息的存在并不是为了处理用户命令,而是为了让主窗口能够改变控件,例如加载、显示数据。例如按下一个按钮,他向父窗口发送的消息也可以看作是一个控件通知消息;单击鼠标所产生的消息可以由主窗口直接处理,然后交给控件窗口处理。

   其中窗口消息及控件通知消息主要由窗口类即直接或间接由CWND类派生类处理。相对窗口消息及控件通知消息而言,命令消息的处理对象范围就广得多,它不仅可以由窗口类处理,还可以由文档类,文档模板类及应用类所处理。

   由于控件通知消息很重要的,人们用的也比较多,但是具体的含义往往令初学者晕头转向,所以我决定把常见的几个列出来供大家参考:

   按扭控件

BN_CLICKED 用户单击了按钮
BN_DISABLE 按钮被禁止
BN_DOUBLECLICKED 用户双击了按钮
BN_HILITE 用/户加亮了按钮
BN_PAINT 按钮应当重画
BN_UNHILITE 加亮应当去掉

   组合框控件

CBN_CLOSEUP 组合框的列表框被关闭
CBN_DBLCLK 用户双击了一个字符串
CBN_DROPDOWN 组合框的列表框被拉出
CBN_EDITCHANGE 用户修改了编辑框中的文本
CBN_EDITUPDATE 编辑框内的文本即将更新
CBN_ERRSPACE 组合框内存不足
CBN_KILLFOCUS 组合框失去输入焦点
CBN_SELCHANGE 在组合框中选择了一项
CBN_SELENDCANCEL 用户的选择应当被取消
CBN_SELENDOK 用户的选择是合法的
CBN_SETFOCUS 组合框获得输入焦点

   编辑框控件

EN_CHANGE 编辑框中的文本己更新
EN_ERRSPACE 编辑框内存不足
EN_HSCROLL 用户点击了水平滚动条
EN_KILLFOCUS 编辑框正在失去输入焦点
EN_MAXTEXT 插入的内容被截断
EN_SETFOCUS 编辑框获得输入焦点
EN_UPDATE 编辑框中的文本将要更新
EN_VSCROLL 用户点击了垂直滚动条消息含义

   列表框控件

LBN_DBLCLK 用户双击了一项
LBN_ERRSPACE 列表框内存不够
LBN_KILLFOCUS 列表框正在失去输入焦点
LBN_SELCANCEL 选择被取消
LBN_SELCHANGE 选择了另一项
LBN_SETFOCUS 列表框获得输入焦点

队列消息和非队列消息

   从消息的发送途径来看,消息可以分成2种:队列消息和非队列消息。消息队列由可以分成系统消息队列和线程消息队列。系统消息队列由Windows维护,线程消息队列则由每个GUI线程自己进行维护,为避免给non-GUI现成创建消息队列,所有线程产生时并没有消息队列,仅当线程第一次调用GDI函数数系统给线程创建一个消息队列。队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。

   对于队列消息,最常见的是鼠标和键盘触发的消息,例如WM_MOUSERMOVE,WM_CHAR等消息,还有一些其它的消息,例如:WM_PAINT、WM_TIMER和WM_QUIT。当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消息队列,由Windows系统去进行处理。Windows系统则在适当的时机,从系统消息队列中取出一个消息,根据前面我们所说的MSG消息结构确定消息是要被送往那个窗口,然后把取出的消息送往创建窗口的线程的相应队列,下面的事情就该由线程消息队列操心了,Windows开始忙自己的事情去了。线程看到自己的消息队列中有消息,就从队列中取出来,通过操作系统发送到合适的窗口过程去处理。 //有关Windows中消息的走向的说明


   一般来讲,系统总是将消息Post在消息队列的末尾。这样保证窗口以先进先出的顺序接受消息。然而,WM_PAINT是一个例外,同一个窗口的多个 WM_PAINT被合并成一个 WM_PAINT 消息, 合并所有的无效区域到一个无效区域。合并WM_PAIN的目的是为了减少刷新窗口的次数

   非队列消息将会绕过系统队列和消息队列,直接将消息发送到窗口过程,。系统发送非队列消息通知窗口,系统发送消息通知窗口。 例如,当用户激活一个窗口系统发送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。这些消息通知窗口它被激活了。非队列消息也可以由当应用程序调用系统函数产生。例如,当程序调用SetWindowPos系统发送WM_WINDOWPOSCHANGED消息。一些函数也发送非队列消息,例如下面我们要谈到的函数。

   消息的发送

   了解了上面的这些基础理论之后,我们就可以进行一下简单的消息发送与接收。

   把一个消息发送到窗口有3种方式:发送、寄送和广播。

   发送消息的函数有SendMessage、SendMessageCallback、SendNotifyMessage、SendMessageTimeout;寄送消息的函数主要有PostMessage、PostThreadMessage、PostQuitMessage;广播消息的函数我知道的只有BroadcastSystemMessage、BroadcastSystemMessageEx。

   SendMessage的原型如下:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),这个函数主要是向一个或多个窗口发送一条消息,一直等到消息被处理之后才会返回。不过需要注意的是,如果接收消息的窗口是同一个应用程序的一部分,那么这个窗口的窗口函数就被作为一个子程序马上被调用;如果接收消息的窗口是被另外的线程所创建的,那么窗口系统就切换到相应的线程并且调用相应的窗口函数,这条消息不会被放进目标应用程序队列中。函数的返回值是由接收消息的窗口的窗口函数返回,返回的值取决于被发送的消息。

   PostMessage的原型如下:BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),该函数把一条消息放置到创建hWnd窗口的线程的消息队列中,该函数不等消息被处理就马上将控制返回。需要注意的是,如果hWnd参数为HWND_BROADCAST,那么,消息将被寄送给系统中的所有的重叠窗口和弹出窗口,但是子窗口不会收到该消息;如果hWnd参数为NULL,则该函数类似于将dwThreadID参数设置成当前线程的标志来调用PostThreadMEssage函数。

   从上面的这2个具有代表性的函数,我们可以看出消息的发送方式和寄送方式的区别所在:被发送的消息是否会被立即处理,函数是否立即返回。被发送的消息会被立即处理,处理完毕后函数才会返回;被寄送的消息不会被立即处理,他被放到一个先进先出的队列中,一直等到应用程序空线的时候才会被处理,不过函数放置消息后立即返回。

   实际上,发送消息到一个窗口处理过程和直接调用窗口处理过程之间并没有太大的区别,他们直接的唯一区别就在于你可以要求操作系统截获所有被发送的消息,但是不能够截获对窗口处理过程的直接调用

   以寄送方式发送的消息通常是与用户输入事件相对应的,因为这些事件不是十分紧迫,可以进行缓慢的缓冲处理,例如鼠标、键盘消息会被寄送,而按钮等消息则会被发送。

   广播消息用得比较少,BroadcastSystemMessage函数原型如下:

long BroadcastSystemMessage(DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam);

   该函数可以向指定的接收者发送一条消息,这些接收者可以是应用程序、可安装的驱动程序、网络驱动程序、系统级别的设备驱动消息和他们的任意组合。需要注意的是,如果dwFlags参数是BSF_QUERY并且至少一个接收者返回了BROADCAST_QUERY_DENY,则返回值为0,如果没有指定BSF_QUERY,则函数将消息发送给所有接收者,并且忽略其返回值。

发现个小东东,在vista或2008里,可以把屏保显示到桌面上(没在xp和2003里测试过,应该也可以显示别的窗口)。


步骤如下:

1.打开spy++,找到“Program Manager”窗口。