2008年1月24日星期四

JavaScript 对象与数组参考大全



  本文列举了各种JavaScript对象与数组,同时包括对上述每一对象或数组所完成工作的简短描述,以及与其相关的属性方法,以及事件处理程序,还注明了该对象或数组的父对象用户同样可能需要参考Online Companion中的超级文本Object Hierarchy页面(http://www.netscapepress.com/support/javascript/10-9.htm),以便了解这些对象之间是如何相互关联的。
  顺便提一下,记住,这里把所有作为另一对象的子对象的对象看作该对象的属性请参见第十章中与此相关的注解。


  B.1 anchor对象
  使用<A NAME=>标记创建的HTML描点能被一个链接作为目标如果锚点包括HREF=特性,则它也是一个链接对象。
  anchor对象是document对象的一个属性,它本身没有属性方法或者事件处理程序。



  B.2 anchors数组
  anchors数组是document对象的一个属性,是文档内所有anchor对象的一个列表如果anchor也是一个link(链接),则它会同时出现在anchors和links数组中。
  属性
  length 文档内的锚点个数


  B.3 array对象
  array对象是Netscape Navlgator 3.0 beta 3中引入的一个新的对象,因而,它不能在Netscape 2.0中使用它是一个内置对象,而不是其它对象的属性。
  属性
  length 数组中的值个数


  B.4 button对象
  它是form对象的一个属性,使用<INPUT TYPE="BUTTON">标记来创建。
  属性
  name HTML标记中的NAME=特性
  value HTML标记中的VALUE=特性
  方法
  click 模拟鼠标单击一按钮
  事件处理程序
  Onclick



  B.5 checkbox 对象
  它是form对象的一个属性,使用<INPUT TYPE="CHECKBOX">标记来创建。
  属性
  checked 复选框的选择状态
  defaultChecked 标记的CHECKED=特性
  name 标记的NAME=特性
  value 标记的VALUE=特性
  方法
  click 模拟鼠标单击按钮
  事件处理程序
  onclick


  B.6 Date对象
  它是一个内置对象——而不是其它对象的属性,允许用户执行各种使用日期和时间的过程。
   方法
  getDate() 查看Date对象并返回日期
  getDay() 返回星期几
  getHours() 返回小时数
  getMinutes() 返回分钟数
  getMonth() 返回月份值
  getSeconds() 返回秒数
  getTime() 返回完整的时间
  getTimezoneoffset() 返回时区偏差值(格林威治平均时间与运行脚本的计算机所处时区设置之间相差的小时数)
  getYear() 返回年份
  parse() 返回在Date字符串中自从1970年1月1日00:00:00以来的毫秒数(Date对象按照毫秒数的形式存储从那时起的日期和时间)但是注意,该方法当前不能正确运行
  setDate() 改变Date对象的日期
  setHours() 改变小时数
  setMinutes() 改变分钟数
  setMonth() 改变月份
  setSeconds() 改变秒数
  setTime() 改变完整的时间
  setYear() 改变年份
  toGMTString() 把Date对象的日期(一个数值)转变成一个GMT时间字符串,返回类似下面的值:Weds,15 June l997 14:02:02 GMT(精确的格式依赖于计算机上所运行的操作系统而变)
  toLocaleString() 把Date对象的日期(一个数值)转变成一个字符串,使用所在计算机上配置使用的特定日期格式
  UTC() 使用Date UTC(年、月、日、时、分、秒),以自从1970年1月1日00:00:00(其中时、分、秒是可选的)以来的毫秒数的形式返回日期



  B.7 document对象
  该对象是window和frames对象的一个属性,是显示于窗口或框架内的一个文档。
  属性
  alinkColor 活动链接的颜色(ALINK)
  anchor 一个HTMI锚点,使用<A NAME=>标记创建(该属性本身也是一个对象)
  anchors array 列出文档锚点对象的数组(<A NAME=>)(该属性本身也是一个对象)
  bgColor 文档的背景颜色(BGCOLOR)
  cookie 存储于cookie.txt文件内的一段信息,它是该文档对象的一个属性
  fgColor 文档的文本颜色(<BODY>标记里的TEXT特性)
  form 文档中的一个窗体(<FORM>)(该属性本身也是一个对象)
  forms anay 按照其出现在文档中的顺序列出窗体对象的一个数组(该属性本身也是一个对象)
  lastModified 文档最后的修改日期
  linkColor 文档的链接的颜色,即<BODY>标记中的LINK特性(链接到用户没有观察到的文档)
  link 文档中的一个<A HREF=>标记(该属性本身也是一个对象)
  links array 文档中link对象的一个数组,按照它们出现在文档中的顺序排列(该属性本身也是一个对象)
  location 当前显示文档的URL。用户不能改变document.location(因为这是当前显示文档的位置)。但是,可以改变window.location (用其它文档取代当前文档)window.location本身也是一个对象,而document.location不是对象
  referrer 包含链接的文档的URL,用户单击该链接可到达当前文档
  title 文档的标题((TITLE>)
  vlinkColor 指向用户已观察过的文档的链接文本颜色,即<BODY>标记的VLINK特性
  方法
  clear 清除指定文档的内容
  close 关闭文档流
  open 打开文档流
  write 把文本写入文档
  writeln 把文本写入文档,并以换行符结尾



  B.8 elements数组
  它是form对象的一个属性,列举了窗体内各元素的一个数组。
  属性
  1ength 窗体内的元素个数
  B.9 form对象
  它是document对象的一个属性,文档内的一个窗体。
  属性
  action 包含了为一个窗体提交的目标URL的字符串
  button 窗体内的一个按钮,使用<INPUT TYPE=”BUTTON”>标记来创建(该属性本身也是一个对象)
  checkbox 复选框,使用<INPUT TYPE=”CHECKBOX”>标记来创建 (该属性本身也是一个对象)
  elements array 一个数组,按照其出现于窗体内的顺序列举各窗体元素(该属性本身也是一个对象)
  encoding 窗体的MIME编码
   hidden 窗体里的一个隐藏元素(<INPUT TYPE=”HIDDEN”>)。窗体对象的一个属性(该属性本身也是一个对象)
  length 窗体里的元素的个数
  method 输入窗体的数据传送到服务器上的方式,即(FORM)标记中的METHOD特性
  radio 设置在窗体里的单选按钮(<INPUT TYPE=”RADIO”>)(该属性本身也是一个对象)
  reset 窗体里的复位按钮((1NPUT TYPE=”RESET”>)(该属性自身也是一个对象)
  select 窗体里的选择框(<SELECT>)(该属性本身也是一个对象)
  submit 窗体里的提交按钮(<INPUT TYPE=”SUBMIT”>)(该属性本身也是一个对象)
  target 提交窗体后,显示回应信息的窗口的名字
  text 窗体里的文本元素(<INPUT TYPE=”TEXT”>)(该属性本身也是一个对象)
  textarta 窗体里的文本区元素(<TEXTAREA>)(该属性本身也是一个对象)
  方法
  submit 提交窗体(与使用Submit按钮的作用相同)事件处理程序
  onsubmit



  B.10 forms数组
  该数组是document对象的一个属性,即列举了文档内的各窗体的一个数组。
  属性
  length 文档内窗体的个数


  B.11 frame对象
  它是window对象的一个属性,窗口内的一个框架。除了个别例外,frame对象与window对象的作用相同。
  属性
  frames array 列举该框架内的各个子框架的一个数组(该属性本身也是—个对象)
  length 该框架内的框架数
  name 框架的名字(<FRAME>标记里的NAME特性)
  parent 包含本框架的父窗口的同义词
  self 当前框架的同义词
  window 当前框架的同义词
  方法
  clearTimeout() 用来终止setTimeout方法的工作
  setTimeout() 等待指定的毫秒数,然后运行指令



  B.12 frames数组
  它既是window对象,也是frame对象的属性,列举了window或者frame对象内的各框架。
  属性
  length 窗口或框架对象内的框架数


  B.13 hidden对象
  糊为form对象的一个属性,窗体内的一个隐藏元素(<INPUT TYPE=”HIDDEN”>)。
  属性
  name 标记内的名字(NAME特性)
  value 标记内的VALUE=特性


  B.14 history对象
  它为window对象的一个属性,该窗口的历史列表。
  属性
  length 历史列表中的项目数
  方法
  back 加载历史列表中的上一个文档
  forward 加载历史列表中的下一个文档
  go 加载历史列表中的一个指定文档,通过文档在列表中的位置来指定



  B.15 image对象
  它是document对象的一个属性,是使用(1MG)标记内嵌入文档里的一幅图像这是Netscape Navigator 3.0 beta 3引入的新对象。
  属性
  border <IMG>标记的BORDER特性
  complete 表示浏览器是否完整地加载了图像的一个布尔值
  height HEIGHT特性
  hspace HSPACE特性
  lowsrc LOWSRC特性
  src SRC特性
  vsPace VSPACE特性
  width WIDTH特性
  事件处理程序
  Onload 图象载入
  Onerror 载入错误
  Onabort 取消



  B.16 images数组
  它是document对象的一个属性,文档中所有图像的列表。
  属性
  length 文档内的图像个数


  B.17 link
  它是document对象的一个属性,文档内的一个<A HREF=>标记。
  属性
  hash 以散列号(#)开始的一个字符串,用于指定URL内的一个锚点
  host 包括冒号和端口号的URL的主机名部分
  hostname 与host属性相同,除了不包括冒号和端口号外
  href 完整的URL
  pathname URL的目录路径部分
  port URL的:端口部分
  protocol URL类型(http:、ftp:、gopher:等等)
  search 以一个问号开始的URL中的一部分,用于指定搜索信息
  target 当用户单击一链接(TARGET特性)时,用于显示被引用文档内容的窗口
  事件处理程序
  Onclick 点击
  Onmouseover 鼠标移到对象上



  B.18 links数组
  它是document对象的一个属性,文档内所有链接的一个列表。
  属性
  length 文档内的链接数


  B.19 location对象
  它为document对象的一个属性,该文档的完整URL,请不要把它与window.location属性相混淆,后者可用来加载一个新文档,并且window.location属性本身并不是一个对象,同时,window.location可以用脚本修改,而document.location则不能。
  属性
  hash 以散列号(#)开始的一个字符串,用于指定URL内的一个锚点
  host 包括冒号和端口号的URL的主机名部分
  hostname 与host属性相同,除了不包括冒号和端口号之外
  href 完整的URL
  pathname URL的目录路径部分
  port URL的:端口部分
  protocol URL的类型(http:、ftp:、gopher:等等)
  search 以问号(?)开始的URL中的一部分,用于指定搜索信息
  target 用户单击链接(TARGET特性)时,用于显示被引用文档的内容的窗口



  B.20 math对象
  该对象不是其它对象的一个属性,而是一个内置对象,包含了许多数学常量和函数
  属性
  E 欧拉常量,自然对数的底(约等于2.718)
  LN2 2的自然对数(约等于0.693)
  LN10 10的自然对数(约等于2.302)
  LOG2E 以2为底的e的对数(约等于1.442)
  LOG10E 以10为底的e的对数(约等于o.434)
  PI ∏的值(约等于3.14159)
  SQRT1_2 0.5的平方根(即l除以2的平方根,约等于o.707)
  SQRT2 2的平方根(约等于1.414)
  方法
  abs() 返回某数的绝对值(即该数与o的距离,例如,2与一2的绝对值都是2)
  acos() 返回某数的反余弦值(以弧度为单位)
  asin() 返回某数的反正弦值(以弧度为单位)
  atan() 返回某数的反正切值(以弧度为单位)
  ceil() 返回与某数相等,或大于该数的最小整数(ceil(-22.22)返回-22;ceil22,22)返回23;ceil(22)返回22)
  cos() 返回某数(以弧度为单位)的余弦值
  exp() 返回en
  floor() 与ceil相反(floor(一22.22)返回一23;floor(22.22)返回22; floor(22)返回22)
  10g() 返回某数的自然对数(以e为底)
  max() 返回两数间的较大值
  min() 返回两数问的较小值
  pow() 返回m的n次方(其中,m为底,n为指数)
  random() 返回0和1之间的一个伪随机数(该方法仅在Netscape
  Navigator的UNIX版本中有效)
  round() 返回某数四舍五入之后的整数
  sin() 返回某数(以弧度为单位)的正弦值
  sqrt() 返回某数的平方根
  tan() 返回某数的正切值



  B.2l navigator对象
  该对象不是其它对象的属性,而是一个内置对象它包含了有关加载文档的浏览器的信息。
  属性
  appCodeName 浏览器的代码名(例如,Mozilla)
  appName 浏览器的名字
  appVersion 浏览器的版本号
  userAgent 由客户机送到服务器的用户与代理头标文本
  方法
  javaEnabled JavaScript中当前并没有该方法,但是不久之后将会添加上它将查看浏览器是否为兼容JavaScript的浏览器,如果是,继续查看JavaScript是否处于支持状态。


  B.22 options数组
  该数组是select对象的一个属性,即选择框中的所有选项(<OPTION>)的一个列表。
  属性
  defaultSelected 选项列表中的缺省选项
  index 选项列表中某选项的索引位置
  length 选项列表中的选项数(<OPTIONS>)
  name 选项列表的名字(NAME特性)
  selected 表示选项列表中某选项<OPTION>是否被选中的一个布尔类型值
  selectedIndex 选项列表中已选中的<OPTION>的索引(位置)
  text 选项列表中<OPTION>标记后的文本
  value 选项列表中的VALUE=特性



  B.23 Password 对象
  它是document对象的一个属性,一个<INPUT TYPE=”PASSWORD”>标记。
  属性
  defaultValue password对象的缺省值(VAlUE=特性)
  name 对象的名字(NAME=特性)
  value 该域具有的当前值最初与VALUE=特性(defauttValue)相同,但是,如果脚本修改了该域中的值,则该值将改变
  方法
  focus 把焦点从该域移开
  blur 把焦点移到该域
  select 选择输入区域


  B.24 radio对象
  它是form对象的一个属性,窗体内的一组单选按钮(选项按钮)(<INPUT TYPE=”RADIO”>)。
  属性
  checked 复选框或选项按钮(单选按钮)的状态
  defaultChecked 复选框或选项按钮(单选按钮)的缺省状态
  length 一组单选按钮中的按钮数
  name 对象的名字(NAME=特性)
  value VALUE=特性
  方法
  click 模拟鼠标单击按钮
  事件处理程序
  onclick 点击



  B.25 reset 对象
  它是form对象的一个属性,复位按钮(<INPUT TYPE=”RESET”>)。
  属性
  name 对象的名字(NAME=特性)
  value VALUE=特性
  方法
  click 模拟鼠标单击按钮
  事件处理程序
  onclick 点击


  B.26 select对象
  它是form对象的一个属性,选择框(<SELECT>)。
  属性
  length 选项列表中的选项数(<OPTIONS>)
  name 选项列表的名字(NAME特性)
  options 列表中的选项数
  selectedlndex 选项列表中已选中的<OPTION>的索引(位置)
  text 选项列表中(OPTION)标记之后的文本
  value 选项列表中的VALUE=特性
  方法
  blur 把焦点从选项列表中移走
  focus 把焦点移到选项列表中
  事件处理程序
  Onblur 失去焦点时事件
  onchange 更改
  Onfocus 聚焦事件



  B.27 string对象
  它不是另一个对象的属性,而是一个内置对象,即一串字符字符串输入脚本中时必须位于引号内。
  属性
  length 字符串中的字符个数
  方法
  anchor() 用来把字符串转换到HTML锚点标记内(<A NAME=>)
  big() 把字符串中的文本变成大字体(<BIG>)
  blink() 把字符串中的文本变成闪烁字体(<BLINK>)
  bold() 把字符串中的文本变成黑字体(<B>)
  charAt() 寻找字符串中指定位置的一个字符
  fixed() 把字符串中的文本变成固定间距字体(<TT>)
  fontcolor() 改变字符串中文本的颜色(<FONT COLOR=>)
  fontsize() 把字符串中的文本变成指定大小(<FONTSIZE=>)
  indexOf() 用来搜索字符串中的某个特殊字符,并返回该字符的索引位置
  italics() 把字符串中的文本变成斜字体(<I>)
  lastlndexOf() 与indexof相似,但是向后搜索最后一个出现的字符
  link() 用来把字符串转换到HTML链接标记中(<A HREF=>)
  small() 把字符串中的文本变成小字体(<SMALL>)
  strike() 把字符串中的文本变成划掉字体(<STRIKE>)
  sub() 把字符串中的文本变成下标(subscript)字体((SUB>)
  substring() 返回字符串里指定位置间的一部分字符串
  sup() 把字符串中的文本变成上标(superscript)字体(<SUP>)
  toLowerCase() 把字符串中的文本变成小写
  toUpperCase() 把字符串中的文本变成大写



  B.28 submit对象
  它是form对象的一个属性,窗体中的一个提交按钮(<INPUT TYPE=”SUBMIT”>)。
  属性
  name 对象的名字(NAME=特性)
  value VALUE=特性
  方法
  click 模拟鼠标单击按钮
  事件处理程序
  Onclick 点击


  B.29 text对象
  它是form对象的一个属性,宙体中的一个文本域(<INPUT TYPE=”TEXT”>)。
  属性
  defaultValue text对象的缺省值(VALUE=特性)
  name 该对象的名字(NAME=特性)
  Value 该域具有的当前值,最初与VALUE=特性(defaultValue)相同但是,如果脚本修改了该域中的值,则该值将改变
  方法
  blur 把焦点从文本框移开
  focus 把焦点移到文本框
  select 选择输入区域
  事件处理程序
  Onblur 失去焦点事件
  Onchange 更改
  Onfocus 聚焦事件
  Onselect 选取事件



  B.30 textarea对象
  它是form对象的一个属性,宙体中的一个文本区域(<TEXTAREA>)。
  属性
  defaultValue textarea对象的缺省值(VALUE=特性)
  name 该对象的名字(NAME=特性)
  value 该域具有的当前值,最初与VALUE=特性(defaultValue)相同,但是,如果脚本修改了该域中的值,则该值将改变了。
  方法
  blur 把焦点从文本区移开
  focus 把焦点移到文本区
  select 选择输入区域事件处理程序
  事件处理程序
  Onblur 失去焦点事件
  Onchange 更改
  Onfocus 聚焦事件
  Onselect 选取事件



  B.31 window对象
  它是一个顶层对象,而不是另一个对象的属性即浏览器的窗口。
  属性
  defaultStatus 缺省的状态条消息
  document 当前显示的文档(该属性本身也是一个对象)
  frame 窗口里的一个框架((FRAME>)(该属性本身也是一个对象)
  frames array 列举窗口的框架对象的数组,按照这些对象在文档中出现的顺序列出(该属性本身也是一个对象)
  history 窗口的历史列表(该属性本身也是一个对象)
  length 窗口内的框架数
  location 窗口所显示文档的完整(绝对)URL(该属性本身也是一个对象)不要把它与如document.location混淆,后者是当前显示文档的URL。用户可以改变window.location(用另一个文档取代当前文档),但却不能改变document.location(因为这是当前显示文档的位置)
  name 窗口打开时,赋予该窗口的名字
  opener 代表使用window.open打开当前窗口的脚本所在的窗口(这是Netscape Navigator 3.0beta 3所引入的一个新属性)
  parent 包含当前框架的窗口的同义词。frame和window对象的一个属性
  self 当前窗口或框架的同义词
  status 状态条中的消息
  top 包含当前框架的最顶层浏览器窗口的同义词
  window 当前窗口或框架的同义词,与self相同
  方法
  alert() 打开一个Alert消息框
  clearTimeout() 用来终止setTimeout方法的工作
  close() 关闭窗口
  confirm() 打开一个Confirm消息框,用户可以选择OK或Cancel,如果用户单击OK,该方法返回true,单击Cancel返回false
  blur() 把焦点从指定窗口移开(这是Netscape Navigator 3.0 beta 3引入的新方法)
  focus() 把指定的窗口带到前台(另一个新方法)
  open() 打开一个新窗口
  prompt() 打开一个Prompt对话框,用户可向该框键入文本,并把键入的文本返回到脚本
  setTimeout() 等待一段指定的毫秒数时间,然后运行指令事件处理程序
  事件处理程序
  Onload() 页面载入时触发
  Onunload() 页面关闭时触发



出处:CSDN


责任编辑:红色黑客



◎进入论坛网页制作网站综合版块参加讨论

javaScript函数大全

1.document.write(""); 输出语句

2.JS中的注释为//

3.传统的HTML文档顺序是:document->html->(head,body)

4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document)

5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID号").name(或value)

6.一个小写转大写的JS: document.getElementById("output").value = document.getElementById("input").value.toUpperCase();


7.JS中的值类型:String,Number,Boolean,Null,Object,Function

8.JS中的字符型转换成数值型:parseInt(),parseFloat()

9.JS中的数字转换成字符型:(""+变量)

10.JS中的取字符串长度是:(length)

11.JS中的字符与字符相连接使用+号.

12.JS中的比较操作符有:==等于,!=不等于,>,>=,<.<=

13.JS中声明变量使用:var来进行声明


14.JS中的判断语句结构:if(condition){}else{}

15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop}

16.循环中止的命令是:break

17.JS中的函数定义:function functionName([parameter],...){statement[s]}

18.当文件中出现多个form表单时.可以用document.forms[0],document.forms[1]来代替.


19.窗口:打开窗口window.open(), 关闭一个窗口:window.close(), 窗口本身:self

20.状态栏的设置:window.status="字符";

21.弹出提示信息:window.alert("字符");

22.弹出确认框:window.confirm();

23.弹出输入提示框:window.prompt();

24.指定当前显示链接的位置:window.location.href="URL"

25.取出窗体中的所有表单的数量:document.forms.length

26.关闭文档的输出流:document.close();


27.字符串追加连接符:+=

28.创建一个文档元素:document.createElement(),document.createTextNode()

29.得到元素的方法:document.getElementById()

30.设置表单中所有文本型的成员的值为空:

 var form = window.document.forms[0]

 for (var i = 0; i<form.elements.length;i++){


     if (form.elements[i].type == "text"){

         form.elements[i].value = "";

     }

 }

31.复选按钮在JS中判断是否选中:document.forms[0].checkThis.checked (checked属性代表为是否选中返回TRUE或FALSE)

32.单选按钮组(单选按钮的名称必须相同):取单选按钮组的长度document.forms[0].groupName.length


33.单选按钮组判断是否被选中也是用checked.

34.下拉列表框的值:document.forms[0].selectName.options[n].value (n有时用下拉列表框名称加上.selectedIndex来确定被选中的值)

35.字符串的定义:var myString = new String("This is lightsword");

36.字符串转成大写:string.toUpperCase(); 字符串转成小写:string.toLowerCase();

37.返回字符串2在字符串1中出现的位置:String1.indexOf("String2")!=-1则说明没找到.


38.取字符串中指定位置的一个字符:StringA.charAt(9);

39.取出字符串中指定起点和终点的子字符串:stringA.substring(2,6);

40.数学函数:Math.PI(返回圆周率),Math.SQRT2(返回开方),Math.max(value1,value2)返回两个数中的最在值,Math.pow(value1,10)返回value1的十次方,Math.round(value1)四舍五入函数,Math.floor(Math.random()*(n+1))返回随机数

41.定义日期型变量:var today = new Date();

42.日期函数列表:dateObj.getTime()得到时间,dateObj.getYear()得到年份,dateObj.getFullYear()得到四位的年份,dateObj.getMonth()得到月份,dateObj.getDate()得到日,dateObj.getDay()得到日期几,dateObj.getHours()得到小时,dateObj.getMinutes()得到分,dateObj.getSeconds()得到秒,dateObj.setTime(value)设置时间,dateObj.setYear(val)设置年,dateObj.setMonth(val)设置月,dateObj.setDate(val)设置日,dateObj.setDay(val)设置星期几,dateObj.setHours设置小时,dateObj.setMinutes(val)设置分,dateObj.setSeconds(val)设置秒  [注意:此日期时间从0开始计]


43.FRAME的表示方式: [window.]frames[n].ObjFuncVarName,frames["frameName"].ObjFuncVarName,frameName.ObjFuncVarName

44.parent代表父亲对象,top代表最顶端对象

45.打开子窗口的父窗口为:opener

46.表示当前所属的位置:this

47.当在超链接中调用JS函数时用:(javascript:)来开头后面加函数


48.在老的浏览器中不执行此JS:<!--      //-->

49.引用一个文件式的JS:<script type="text/javascript" src="aaa.js"></script>

50.指定在不支持脚本的浏览器显示的HTML:<noscript></noscript>

51.当超链和ONCLICK事件都有时,则老版本的浏览器转向a.html,否则转向b.html.例:<a href="a.html" onclick="location.href='b.html';return false">dfsadf</a>


52.JS的内建对象有:Array,Boolean,Date,Error,EvalError,Function,Math,Number,Object,RangeError,ReferenceError,RegExp,String,SyntaxError,TypeError,URIError

53.JS中的换行:\n

54.窗口全屏大小:<script>function fullScreen(){ this.moveTo(0,0);this.outerWidth=screen.availWidth;this.outerHeight=screen.availHeight;}window.maximize=fullScreen;</script>

55.JS中的all代表其下层的全部元素 


56.JS中的焦点顺序:document.getElementByid("表单元素").tabIndex = 1


57.innerHTML的值是表单元素的值:如<p id="para">"how are <em>you</em>"</p>,则innerHTML的值就是:how are <em>you</em>

58.innerTEXT的值和上面的一样,只不过不会把<em>这种标记显示出来.


59.contentEditable可设置元素是否可被修改,isContentEditable返回是否可修改的状态.

60.isDisabled判断是否为禁止状态.disabled设置禁止状态

61.length取得长度,返回整型数值

62.addBehavior()是一种JS调用的外部函数文件其扩展名为.htc

63.window.focus()使当前的窗口在所有窗口之前.

64.blur()指失去焦点.与FOCUS()相反.

65.select()指元素为选中状态.

66.防止用户对文本框中输入文本:onfocus="this.blur()"


67.取出该元素在页面中出现的数量:document.all.tags("div(或其它HTML标记符)").length

68.JS中分为两种窗体输出:模态和非模态.window.showModaldialog(),window.showModeless()

69.状态栏文字的设置:window.status='文字',默认的状态栏文字设置:window.defaultStatus = '文字.';

70.添加到收藏夹:external.AddFavorite("http://www.dannyg.com","jaskdlf");

71.JS中遇到脚本错误时不做任何操作:window.onerror = doNothing; 指定错误句柄的语法为:window.onerror = handleError;


72.JS中指定当前打开窗口的父窗口:window.opener,支持opener.opener...的多重继续.

73.JS中的self指的是当前的窗口

74.JS中状态栏显示内容:window.status="内容"

75.JS中的top指的是框架集中最顶层的框架

76.JS中关闭当前的窗口:window.close();

77.JS中提出是否确认的框:if(confirm("Are you sure?")){alert("ok");}else{alert("Not Ok");}

78.JS中的窗口重定向:window.navigate("http://www.sina.com.cn");


79.JS中的打印:window.print()

80.JS中的提示输入框:window.prompt("message","defaultReply");

81.JS中的窗口滚动条:window.scroll(x,y)

82.JS中的窗口滚动到位置:window.scrollby

83.JS中设置时间间隔:setInterval("expr",msecDelay)或setInterval(funcRef,msecDelay)或setTimeout

84.JS中的模态显示在IE4+行,在NN中不行:showModalDialog("URL"[,arguments][,features]);

85.JS中的退出之前使用的句柄:function verifyClose(){event.returnValue="we really like you and hope you will stay longer.";}}  window.onbeforeunload=verifyClose;


86.当窗体第一次调用时使用的文件句柄:onload()

87.当窗体关闭时调用的文件句柄:onunload()

88.window.location的属性: protocol(http:),hostname(www.example.com),port(80),host(www.example.com:80),pathname("/a/a.html"),hash("#giantGizmo",指跳转到相应的锚记),href(全部的信息)

89.window.location.reload()刷新当前页面.

89-1.parent.location.reload()刷新父亲对象(用于框架)

89-2.opener.location.reload()刷新父窗口对象(用于单开窗口)

89-3.top.location.reload()刷新最顶端对象(用于多开窗口)


90.window.history.back()返回上一页,window.history.forward()返回下一页,window.history.go(返回第几页,也可以使用访问过的URL)

91.document.write()不换行的输出,document.writeln()换行输出

92.document.body.noWrap=true;防止链接文字折行.

93.变量名.charAt(第几位),取该变量的第几位的字符.

94."abc".charCodeAt(第几个),返回第几个字符的ASCii码值.

95.字符串连接:string.concat(string2),或用+=进行连接

96.变量.indexOf("字符",起始位置),返回第一个出现的位置(从0开始计算)

97.string.lastIndexOf(searchString[,startIndex])最后一次出现的位置.

98.string.match(regExpression),判断字符是否匹配.


99.string.replace(regExpression,replaceString)替换现有字符串.

100.string.split(分隔符)返回一个数组存储值.

101.string.substr(start[,length])取从第几位到指定长度的字符串.

102.string.toLowerCase()使字符串全部变为小写.

103.string.toUpperCase()使全部字符变为大写.

104.parseInt(string[,radix(代表进制)])强制转换成整型.

105.parseFloat(string[,radix])强制转换成浮点型.

106.isNaN(变量):测试是否为数值型.

107.定义常量的关键字:const,定义变量的关键字:var

2008年1月23日星期三

wav文件格式分析详解

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=932395

一、综述
WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个
字节便是“RIFF”。
WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE
Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。具体见下图:

------------------------------------------------
| RIFF WAVE Chunk |
| ID = 'RIFF' |
| RiffType = 'WAVE' |
------------------------------------------------
| Format Chunk |
| ID = 'fmt ' |
------------------------------------------------
| Fact Chunk(optional) |
| ID = 'fact' |
------------------------------------------------
| Data Chunk |
| ID = 'data' |
------------------------------------------------
图1 Wav格式包含Chunk示例

其中除了Fact Chunk外,其他三个Chunk是必须的。每个Chunk有各自的ID,位
于Chunk最开始位置,作为标示,而且均为4个字节。并且紧跟在ID后面的是Chunk大
小(去除ID和Size所占的字节数后剩下的其他字节数目),4个字节表示,低字节
表示数值低位,高字节表示数值高位。下面具体介绍各个Chunk内容。
PS:
所有数值表示均为低字节表示低位,高字节表示高位。

二、具体介绍
RIFF WAVE Chunk
==================================
| |所占字节数| 具体内容 |
==================================
| ID | 4 Bytes | 'RIFF' |
----------------------------------
| Size | 4 Bytes | |
----------------------------------
| Type | 4 Bytes | 'WAVE' |
----------------------------------
图2 RIFF WAVE Chunk

以'FIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去ID
和Size所占用的字节数,即FileLen - 8 = Size。然后是Type字段,为'WAVE',表
示是wav文件。
结构定义如下:
struct RIFF_HEADER
{
char szRiffID[4]; // 'R','I','F','F'
DWORD dwRiffSize;
char szRiffFormat[4]; // 'W','A','V','E'
};



Format Chunk
====================================================================
| | 字节数 | 具体内容 |
====================================================================
| ID | 4 Bytes | 'fmt ' |
--------------------------------------------------------------------
| Size | 4 Bytes | 数值为16或18,18则最后又附加信息 |
-------------------------------------------------------------------- ----
| FormatTag | 2 Bytes | 编码方式,一般为0x0001 | |
-------------------------------------------------------------------- |
| Channels | 2 Bytes | 声道数目,1--单声道;2--双声道 | |
-------------------------------------------------------------------- |
| SamplesPerSec | 4 Bytes | 采样频率 | |
-------------------------------------------------------------------- |
| AvgBytesPerSec| 4 Bytes | 每秒所需字节数 | |===> WAVE_FORMAT
-------------------------------------------------------------------- |
| BlockAlign | 2 Bytes | 数据块对齐单位(每个采样需要的字节数) | |
-------------------------------------------------------------------- |
| BitsPerSample | 2 Bytes | 每个采样需要的bit数 | |
-------------------------------------------------------------------- |
| | 2 Bytes | 附加信息(可选,通过Size来判断有无) | |
-------------------------------------------------------------------- ----
图3 Format Chunk

以'fmt '作为标示。一般情况下Size为16,此时最后附加信息没有;如果为18
则最后多了2个字节的附加信息。主要由一些软件制成的wav格式中含有该2个字节的
附加信息。
结构定义如下:
struct WAVE_FORMAT
{
WORD wFormatTag;
WORD wChannels;
DWORD dwSamplesPerSec;
DWORD dwAvgBytesPerSec;
WORD wBlockAlign;
WORD wBitsPerSample;
};
struct FMT_BLOCK
{
char szFmtID[4]; // 'f','m','t',' '
DWORD dwFmtSize;
WAVE_FORMAT wavFormat;
};


Fact Chunk
==================================
| |所占字节数| 具体内容 |
==================================
| ID | 4 Bytes | 'fact' |
----------------------------------
| Size | 4 Bytes | 数值为4 |
----------------------------------
| data | 4 Bytes | |
----------------------------------
图4 Fact Chunk

Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk。
结构定义如下:
struct FACT_BLOCK
{
char szFactID[4]; // 'f','a','c','t'
DWORD dwFactSize;
};



Data Chunk
==================================
| |所占字节数| 具体内容 |
==================================
| ID | 4 Bytes | 'data' |
----------------------------------
| Size | 4 Bytes | |
----------------------------------
| data | | |
----------------------------------
图5 Data Chunk

Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是
数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,
wav数据的bit位置可以分成以下几种形式:
---------------------------------------------------------------------
| 单声道 | 取样1 | 取样2 | 取样3 | 取样4 |
| |--------------------------------------------------------
| 8bit量化 | 声道0 | 声道0 | 声道0 | 声道0 |
---------------------------------------------------------------------
| 双声道 | 取样1 | 取样2 |
| |--------------------------------------------------------
| 8bit量化 | 声道0(左) | 声道1(右) | 声道0(左) | 声道1(右) |
---------------------------------------------------------------------
| | 取样1 | 取样2 |
| 单声道 |--------------------------------------------------------
| 16bit量化 | 声道0 | 声道0 | 声道0 | 声道0 |
| | (低位字节) | (高位字节) | (低位字节) | (高位字节) |
---------------------------------------------------------------------
| | 取样1 |
| 双声道 |--------------------------------------------------------
| 16bit量化 | 声道0(左) | 声道0(左) | 声道1(右) | 声道1(右) |
| | (低位字节) | (高位字节) | (低位字节) | (高位字节) |
---------------------------------------------------------------------
图6 wav数据bit位置安排方式

Data Chunk头结构定义如下:
struct DATA_BLOCK
{
char szDataID[4]; // 'd','a','t','a'
DWORD dwDataSize;
};


三、小结
因此,根据上述结构定义以及格式介绍,很容易编写相应的wav格式解析代码。
这里具体的代码就不给出了。

2008年1月22日星期二

看书

1、《程序员三步曲》 未看

2008年1月20日星期日

Windows Message ID 常量列表

Windows Message ID 常量列表:
namespace WindowsUtilities
{
public enum WindowsMessages: int
{
WM_NULL = 0x0000,
WM_CREATE = 0x0001,
WM_DESTROY = 0x0002,
WM_MOVE = 0x0003,
WM_SIZE = 0x0005,
WM_ACTIVATE = 0x0006,
WM_SETFOCUS = 0x0007,
WM_KILLFOCUS = 0x0008,
WM_ENABLE = 0x000A,
WM_SETREDRAW = 0x000B,
WM_SETTEXT = 0x000C,
WM_GETTEXT = 0x000D,
WM_GETTEXTLENGTH = 0x000E,
WM_PAINT = 0x000F,
WM_CLOSE = 0x0010,
WM_QUERYENDSESSION = 0x0011,
WM_QUERYOPEN = 0x0013,
WM_ENDSESSION = 0x0016,
WM_QUIT = 0x0012,
WM_ERASEBKGND = 0x0014,
WM_SYSCOLORCHANGE = 0x0015,
WM_SHOWWINDOW = 0x0018,
WM_WININICHANGE = 0x001A,
WM_SETTINGCHANGE = 0x001A,
WM_DEVMODECHANGE = 0x001B,
WM_ACTIVATEAPP = 0x001C,
WM_FONTCHANGE = 0x001D,
WM_TIMECHANGE = 0x001E,
WM_CANCELMODE = 0x001F,
WM_SETCURSOR = 0x0020,
WM_MOUSEACTIVATE = 0x0021,
WM_CHILDACTIVATE = 0x0022,
WM_QUEUESYNC = 0x0023,
WM_GETMINMAXINFO = 0x0024,
WM_PAINTICON = 0x0026,
WM_ICONERASEBKGND = 0x0027,
WM_NEXTDLGCTL = 0x0028,
WM_SPOOLERSTATUS = 0x002A,
WM_DRAWITEM = 0x002B,
WM_MEASUREITEM = 0x002C,
WM_DELETEITEM = 0x002D,
WM_VKEYTOITEM = 0x002E,
WM_CHARTOITEM = 0x002F,
WM_SETFONT = 0x0030,
WM_GETFONT = 0x0031,
WM_SETHOTKEY = 0x0032,
WM_GETHOTKEY = 0x0033,
WM_QUERYDRAGICON = 0x0037,
WM_COMPAREITEM = 0x0039,
WM_GETOBJECT = 0x003D,
WM_COMPACTING = 0x0041,
WM_COMMNOTIFY = 0x0044,
WM_WINDOWPOSCHANGING = 0x0046,
WM_WINDOWPOSCHANGED = 0x0047,
WM_POWER = 0x0048,
WM_COPYDATA = 0x004A,
WM_CANCELJOURNAL = 0x004B,
WM_NOTIFY = 0x004E,
WM_INPUTLANGCHANGEREQUEST = 0x0050,
WM_INPUTLANGCHANGE = 0x0051,
WM_TCARD = 0x0052,
WM_HELP = 0x0053,
WM_USERCHANGED = 0x0054,
WM_NOTIFYFORMAT = 0x0055,
WM_CONTEXTMENU = 0x007B,
WM_STYLECHANGING = 0x007C,
WM_STYLECHANGED = 0x007D,
WM_DISPLAYCHANGE = 0x007E,
WM_GETICON = 0x007F,
WM_SETICON = 0x0080,
WM_NCCREATE = 0x0081,
WM_NCDESTROY = 0x0082,
WM_NCCALCSIZE = 0x0083,
WM_NCHITTEST = 0x0084,
WM_NCPAINT = 0x0085,
WM_NCACTIVATE = 0x0086,
WM_GETDLGCODE = 0x0087,
WM_SYNCPAINT = 0x0088,
WM_NCMOUSEMOVE = 0x00A0,
WM_NCLBUTTONDOWN = 0x00A1,
WM_NCLBUTTONUP = 0x00A2,
WM_NCLBUTTONDBLCLK = 0x00A3,
WM_NCRBUTTONDOWN = 0x00A4,
WM_NCRBUTTONUP = 0x00A5,
WM_NCRBUTTONDBLCLK = 0x00A6,
WM_NCMBUTTONDOWN = 0x00A7,
WM_NCMBUTTONUP = 0x00A8,
WM_NCMBUTTONDBLCLK = 0x00A9,
WM_NCXBUTTONDOWN = 0x00AB,
WM_NCXBUTTONUP = 0x00AC,
WM_NCXBUTTONDBLCLK = 0x00AD,
WM_INPUT = 0x00FF,
WM_KEYFIRST = 0x0100,
WM_KEYDOWN = 0x0100,
WM_KEYUP = 0x0101,
WM_CHAR = 0x0102,
WM_DEADCHAR = 0x0103,
WM_SYSKEYDOWN = 0x0104,
WM_SYSKEYUP = 0x0105,
WM_SYSCHAR = 0x0106,
WM_SYSDEADCHAR = 0x0107,
WM_UNICHAR = 0x0109,
WM_KEYLAST_NT501 = 0x0109,
UNICODE_NOCHAR = 0xFFFF,
WM_KEYLAST_PRE501 = 0x0108,
WM_IME_STARTCOMPOSITION = 0x010D,
WM_IME_ENDCOMPOSITION = 0x010E,
WM_IME_COMPOSITION = 0x010F,
WM_IME_KEYLAST = 0x010F,
WM_INITDIALOG = 0x0110,
WM_COMMAND = 0x0111,
WM_SYSCOMMAND = 0x0112,
WM_TIMER = 0x0113,
WM_HSCROLL = 0x0114,
WM_VSCROLL = 0x0115,
WM_INITMENU = 0x0116,
WM_INITMENUPOPUP = 0x0117,
WM_MENUSELECT = 0x011F,
WM_MENUCHAR = 0x0120,
WM_ENTERIDLE = 0x0121,
WM_MENURBUTTONUP = 0x0122,
WM_MENUDRAG = 0x0123,
WM_MENUGETOBJECT = 0x0124,
WM_UNINITMENUPOPUP = 0x0125,
WM_MENUCOMMAND = 0x0126,
WM_CHANGEUISTATE = 0x0127,
WM_UPDATEUISTATE = 0x0128,
WM_QUERYUISTATE = 0x0129,
WM_CTLCOLORMSGBOX = 0x0132,
WM_CTLCOLOREDIT = 0x0133,
WM_CTLCOLORLISTBOX = 0x0134,
WM_CTLCOLORBTN = 0x0135,
WM_CTLCOLORDLG = 0x0136,
WM_CTLCOLORSCROLLBAR = 0x0137,
WM_CTLCOLORSTATIC = 0x0138,
WM_MOUSEFIRST = 0x0200,
WM_MOUSEMOVE = 0x0200,
WM_LBUTTONDOWN = 0x0201,
WM_LBUTTONUP = 0x0202,
WM_LBUTTONDBLCLK = 0x0203,
WM_RBUTTONDOWN = 0x0204,
WM_RBUTTONUP = 0x0205,
WM_RBUTTONDBLCLK = 0x0206,
WM_MBUTTONDOWN = 0x0207,
WM_MBUTTONUP = 0x0208,
WM_MBUTTONDBLCLK = 0x0209,
WM_MOUSEWHEEL = 0x020A,
WM_XBUTTONDOWN = 0x020B,
WM_XBUTTONUP = 0x020C,
WM_XBUTTONDBLCLK = 0x020D,
WM_MOUSELAST_5 = 0x020D,
WM_MOUSELAST_4 = 0x020A,
WM_MOUSELAST_PRE_4 = 0x0209,
WM_PARENTNOTIFY = 0x0210,
WM_ENTERMENULOOP = 0x0211,
WM_EXITMENULOOP = 0x0212,
WM_NEXTMENU = 0x0213,
WM_SIZING = 0x0214,
WM_CAPTURECHANGED = 0x0215,
WM_MOVING = 0x0216,
WM_POWERBROADCAST = 0x0218,
WM_DEVICECHANGE = 0x0219,
WM_MDICREATE = 0x0220,
WM_MDIDESTROY = 0x0221,
WM_MDIACTIVATE = 0x0222,
WM_MDIRESTORE = 0x0223,
WM_MDINEXT = 0x0224,
WM_MDIMAXIMIZE = 0x0225,
WM_MDITILE = 0x0226,
WM_MDICASCADE = 0x0227,
WM_MDIICONARRANGE = 0x0228,
WM_MDIGETACTIVE = 0x0229,
WM_MDISETMENU = 0x0230,
WM_ENTERSIZEMOVE = 0x0231,
WM_EXITSIZEMOVE = 0x0232,
WM_DROPFILES = 0x0233,
WM_MDIREFRESHMENU = 0x0234,
WM_IME_SETCONTEXT = 0x0281,
WM_IME_NOTIFY = 0x0282,
WM_IME_CONTROL = 0x0283,
WM_IME_COMPOSITIONFULL = 0x0284,
WM_IME_SELECT = 0x0285,
WM_IME_CHAR = 0x0286,
WM_IME_REQUEST = 0x0288,
WM_IME_KEYDOWN = 0x0290,
WM_IME_KEYUP = 0x0291,
WM_MOUSEHOVER = 0x02A1,
WM_MOUSELEAVE = 0x02A3,
WM_NCMOUSEHOVER = 0x02A0,
WM_NCMOUSELEAVE = 0x02A2,
WM_WTSSESSION_CHANGE = 0x02B1,
WM_TABLET_FIRST = 0x02c0,
WM_TABLET_LAST = 0x02df,
WM_CUT = 0x0300,
WM_COPY = 0x0301,
WM_PASTE = 0x0302,
WM_CLEAR = 0x0303,
WM_UNDO = 0x0304,
WM_RENDERFORMAT = 0x0305,
WM_RENDERALLFORMATS = 0x0306,
WM_DESTROYCLIPBOARD = 0x0307,
WM_DRAWCLIPBOARD = 0x0308,
WM_PAINTCLIPBOARD = 0x0309,
WM_VSCROLLCLIPBOARD = 0x030A,
WM_SIZECLIPBOARD = 0x030B,
WM_ASKCBFORMATNAME = 0x030C,
WM_CHANGECBCHAIN = 0x030D,
WM_HSCROLLCLIPBOARD = 0x030E,
WM_QUERYNEWPALETTE = 0x030F,
WM_PALETTEISCHANGING = 0x0310,
WM_PALETTECHANGED = 0x0311,
WM_HOTKEY = 0x0312,
WM_PRINT = 0x0317,
WM_PRINTCLIENT = 0x0318,
WM_APPCOMMAND = 0x0319,
WM_THEMECHANGED = 0x031A,
WM_HANDHELDFIRST = 0x0358,
WM_HANDHELDLAST = 0x035F,
WM_AFXFIRST = 0x0360,
WM_AFXLAST = 0x037F,
WM_PENWINFIRST = 0x0380,
WM_PENWINLAST = 0x038F,
WM_APP = 0x8000,
WM_USER = 0x0400,
EM_GETSEL = 0x00B0,
EM_SETSEL = 0x00B1,
EM_GETRECT = 0x00B2,
EM_SETRECT = 0x00B3,
EM_SETRECTNP = 0x00B4,
EM_SCROLL = 0x00B5,
EM_LINESCROLL = 0x00B6,
EM_SCROLLCARET = 0x00B7,
EM_GETMODIFY = 0x00B8,
EM_SETMODIFY = 0x00B9,
EM_GETLINECOUNT = 0x00BA,
EM_LINEINDEX = 0x00BB,
EM_SETHANDLE = 0x00BC,
EM_GETHANDLE = 0x00BD,
EM_GETTHUMB = 0x00BE,
EM_LINELENGTH = 0x00C1,
EM_REPLACESEL = 0x00C2,
EM_GETLINE = 0x00C4,
EM_LIMITTEXT = 0x00C5,
EM_CANUNDO = 0x00C6,
EM_UNDO = 0x00C7,
EM_FMTLINES = 0x00C8,
EM_LINEFROMCHAR = 0x00C9,
EM_SETTABSTOPS = 0x00CB,
EM_SETPASSWORDCHAR = 0x00CC,
EM_EMPTYUNDOBUFFER = 0x00CD,
EM_GETFIRSTVISIBLELINE = 0x00CE,
EM_SETREADONLY = 0x00CF,
EM_SETWORDBREAKPROC = 0x00D0,
EM_GETWORDBREAKPROC = 0x00D1,
EM_GETPASSWORDCHAR = 0x00D2,
EM_SETMARGINS = 0x00D3,
EM_GETMARGINS = 0x00D4,
EM_SETLIMITTEXT = EM_LIMITTEXT,
EM_GETLIMITTEXT = 0x00D5,
EM_POSFROMCHAR = 0x00D6,
EM_CHARFROMPOS = 0x00D7,
EM_SETIMESTATUS = 0x00D8,
EM_GETIMESTATUS = 0x00D9,
BM_GETCHECK= 0x00F0,
BM_SETCHECK= 0x00F1,
BM_GETSTATE= 0x00F2,
BM_SETSTATE= 0x00F3,
BM_SETSTYLE= 0x00F4,
BM_CLICK = 0x00F5,
BM_GETIMAGE= 0x00F6,
BM_SETIMAGE= 0x00F7,
STM_SETICON = 0x0170,
STM_GETICON = 0x0171,
STM_SETIMAGE = 0x0172,
STM_GETIMAGE = 0x0173,
STM_MSGMAX = 0x0174,
DM_GETDEFID = (WM_USER+0),
DM_SETDEFID = (WM_USER+1),
DM_REPOSITION = (WM_USER+2),
LB_ADDSTRING = 0x0180,
LB_INSERTSTRING = 0x0181,
LB_DELETESTRING = 0x0182,
LB_SELITEMRANGEEX= 0x0183,
LB_RESETCONTENT = 0x0184,
LB_SETSEL = 0x0185,
LB_SETCURSEL = 0x0186,
LB_GETSEL = 0x0187,
LB_GETCURSEL = 0x0188,
LB_GETTEXT = 0x0189,
LB_GETTEXTLEN = 0x018A,
LB_GETCOUNT = 0x018B,
LB_SELECTSTRING = 0x018C,
LB_DIR = 0x018D,
LB_GETTOPINDEX = 0x018E,
LB_FINDSTRING = 0x018F,
LB_GETSELCOUNT = 0x0190,
LB_GETSELITEMS = 0x0191,
LB_SETTABSTOPS = 0x0192,
LB_GETHORIZONTALEXTENT = 0x0193,
LB_SETHORIZONTALEXTENT = 0x0194,
LB_SETCOLUMNWIDTH = 0x0195,
LB_ADDFILE = 0x0196,
LB_SETTOPINDEX = 0x0197,
LB_GETITEMRECT = 0x0198,
LB_GETITEMDATA = 0x0199,
LB_SETITEMDATA = 0x019A,
LB_SELITEMRANGE = 0x019B,
LB_SETANCHORINDEX = 0x019C,
LB_GETANCHORINDEX = 0x019D,
LB_SETCARETINDEX = 0x019E,
LB_GETCARETINDEX = 0x019F,
LB_SETITEMHEIGHT = 0x01A0,
LB_GETITEMHEIGHT = 0x01A1,
LB_FINDSTRINGEXACT = 0x01A2,
LB_SETLOCALE = 0x01A5,
LB_GETLOCALE = 0x01A6,
LB_SETCOUNT = 0x01A7,
LB_INITSTORAGE = 0x01A8,
LB_ITEMFROMPOINT = 0x01A9,
LB_MULTIPLEADDSTRING = 0x01B1,
LB_GETLISTBOXINFO= 0x01B2,
LB_MSGMAX_501 = 0x01B3,
LB_MSGMAX_WCE4 = 0x01B1,
LB_MSGMAX_4 = 0x01B0,
LB_MSGMAX_PRE4 = 0x01A8,
CB_GETEDITSEL = 0x0140,
CB_LIMITTEXT = 0x0141,
CB_SETEDITSEL = 0x0142,
CB_ADDSTRING = 0x0143,
CB_DELETESTRING = 0x0144,
CB_DIR = 0x0145,
CB_GETCOUNT = 0x0146,
CB_GETCURSEL = 0x0147,
CB_GETLBTEXT = 0x0148,
CB_GETLBTEXTLEN = 0x0149,
CB_INSERTSTRING = 0x014A,
CB_RESETCONTENT = 0x014B,
CB_FINDSTRING = 0x014C,
CB_SELECTSTRING = 0x014D,
CB_SETCURSEL = 0x014E,
CB_SHOWDROPDOWN = 0x014F,
CB_GETITEMDATA = 0x0150,
CB_SETITEMDATA = 0x0151,
CB_GETDROPPEDCONTROLRECT = 0x0152,
CB_SETITEMHEIGHT = 0x0153,
CB_GETITEMHEIGHT = 0x0154,
CB_SETEXTENDEDUI = 0x0155,
CB_GETEXTENDEDUI = 0x0156,
CB_GETDROPPEDSTATE = 0x0157,
CB_FINDSTRINGEXACT = 0x0158,
CB_SETLOCALE = 0x0159,
CB_GETLOCALE = 0x015A,
CB_GETTOPINDEX = 0x015B,
CB_SETTOPINDEX = 0x015C,
CB_GETHORIZONTALEXTENT = 0x015d,
CB_SETHORIZONTALEXTENT = 0x015e,
CB_GETDROPPEDWIDTH = 0x015f,
CB_SETDROPPEDWIDTH = 0x0160,
CB_INITSTORAGE = 0x0161,
CB_MULTIPLEADDSTRING = 0x0163,
CB_GETCOMBOBOXINFO = 0x0164,
CB_MSGMAX_501 = 0x0165,
CB_MSGMAX_WCE400 = 0x0163,
CB_MSGMAX_400 = 0x0162,
CB_MSGMAX_PRE400 = 0x015B,
SBM_SETPOS = 0x00E0,
SBM_GETPOS = 0x00E1,
SBM_SETRANGE = 0x00E2,
SBM_SETRANGEREDRAW = 0x00E6,
SBM_GETRANGE = 0x00E3,
SBM_ENABLE_ARROWS = 0x00E4,
SBM_SETSCROLLINFO = 0x00E9,
SBM_GETSCROLLINFO = 0x00EA,
SBM_GETSCROLLBARINFO= 0x00EB,
LVM_FIRST = 0x1000,// ListView messages
TV_FIRST = 0x1100,// TreeView messages
HDM_FIRST = 0x1200,// Header messages
TCM_FIRST = 0x1300,// Tab control messages
PGM_FIRST = 0x1400,// Pager control messages
ECM_FIRST = 0x1500,// Edit control messages
BCM_FIRST = 0x1600,// Button control messages
CBM_FIRST = 0x1700,// Combobox control messages
CCM_FIRST = 0x2000,// Common control shared messages
CCM_LAST =(CCM_FIRST + 0x200),
CCM_SETBKCOLOR = (CCM_FIRST + 1),
CCM_SETCOLORSCHEME = (CCM_FIRST + 2),
CCM_GETCOLORSCHEME = (CCM_FIRST + 3),
CCM_GETDROPTARGET = (CCM_FIRST + 4),
CCM_SETUNICODEFORMAT = (CCM_FIRST + 5),
CCM_GETUNICODEFORMAT = (CCM_FIRST + 6),
CCM_SETVERSION = (CCM_FIRST + 0x7),
CCM_GETVERSION = (CCM_FIRST + 0x8),
CCM_SETNOTIFYWINDOW = (CCM_FIRST + 0x9),
CCM_SETWINDOWTHEME = (CCM_FIRST + 0xb),
CCM_DPISCALE = (CCM_FIRST + 0xc),
HDM_GETITEMCOUNT = (HDM_FIRST + 0),
HDM_INSERTITEMA = (HDM_FIRST + 1),
HDM_INSERTITEMW = (HDM_FIRST + 10),
HDM_DELETEITEM = (HDM_FIRST + 2),
HDM_GETITEMA = (HDM_FIRST + 3),
HDM_GETITEMW = (HDM_FIRST + 11),
HDM_SETITEMA = (HDM_FIRST + 4),
HDM_SETITEMW = (HDM_FIRST + 12),
HDM_LAYOUT = (HDM_FIRST + 5),
HDM_HITTEST = (HDM_FIRST + 6),
HDM_GETITEMRECT = (HDM_FIRST + 7),
HDM_SETIMAGELIST = (HDM_FIRST + 8),
HDM_GETIMAGELIST = (HDM_FIRST + 9),
HDM_ORDERTOINDEX = (HDM_FIRST + 15),
HDM_CREATEDRAGIMAGE = (HDM_FIRST + 16),
HDM_GETORDERARRAY = (HDM_FIRST + 17),
HDM_SETORDERARRAY = (HDM_FIRST + 18),
HDM_SETHOTDIVIDER = (HDM_FIRST + 19),
HDM_SETBITMAPMARGIN = (HDM_FIRST + 20),
HDM_GETBITMAPMARGIN = (HDM_FIRST + 21),
HDM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
HDM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
HDM_SETFILTERCHANGETIMEOUT = (HDM_FIRST+22),
HDM_EDITFILTER = (HDM_FIRST+23),
HDM_CLEARFILTER = (HDM_FIRST+24),
TB_ENABLEBUTTON = (WM_USER + 1),
TB_CHECKBUTTON = (WM_USER + 2),
TB_PRESSBUTTON = (WM_USER + 3),
TB_HIDEBUTTON = (WM_USER + 4),
TB_INDETERMINATE = (WM_USER + 5),
TB_MARKBUTTON = (WM_USER + 6),
TB_ISBUTTONENABLED = (WM_USER + 9),
TB_ISBUTTONCHECKED = (WM_USER + 10),
TB_ISBUTTONPRESSED = (WM_USER + 11),
TB_ISBUTTONHIDDEN = (WM_USER + 12),
TB_ISBUTTONINDETERMINATE = (WM_USER + 13),
TB_ISBUTTONHIGHLIGHTED = (WM_USER + 14),
TB_SETSTATE = (WM_USER + 17),
TB_GETSTATE = (WM_USER + 18),
TB_ADDBITMAP = (WM_USER + 19),
TB_ADDBUTTONSA = (WM_USER + 20),
TB_INSERTBUTTONA = (WM_USER + 21),
TB_ADDBUTTONS = (WM_USER + 20),
TB_INSERTBUTTON = (WM_USER + 21),
TB_DELETEBUTTON = (WM_USER + 22),
TB_GETBUTTON = (WM_USER + 23),
TB_BUTTONCOUNT = (WM_USER + 24),
TB_COMMANDTOINDEX = (WM_USER + 25),
TB_SAVERESTOREA = (WM_USER + 26),
TB_SAVERESTOREW = (WM_USER + 76),
TB_CUSTOMIZE = (WM_USER + 27),
TB_ADDSTRINGA = (WM_USER + 28),
TB_ADDSTRINGW = (WM_USER + 77),
TB_GETITEMRECT = (WM_USER + 29),
TB_BUTTONSTRUCTSIZE = (WM_USER + 30),
TB_SETBUTTONSIZE = (WM_USER + 31),
TB_SETBITMAPSIZE = (WM_USER + 32),
TB_AUTOSIZE = (WM_USER + 33),
TB_GETTOOLTIPS = (WM_USER + 35),
TB_SETTOOLTIPS = (WM_USER + 36),
TB_SETPARENT = (WM_USER + 37),
TB_SETROWS = (WM_USER + 39),
TB_GETROWS = (WM_USER + 40),
TB_SETCMDID = (WM_USER + 42),
TB_CHANGEBITMAP = (WM_USER + 43),
TB_GETBITMAP = (WM_USER + 44),
TB_GETBUTTONTEXTA = (WM_USER + 45),
TB_GETBUTTONTEXTW = (WM_USER + 75),
TB_REPLACEBITMAP = (WM_USER + 46),
TB_SETINDENT = (WM_USER + 47),
TB_SETIMAGELIST = (WM_USER + 48),
TB_GETIMAGELIST = (WM_USER + 49),
TB_LOADIMAGES = (WM_USER + 50),
TB_GETRECT = (WM_USER + 51),
TB_SETHOTIMAGELIST = (WM_USER + 52),
TB_GETHOTIMAGELIST = (WM_USER + 53),
TB_SETDISABLEDIMAGELIST = (WM_USER + 54),
TB_GETDISABLEDIMAGELIST = (WM_USER + 55),
TB_SETSTYLE = (WM_USER + 56),
TB_GETSTYLE = (WM_USER + 57),
TB_GETBUTTONSIZE = (WM_USER + 58),
TB_SETBUTTONWIDTH = (WM_USER + 59),
TB_SETMAXTEXTROWS = (WM_USER + 60),
TB_GETTEXTROWS = (WM_USER + 61),
TB_GETOBJECT = (WM_USER + 62),
TB_GETHOTITEM = (WM_USER + 71),
TB_SETHOTITEM = (WM_USER + 72),
TB_SETANCHORHIGHLIGHT = (WM_USER + 73),
TB_GETANCHORHIGHLIGHT = (WM_USER + 74),
TB_MAPACCELERATORA = (WM_USER + 78),
TB_GETINSERTMARK = (WM_USER + 79),
TB_SETINSERTMARK = (WM_USER + 80),
TB_INSERTMARKHITTEST = (WM_USER + 81),
TB_MOVEBUTTON = (WM_USER + 82),
TB_GETMAXSIZE = (WM_USER + 83),
TB_SETEXTENDEDSTYLE = (WM_USER + 84),
TB_GETEXTENDEDSTYLE = (WM_USER + 85),
TB_GETPADDING = (WM_USER + 86),
TB_SETPADDING = (WM_USER + 87),
TB_SETINSERTMARKCOLOR = (WM_USER + 88),
TB_GETINSERTMARKCOLOR = (WM_USER + 89),
TB_SETCOLORSCHEME = CCM_SETCOLORSCHEME,
TB_GETCOLORSCHEME = CCM_GETCOLORSCHEME,
TB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
TB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
TB_MAPACCELERATORW = (WM_USER + 90),
TB_GETBITMAPFLAGS = (WM_USER + 41),
TB_GETBUTTONINFOW = (WM_USER + 63),
TB_SETBUTTONINFOW = (WM_USER + 64),
TB_GETBUTTONINFOA = (WM_USER + 65),
TB_SETBUTTONINFOA = (WM_USER + 66),
TB_INSERTBUTTONW = (WM_USER + 67),
TB_ADDBUTTONSW = (WM_USER + 68),
TB_HITTEST = (WM_USER + 69),
TB_SETDRAWTEXTFLAGS = (WM_USER + 70),
TB_GETSTRINGW = (WM_USER + 91),
TB_GETSTRINGA = (WM_USER + 92),
TB_GETMETRICS = (WM_USER + 101),
TB_SETMETRICS = (WM_USER + 102),
TB_SETWINDOWTHEME = CCM_SETWINDOWTHEME,
RB_INSERTBANDA = (WM_USER + 1),
RB_DELETEBAND = (WM_USER + 2),
RB_GETBARINFO = (WM_USER + 3),
RB_SETBARINFO = (WM_USER + 4),
RB_GETBANDINFO = (WM_USER + 5),
RB_SETBANDINFOA = (WM_USER + 6),
RB_SETPARENT = (WM_USER + 7),
RB_HITTEST = (WM_USER + 8),
RB_GETRECT = (WM_USER + 9),
RB_INSERTBANDW = (WM_USER + 10),
RB_SETBANDINFOW = (WM_USER + 11),
RB_GETBANDCOUNT = (WM_USER + 12),
RB_GETROWCOUNT = (WM_USER + 13),
RB_GETROWHEIGHT = (WM_USER + 14),
RB_IDTOINDEX = (WM_USER + 16),
RB_GETTOOLTIPS = (WM_USER + 17),
RB_SETTOOLTIPS = (WM_USER + 18),
RB_SETBKCOLOR = (WM_USER + 19),
RB_GETBKCOLOR = (WM_USER + 20),
RB_SETTEXTCOLOR = (WM_USER + 21),
RB_GETTEXTCOLOR = (WM_USER + 22),
RB_SIZETORECT = (WM_USER + 23),
RB_SETCOLORSCHEME = CCM_SETCOLORSCHEME,
RB_GETCOLORSCHEME = CCM_GETCOLORSCHEME,
RB_BEGINDRAG = (WM_USER + 24),
RB_ENDDRAG = (WM_USER + 25),
RB_DRAGMOVE = (WM_USER + 26),
RB_GETBARHEIGHT = (WM_USER + 27),
RB_GETBANDINFOW = (WM_USER + 28),
RB_GETBANDINFOA = (WM_USER + 29),
RB_MINIMIZEBAND = (WM_USER + 30),
RB_MAXIMIZEBAND = (WM_USER + 31),
RB_GETDROPTARGET = (CCM_GETDROPTARGET),
RB_GETBANDBORDERS = (WM_USER + 34),
RB_SHOWBAND = (WM_USER + 35),
RB_SETPALETTE = (WM_USER + 37),
RB_GETPALETTE = (WM_USER + 38),
RB_MOVEBAND = (WM_USER + 39),
RB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
RB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
RB_GETBANDMARGINS = (WM_USER + 40),
RB_SETWINDOWTHEME = CCM_SETWINDOWTHEME,
RB_PUSHCHEVRON = (WM_USER + 43),
TTM_ACTIVATE = (WM_USER + 1),
TTM_SETDELAYTIME = (WM_USER + 3),
TTM_ADDTOOLA = (WM_USER + 4),
TTM_ADDTOOLW = (WM_USER + 50),
TTM_DELTOOLA = (WM_USER + 5),
TTM_DELTOOLW = (WM_USER + 51),
TTM_NEWTOOLRECTA = (WM_USER + 6),
TTM_NEWTOOLRECTW = (WM_USER + 52),
TTM_RELAYEVENT = (WM_USER + 7),
TTM_GETTOOLINFOA = (WM_USER + 8),
TTM_GETTOOLINFOW = (WM_USER + 53),
TTM_SETTOOLINFOA = (WM_USER + 9),
TTM_SETTOOLINFOW = (WM_USER + 54),
TTM_HITTESTA = (WM_USER +10),
TTM_HITTESTW = (WM_USER +55),
TTM_GETTEXTA = (WM_USER +11),
TTM_GETTEXTW = (WM_USER +56),
TTM_UPDATETIPTEXTA = (WM_USER +12),
TTM_UPDATETIPTEXTW = (WM_USER +57),
TTM_GETTOOLCOUNT = (WM_USER +13),
TTM_ENUMTOOLSA = (WM_USER +14),
TTM_ENUMTOOLSW = (WM_USER +58),
TTM_GETCURRENTTOOLA = (WM_USER + 15),
TTM_GETCURRENTTOOLW = (WM_USER + 59),
TTM_WINDOWFROMPOINT = (WM_USER + 16),
TTM_TRACKACTIVATE = (WM_USER + 17),
TTM_TRACKPOSITION = (WM_USER + 18),
TTM_SETTIPBKCOLOR = (WM_USER + 19),
TTM_SETTIPTEXTCOLOR = (WM_USER + 20),
TTM_GETDELAYTIME = (WM_USER + 21),
TTM_GETTIPBKCOLOR = (WM_USER + 22),
TTM_GETTIPTEXTCOLOR = (WM_USER + 23),
TTM_SETMAXTIPWIDTH = (WM_USER + 24),
TTM_GETMAXTIPWIDTH = (WM_USER + 25),
TTM_SETMARGIN = (WM_USER + 26),
TTM_GETMARGIN = (WM_USER + 27),
TTM_POP = (WM_USER + 28),
TTM_UPDATE = (WM_USER + 29),
TTM_GETBUBBLESIZE = (WM_USER + 30),
TTM_ADJUSTRECT = (WM_USER + 31),
TTM_SETTITLEA = (WM_USER + 32),
TTM_SETTITLEW = (WM_USER + 33),
TTM_POPUP = (WM_USER + 34),
TTM_GETTITLE = (WM_USER + 35),
TTM_SETWINDOWTHEME = CCM_SETWINDOWTHEME,
SB_SETTEXTA = (WM_USER+1),
SB_SETTEXTW = (WM_USER+11),
SB_GETTEXTA = (WM_USER+2),
SB_GETTEXTW = (WM_USER+13),
SB_GETTEXTLENGTHA = (WM_USER+3),
SB_GETTEXTLENGTHW = (WM_USER+12),
SB_SETPARTS = (WM_USER+4),
SB_GETPARTS = (WM_USER+6),
SB_GETBORDERS = (WM_USER+7),
SB_SETMINHEIGHT = (WM_USER+8),
SB_SIMPLE = (WM_USER+9),
SB_GETRECT = (WM_USER+10),
SB_ISSIMPLE = (WM_USER+14),
SB_SETICON = (WM_USER+15),
SB_SETTIPTEXTA = (WM_USER+16),
SB_SETTIPTEXTW = (WM_USER+17),
SB_GETTIPTEXTA = (WM_USER+18),
SB_GETTIPTEXTW = (WM_USER+19),
SB_GETICON = (WM_USER+20),
SB_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
SB_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
SB_SETBKCOLOR = CCM_SETBKCOLOR,
SB_SIMPLEID = 0x00ff,
TBM_GETPOS = (WM_USER),
TBM_GETRANGEMIN = (WM_USER+1),
TBM_GETRANGEMAX = (WM_USER+2),
TBM_GETTIC = (WM_USER+3),
TBM_SETTIC = (WM_USER+4),
TBM_SETPOS = (WM_USER+5),
TBM_SETRANGE = (WM_USER+6),
TBM_SETRANGEMIN = (WM_USER+7),
TBM_SETRANGEMAX = (WM_USER+8),
TBM_CLEARTICS = (WM_USER+9),
TBM_SETSEL = (WM_USER+10),
TBM_SETSELSTART = (WM_USER+11),
TBM_SETSELEND = (WM_USER+12),
TBM_GETPTICS = (WM_USER+14),
TBM_GETTICPOS = (WM_USER+15),
TBM_GETNUMTICS = (WM_USER+16),
TBM_GETSELSTART = (WM_USER+17),
TBM_GETSELEND = (WM_USER+18),
TBM_CLEARSEL = (WM_USER+19),
TBM_SETTICFREQ = (WM_USER+20),
TBM_SETPAGESIZE = (WM_USER+21),
TBM_GETPAGESIZE = (WM_USER+22),
TBM_SETLINESIZE = (WM_USER+23),
TBM_GETLINESIZE = (WM_USER+24),
TBM_GETTHUMBRECT = (WM_USER+25),
TBM_GETCHANNELRECT = (WM_USER+26),
TBM_SETTHUMBLENGTH = (WM_USER+27),
TBM_GETTHUMBLENGTH = (WM_USER+28),
TBM_SETTOOLTIPS = (WM_USER+29),
TBM_GETTOOLTIPS = (WM_USER+30),
TBM_SETTIPSIDE = (WM_USER+31),
TBM_SETBUDDY = (WM_USER+32),
TBM_GETBUDDY = (WM_USER+33),
TBM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
TBM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
DL_BEGINDRAG = (WM_USER+133),
DL_DRAGGING = (WM_USER+134),
DL_DROPPED = (WM_USER+135),
DL_CANCELDRAG = (WM_USER+136),
UDM_SETRANGE = (WM_USER+101),
UDM_GETRANGE = (WM_USER+102),
UDM_SETPOS = (WM_USER+103),
UDM_GETPOS = (WM_USER+104),
UDM_SETBUDDY = (WM_USER+105),
UDM_GETBUDDY = (WM_USER+106),
UDM_SETACCEL = (WM_USER+107),
UDM_GETACCEL = (WM_USER+108),
UDM_SETBASE = (WM_USER+109),
UDM_GETBASE = (WM_USER+110),
UDM_SETRANGE32 = (WM_USER+111),
UDM_GETRANGE32 = (WM_USER+112),
UDM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
UDM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
UDM_SETPOS32 = (WM_USER+113),
UDM_GETPOS32 = (WM_USER+114),
PBM_SETRANGE = (WM_USER+1),
PBM_SETPOS = (WM_USER+2),
PBM_DELTAPOS = (WM_USER+3),
PBM_SETSTEP = (WM_USER+4),
PBM_STEPIT = (WM_USER+5),
PBM_SETRANGE32 = (WM_USER+6),
PBM_GETRANGE = (WM_USER+7),
PBM_GETPOS = (WM_USER+8),
PBM_SETBARCOLOR = (WM_USER+9),
PBM_SETBKCOLOR = CCM_SETBKCOLOR,
HKM_SETHOTKEY = (WM_USER+1),
HKM_GETHOTKEY = (WM_USER+2),
HKM_SETRULES = (WM_USER+3),
LVM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
LVM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
LVM_GETBKCOLOR = (LVM_FIRST + 0),
LVM_SETBKCOLOR = (LVM_FIRST + 1),
LVM_GETIMAGELIST = (LVM_FIRST + 2),
LVM_SETIMAGELIST = (LVM_FIRST + 3),
LVM_GETITEMCOUNT = (LVM_FIRST + 4),
LVM_GETITEMA = (LVM_FIRST + 5),
LVM_GETITEMW = (LVM_FIRST + 75),
LVM_SETITEMA = (LVM_FIRST + 6),
LVM_SETITEMW = (LVM_FIRST + 76),
LVM_INSERTITEMA = (LVM_FIRST + 7),
LVM_INSERTITEMW = (LVM_FIRST + 77),
LVM_DELETEITEM = (LVM_FIRST + 8),
LVM_DELETEALLITEMS = (LVM_FIRST + 9),
LVM_GETCALLBACKMASK = (LVM_FIRST + 10),
LVM_SETCALLBACKMASK = (LVM_FIRST + 11),
LVM_FINDITEMA = (LVM_FIRST + 13),
LVM_FINDITEMW = (LVM_FIRST + 83),
LVM_GETITEMRECT = (LVM_FIRST + 14),
LVM_SETITEMPOSITION = (LVM_FIRST + 15),
LVM_GETITEMPOSITION = (LVM_FIRST + 16),
LVM_GETSTRINGWIDTHA = (LVM_FIRST + 17),
LVM_GETSTRINGWIDTHW = (LVM_FIRST + 87),
LVM_HITTEST = (LVM_FIRST + 18),
LVM_ENSUREVISIBLE = (LVM_FIRST + 19),
LVM_SCROLL = (LVM_FIRST + 20),
LVM_REDRAWITEMS = (LVM_FIRST + 21),
LVM_ARRANGE = (LVM_FIRST + 22),
LVM_EDITLABELA = (LVM_FIRST + 23),
LVM_EDITLABELW = (LVM_FIRST + 118),
LVM_GETEDITCONTROL = (LVM_FIRST + 24),
LVM_GETCOLUMNA = (LVM_FIRST + 25),
LVM_GETCOLUMNW = (LVM_FIRST + 95),
LVM_SETCOLUMNA = (LVM_FIRST + 26),
LVM_SETCOLUMNW = (LVM_FIRST + 96),
LVM_INSERTCOLUMNA = (LVM_FIRST + 27),
LVM_INSERTCOLUMNW = (LVM_FIRST + 97),
LVM_DELETECOLUMN = (LVM_FIRST + 28),
LVM_GETCOLUMNWIDTH = (LVM_FIRST + 29),
LVM_SETCOLUMNWIDTH = (LVM_FIRST + 30),
LVM_CREATEDRAGIMAGE = (LVM_FIRST + 33),
LVM_GETVIEWRECT = (LVM_FIRST + 34),
LVM_GETTEXTCOLOR = (LVM_FIRST + 35),
LVM_SETTEXTCOLOR = (LVM_FIRST + 36),
LVM_GETTEXTBKCOLOR = (LVM_FIRST + 37),
LVM_SETTEXTBKCOLOR = (LVM_FIRST + 38),
LVM_GETTOPINDEX = (LVM_FIRST + 39),
LVM_GETCOUNTPERPAGE = (LVM_FIRST + 40),
LVM_GETORIGIN = (LVM_FIRST + 41),
LVM_UPDATE = (LVM_FIRST + 42),
LVM_SETITEMSTATE = (LVM_FIRST + 43),
LVM_GETITEMSTATE = (LVM_FIRST + 44),
LVM_GETITEMTEXTA = (LVM_FIRST + 45),
LVM_GETITEMTEXTW = (LVM_FIRST + 115),
LVM_SETITEMTEXTA = (LVM_FIRST + 46),
LVM_SETITEMTEXTW = (LVM_FIRST + 116),
LVM_SETITEMCOUNT = (LVM_FIRST + 47),
LVM_SORTITEMS = (LVM_FIRST + 48),
LVM_SETITEMPOSITION32 = (LVM_FIRST + 49),
LVM_GETSELECTEDCOUNT = (LVM_FIRST + 50),
LVM_GETITEMSPACING = (LVM_FIRST + 51),
LVM_GETISEARCHSTRINGA = (LVM_FIRST + 52),
LVM_GETISEARCHSTRINGW = (LVM_FIRST + 117),
LVM_SETICONSPACING = (LVM_FIRST + 53),
LVM_SETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 54),
LVM_GETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 55),
LVM_GETSUBITEMRECT = (LVM_FIRST + 56),
LVM_SUBITEMHITTEST = (LVM_FIRST + 57),
LVM_SETCOLUMNORDERARRAY = (LVM_FIRST + 58),
LVM_GETCOLUMNORDERARRAY = (LVM_FIRST + 59),
LVM_SETHOTITEM = (LVM_FIRST + 60),
LVM_GETHOTITEM = (LVM_FIRST + 61),
LVM_SETHOTCURSOR = (LVM_FIRST + 62),
LVM_GETHOTCURSOR = (LVM_FIRST + 63),
LVM_APPROXIMATEVIEWRECT = (LVM_FIRST + 64),
LVM_SETWORKAREAS = (LVM_FIRST + 65),
LVM_GETWORKAREAS = (LVM_FIRST + 70),
LVM_GETNUMBEROFWORKAREAS = (LVM_FIRST + 73),
LVM_GETSELECTIONMARK = (LVM_FIRST + 66),
LVM_SETSELECTIONMARK = (LVM_FIRST + 67),
LVM_SETHOVERTIME = (LVM_FIRST + 71),
LVM_GETHOVERTIME = (LVM_FIRST + 72),
LVM_SETTOOLTIPS = (LVM_FIRST + 74),
LVM_GETTOOLTIPS = (LVM_FIRST + 78),
LVM_SORTITEMSEX = (LVM_FIRST + 81),
LVM_SETBKIMAGEA = (LVM_FIRST + 68),
LVM_SETBKIMAGEW = (LVM_FIRST + 138),
LVM_GETBKIMAGEA = (LVM_FIRST + 69),
LVM_GETBKIMAGEW = (LVM_FIRST + 139),
LVM_SETSELECTEDCOLUMN = (LVM_FIRST + 140),
LVM_SETTILEWIDTH = (LVM_FIRST + 141),
LVM_SETVIEW = (LVM_FIRST + 142),
LVM_GETVIEW = (LVM_FIRST + 143),
LVM_INSERTGROUP = (LVM_FIRST + 145),
LVM_SETGROUPINFO = (LVM_FIRST + 147),
LVM_GETGROUPINFO = (LVM_FIRST + 149),
LVM_REMOVEGROUP = (LVM_FIRST + 150),
LVM_MOVEGROUP = (LVM_FIRST + 151),
LVM_MOVEITEMTOGROUP = (LVM_FIRST + 154),
LVM_SETGROUPMETRICS = (LVM_FIRST + 155),
LVM_GETGROUPMETRICS = (LVM_FIRST + 156),
LVM_ENABLEGROUPVIEW = (LVM_FIRST + 157),
LVM_SORTGROUPS = (LVM_FIRST + 158),
LVM_INSERTGROUPSORTED = (LVM_FIRST + 159),
LVM_REMOVEALLGROUPS = (LVM_FIRST + 160),
LVM_HASGROUP = (LVM_FIRST + 161),
LVM_SETTILEVIEWINFO = (LVM_FIRST + 162),
LVM_GETTILEVIEWINFO = (LVM_FIRST + 163),
LVM_SETTILEINFO = (LVM_FIRST + 164),
LVM_GETTILEINFO = (LVM_FIRST + 165),
LVM_SETINSERTMARK = (LVM_FIRST + 166),
LVM_GETINSERTMARK = (LVM_FIRST + 167),
LVM_INSERTMARKHITTEST = (LVM_FIRST + 168),
LVM_GETINSERTMARKRECT = (LVM_FIRST + 169),
LVM_SETINSERTMARKCOLOR = (LVM_FIRST + 170),
LVM_GETINSERTMARKCOLOR = (LVM_FIRST + 171),
LVM_SETINFOTIP = (LVM_FIRST + 173),
LVM_GETSELECTEDCOLUMN = (LVM_FIRST + 174),
LVM_ISGROUPVIEWENABLED = (LVM_FIRST + 175),
LVM_GETOUTLINECOLOR = (LVM_FIRST + 176),
LVM_SETOUTLINECOLOR = (LVM_FIRST + 177),
LVM_CANCELEDITLABEL = (LVM_FIRST + 179),
LVM_MAPINDEXTOID = (LVM_FIRST + 180),
LVM_MAPIDTOINDEX = (LVM_FIRST + 181),
TVM_INSERTITEMA = (TV_FIRST + 0),
TVM_INSERTITEMW = (TV_FIRST + 50),
TVM_DELETEITEM = (TV_FIRST + 1),
TVM_EXPAND = (TV_FIRST + 2),
TVM_GETITEMRECT = (TV_FIRST + 4),
TVM_GETCOUNT = (TV_FIRST + 5),
TVM_GETINDENT = (TV_FIRST + 6),
TVM_SETINDENT = (TV_FIRST + 7),
TVM_GETIMAGELIST = (TV_FIRST + 8),
TVM_SETIMAGELIST = (TV_FIRST + 9),
TVM_GETNEXTITEM = (TV_FIRST + 10),
TVM_SELECTITEM = (TV_FIRST + 11),
TVM_GETITEMA = (TV_FIRST + 12),
TVM_GETITEMW = (TV_FIRST + 62),
TVM_SETITEMA = (TV_FIRST + 13),
TVM_SETITEMW = (TV_FIRST + 63),
TVM_EDITLABELA = (TV_FIRST + 14),
TVM_EDITLABELW = (TV_FIRST + 65),
TVM_GETEDITCONTROL = (TV_FIRST + 15),
TVM_GETVISIBLECOUNT = (TV_FIRST + 16),
TVM_HITTEST = (TV_FIRST + 17),
TVM_CREATEDRAGIMAGE = (TV_FIRST + 18),
TVM_SORTCHILDREN = (TV_FIRST + 19),
TVM_ENSUREVISIBLE = (TV_FIRST + 20),
TVM_SORTCHILDRENCB = (TV_FIRST + 21),
TVM_ENDEDITLABELNOW = (TV_FIRST + 22),
TVM_GETISEARCHSTRINGA = (TV_FIRST + 23),
TVM_GETISEARCHSTRINGW = (TV_FIRST + 64),
TVM_SETTOOLTIPS = (TV_FIRST + 24),
TVM_GETTOOLTIPS = (TV_FIRST + 25),
TVM_SETINSERTMARK = (TV_FIRST + 26),
TVM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
TVM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
TVM_SETITEMHEIGHT = (TV_FIRST + 27),
TVM_GETITEMHEIGHT = (TV_FIRST + 28),
TVM_SETBKCOLOR = (TV_FIRST + 29),
TVM_SETTEXTCOLOR = (TV_FIRST + 30),
TVM_GETBKCOLOR = (TV_FIRST + 31),
TVM_GETTEXTCOLOR = (TV_FIRST + 32),
TVM_SETSCROLLTIME = (TV_FIRST + 33),
TVM_GETSCROLLTIME = (TV_FIRST + 34),
TVM_SETINSERTMARKCOLOR = (TV_FIRST + 37),
TVM_GETINSERTMARKCOLOR = (TV_FIRST + 38),
TVM_GETITEMSTATE = (TV_FIRST + 39),
TVM_SETLINECOLOR = (TV_FIRST + 40),
TVM_GETLINECOLOR = (TV_FIRST + 41),
TVM_MAPACCIDTOHTREEITEM = (TV_FIRST + 42),
TVM_MAPHTREEITEMTOACCID = (TV_FIRST + 43),
CBEM_INSERTITEMA = (WM_USER + 1),
CBEM_SETIMAGELIST = (WM_USER + 2),
CBEM_GETIMAGELIST = (WM_USER + 3),
CBEM_GETITEMA = (WM_USER + 4),
CBEM_SETITEMA = (WM_USER + 5),
CBEM_DELETEITEM = CB_DELETESTRING,
CBEM_GETCOMBOCONTROL = (WM_USER + 6),
CBEM_GETEDITCONTROL = (WM_USER + 7),
CBEM_SETEXTENDEDSTYLE = (WM_USER + 14),
CBEM_GETEXTENDEDSTYLE = (WM_USER + 9),
CBEM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
CBEM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
CBEM_SETEXSTYLE = (WM_USER + 8),
CBEM_GETEXSTYLE = (WM_USER + 9),
CBEM_HASEDITCHANGED = (WM_USER + 10),
CBEM_INSERTITEMW = (WM_USER + 11),
CBEM_SETITEMW = (WM_USER + 12),
CBEM_GETITEMW = (WM_USER + 13),
TCM_GETIMAGELIST = (TCM_FIRST + 2),
TCM_SETIMAGELIST = (TCM_FIRST + 3),
TCM_GETITEMCOUNT = (TCM_FIRST + 4),
TCM_GETITEMA = (TCM_FIRST + 5),
TCM_GETITEMW = (TCM_FIRST + 60),
TCM_SETITEMA = (TCM_FIRST + 6),
TCM_SETITEMW = (TCM_FIRST + 61),
TCM_INSERTITEMA = (TCM_FIRST + 7),
TCM_INSERTITEMW = (TCM_FIRST + 62),
TCM_DELETEITEM = (TCM_FIRST + 8),
TCM_DELETEALLITEMS = (TCM_FIRST + 9),
TCM_GETITEMRECT = (TCM_FIRST + 10),
TCM_GETCURSEL = (TCM_FIRST + 11),
TCM_SETCURSEL = (TCM_FIRST + 12),
TCM_HITTEST = (TCM_FIRST + 13),
TCM_SETITEMEXTRA = (TCM_FIRST + 14),
TCM_ADJUSTRECT = (TCM_FIRST + 40),
TCM_SETITEMSIZE = (TCM_FIRST + 41),
TCM_REMOVEIMAGE = (TCM_FIRST + 42),
TCM_SETPADDING = (TCM_FIRST + 43),
TCM_GETROWCOUNT = (TCM_FIRST + 44),
TCM_GETTOOLTIPS = (TCM_FIRST + 45),
TCM_SETTOOLTIPS = (TCM_FIRST + 46),
TCM_GETCURFOCUS = (TCM_FIRST + 47),
TCM_SETCURFOCUS = (TCM_FIRST + 48),
TCM_SETMINTABWIDTH = (TCM_FIRST + 49),
TCM_DESELECTALL = (TCM_FIRST + 50),
TCM_HIGHLIGHTITEM = (TCM_FIRST + 51),
TCM_SETEXTENDEDSTYLE = (TCM_FIRST + 52),
TCM_GETEXTENDEDSTYLE = (TCM_FIRST + 53),
TCM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
TCM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
ACM_OPENA = (WM_USER+100),
ACM_OPENW = (WM_USER+103),
ACM_PLAY = (WM_USER+101),
ACM_STOP = (WM_USER+102),
MCM_FIRST = 0x1000,
MCM_GETCURSEL = (MCM_FIRST + 1),
MCM_SETCURSEL = (MCM_FIRST + 2),
MCM_GETMAXSELCOUNT = (MCM_FIRST + 3),
MCM_SETMAXSELCOUNT = (MCM_FIRST + 4),
MCM_GETSELRANGE = (MCM_FIRST + 5),
MCM_SETSELRANGE = (MCM_FIRST + 6),
MCM_GETMONTHRANGE = (MCM_FIRST + 7),
MCM_SETDAYSTATE = (MCM_FIRST + 8),
MCM_GETMINREQRECT = (MCM_FIRST + 9),
MCM_SETCOLOR = (MCM_FIRST + 10),
MCM_GETCOLOR = (MCM_FIRST + 11),
MCM_SETTODAY = (MCM_FIRST + 12),
MCM_GETTODAY = (MCM_FIRST + 13),
MCM_HITTEST = (MCM_FIRST + 14),
MCM_SETFIRSTDAYOFWEEK = (MCM_FIRST + 15),
MCM_GETFIRSTDAYOFWEEK = (MCM_FIRST + 16),
MCM_GETRANGE = (MCM_FIRST + 17),
MCM_SETRANGE = (MCM_FIRST + 18),
MCM_GETMONTHDELTA = (MCM_FIRST + 19),
MCM_SETMONTHDELTA = (MCM_FIRST + 20),
MCM_GETMAXTODAYWIDTH = (MCM_FIRST + 21),
MCM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT,
MCM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT,
DTM_FIRST = 0x1000,
DTM_GETSYSTEMTIME = (DTM_FIRST + 1),
DTM_SETSYSTEMTIME = (DTM_FIRST + 2),
DTM_GETRANGE = (DTM_FIRST + 3),
DTM_SETRANGE = (DTM_FIRST + 4),
DTM_SETFORMATA = (DTM_FIRST + 5),
DTM_SETFORMATW = (DTM_FIRST + 50),
DTM_SETMCCOLOR = (DTM_FIRST + 6),
DTM_GETMCCOLOR = (DTM_FIRST + 7),
DTM_GETMONTHCAL = (DTM_FIRST + 8),
DTM_SETMCFONT = (DTM_FIRST + 9),
DTM_GETMCFONT = (DTM_FIRST + 10),
PGM_SETCHILD = (PGM_FIRST + 1),
PGM_RECALCSIZE = (PGM_FIRST + 2),
PGM_FORWARDMOUSE = (PGM_FIRST + 3),
PGM_SETBKCOLOR = (PGM_FIRST + 4),
PGM_GETBKCOLOR = (PGM_FIRST + 5),
PGM_SETBORDER = (PGM_FIRST + 6),
PGM_GETBORDER = (PGM_FIRST + 7),
PGM_SETPOS = (PGM_FIRST + 8),
PGM_GETPOS = (PGM_FIRST + 9),
PGM_SETBUTTONSIZE = (PGM_FIRST + 10),
PGM_GETBUTTONSIZE = (PGM_FIRST + 11),
PGM_GETBUTTONSTATE = (PGM_FIRST + 12),
PGM_GETDROPTARGET = CCM_GETDROPTARGET,
BCM_GETIDEALSIZE = (BCM_FIRST + 0x0001),
BCM_SETIMAGELIST = (BCM_FIRST + 0x0002),
BCM_GETIMAGELIST = (BCM_FIRST + 0x0003),
BCM_SETTEXTMARGIN = (BCM_FIRST + 0x0004),
BCM_GETTEXTMARGIN = (BCM_FIRST + 0x0005),
EM_SETCUEBANNER = (ECM_FIRST + 1),
EM_GETCUEBANNER = (ECM_FIRST + 2),
EM_SHOWBALLOONTIP = (ECM_FIRST + 3),
EM_HIDEBALLOONTIP = (ECM_FIRST + 4),
CB_SETMINVISIBLE = (CBM_FIRST + 1),
CB_GETMINVISIBLE = (CBM_FIRST + 2),
LM_HITTEST = (WM_USER + 0x300),
LM_GETIDEALHEIGHT = (WM_USER + 0x301),
LM_SETITEM = (WM_USER + 0x302),
LM_GETITEM = (WM_USER + 0x303)
}
}

系统消息

消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,
  
  它在Windows单元中是这样声明的:
  type
  TMsg = packed record
  hwnd: HWND; / /窗口句柄
  message: UINT; / /消息常量标识符
  wParam: WPARAM ; // 32位消息的特定附加信息
  lParam: LPARAM ; // 32位消息的特定附加信息
  time: DWORD; / /消息创建时的时间
  pt: TPoint; / /消息创建时的鼠标位置
  end;
  
  消息中有什么?

  是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:
  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_NULL = $0000;
  WM_CREATE =$0001;
  应用程序创建一个窗口
  WM_DESTROY =$0002;
  一个窗口被销毁
  WM_MOVE =$0003;
  移动一个窗口
  WM_SIZE =$0005;
  改变一个窗口的大小
  WM_ACTIVATE =$0006;
  一个窗口被激活或失去激活状态;
  WM_SETFOCUS =$0007;
  获得焦点后
  WM_KILLFOCUS =$0008;
  失去焦点
  WM_ENABLE =$000A;
  改变enable状态
  WM_SETREDRAW =$000B;
  设置窗口是否能重画
  WM_SETTEXT =$000C;
  应用程序发送此消息来设置一个窗口的文本
  WM_GETTEXT =$000D;
  应用程序发送此消息来复制对应窗口的文本到缓冲区
  WM_GETTEXTLENGTH =$000E;
  得到与一个窗口有关的文本的长度(不包含空字符)
  WM_PAINT =$000F;
  要求一个窗口重画自己
  WM_CLOSE =$0010;
  当一个窗口或应用程序要关闭时发送一个信号
  WM_QUERYENDSESSION =$0011;
  当用户选择结束对话框或程序自己调用ExitWindows函数
  WM_QUIT =$0012;
  用来结束程序运行或当程序调用postquitmessage函数
  WM_QUERYOPEN =$0013;
  当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
  WM_ERASEBKGND =$0014;
  当窗口背景必须被擦除时(例在窗口改变大小时)
  WM_SYSCOLORCHANGE =$0015;
  当系统颜色改变时,发送此消息给所有顶级窗口
  WM_ENDSESSION =$0016;
  当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,
  通知它对话是否结束
  WM_SYSTEMERROR =$0017;
  WM_SHOWWINDOW =$0018;
  当隐藏或显示窗口是发送此消息给这个窗口
  WM_ACTIVATEAPP =$001C;
  发此消息给应用程序哪个窗口是激活的,哪个是非激活的;
  WM_FONTCHANGE =$001D;
  当系统的字体资源库变化时发送此消息给所有顶级窗口
  WM_TIMECHANGE =$001E;
  当系统的时间变化时发送此消息给所有顶级窗口
  WM_CANCELMODE =$001F;
  发送此消息来取消某种正在进行的摸态(操作)
  WM_SETCURSOR =$0020;
  如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
  WM_MOUSEACTIVATE =$0021;
  当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
  WM_CHILDACTIVATE =$0022;
  发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
  WM_QUEUESYNC =$0023;
  此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序
  分离出用户输入消息
  WM_GETMINMAXINFO =$0024;
  此消息发送给窗口当它将要改变大小或位置;
  WM_PAINTICON =$0026;
  发送给最小化窗口当它图标将要被重画
  WM_ICONERASEBKGND =$0027;
  此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
  WM_NEXTDLGCTL =$0028;
  发送此消息给一个对话框程序去更改焦点位置
  WM_SPOOLERSTATUS =$002A;
  每当打印管理列队增加或减少一条作业时发出此消息  
  WM_DRAWITEM =$002B;
 当button,combobox,listbox,menu的可视外观改变时发送
  此消息给这些空件的所有者
  WM_MEASUREITEM =$002C;
  当button, combo box, list box, list view control, or menu item 被创建时
  发送此消息给控件的所有者
  WM_DELETEITEM =$002D;
  当the list box 或 combo box 被销毁 或 当 某些项被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息
  WM_VKEYTOITEM =$002E;
  此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
  WM_CHARTOITEM =$002F;
  此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
  WM_SETFONT =$0030;
  当绘制文本时程序发送此消息得到控件要用的颜色
  WM_GETFONT =$0031;
  应用程序发送此消息得到当前控件绘制文本的字体
  WM_SETHOTKEY =$0032;
  应用程序发送此消息让一个窗口与一个热键相关连
  WM_GETHOTKEY =$0033;
  应用程序发送此消息来判断热键与某个窗口是否有关联
  WM_QUERYDRAGICON =$0037;
  此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
  WM_COMPAREITEM =$0039;
  发送此消息来判定combobox或listbox新增加的项的相对位置
  WM_GETOBJECT =$003D;
  WM_COMPACTING =$0041;
  显示内存已经很少了
  WM_WINDOWPOSCHANGING =$0046;
  发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
  WM_WINDOWPOSCHANGED =$0047;
  发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
  WM_POWER =$0048;(适用于16位的windows)
  当系统将要进入暂停状态时发送此消息
  WM_COPYDATA =$004A;
  当一个应用程序传递数据给另一个应用程序时发送此消息
  WM_CANCELJOURNAL =$004B;
  当某个用户取消程序日志激活状态,提交此消息给程序
  WM_NOTIFY =$004E;
  当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
  WM_INPUTLANGCHANGEREQUEST =$0050;
  当用户选择某种输入语言,或输入语言的热键改变
  WM_INPUTLANGCHANGE =$0051;
  当平台现场已经被改变后发送此消息给受影响的最顶级窗口
  WM_TCARD =$0052;
  当程序已经初始化windows帮助例程时发送此消息给应用程序
  WM_HELP =$0053;
  此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就
  发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
  WM_USERCHANGED =$0054;
  当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体
  设置信息,在用户更新设置时系统马上发送此消息;
  WM_NOTIFYFORMAT =$0055;
  公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
  在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信
  WM_CONTEXTMENU =$007B;
  当用户某个窗口中点击了一下右键就发送此消息给这个窗口
  WM_STYLECHANGING =$007C;
  当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口
  WM_STYLECHANGED =$007D;
  当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
  WM_DISPLAYCHANGE =$007E;
  当显示器的分辨率改变后发送此消息给所有的窗口
  WM_GETICON =$007F;
  此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄;
  WM_SETICON =$0080;
  程序发送此消息让一个新的大图标或小图标与某个窗口关联;
  WM_NCCREATE =$0081;
  当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送;
  WM_NCDESTROY =$0082;
  此消息通知某个窗口,非客户区正在销毁
  WM_NCCALCSIZE =$0083;
  当某个窗口的客户区域必须被核算时发送此消息
  WM_NCHITTEST =$0084;;
移动鼠标,按住或释放鼠标时发生
  WM_NCPAINT =$0085;
  程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时;
  WM_NCACTIVATE =$0086;
  此消息发送给某个窗口 仅当它的非客户区需要被改变来显示是激活还是非激活状态;
  WM_GETDLGCODE =$0087;
  发送此消息给某个与对话框程序关联的控件,widdows控制

无边框窗体系统菜单

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace NoBorderForm
...{
public partial class NoBorder : Form
...{
[DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
public static extern int GetWindowLong(HandleRef hWnd, int nIndex);

[DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLong(HandleRef hWnd, int nIndex, int dwNewLong);

public NoBorder()
...{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
...{
int WS_SYSMENU = 0x00080000;

this.FormBorderStyle = FormBorderStyle.None;

int windowLong = (GetWindowLong(new HandleRef(this, this.Handle), -16));
SetWindowLong(new HandleRef(this, this.Handle), -16, windowLong | WS_SYSMENU);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0010)
{//屏蔽关闭消息
this.Hide();
}
else
{
base.WndProc(ref m);
}
}
}
}

Trackback:http://blog.csdn.net/hbxtlhx/archive/2007/08/01/1721061.aspx

2008年1月15日星期二

webbrowser_external

using System.Windows.Forms;
using System.Security.Permissions;

[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]

public class Form1 : Form
{
private WebBrowser webBrowser1 = new WebBrowser();
private Button button1 = new Button();

[STAThread]
public static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}

public Form1()
{
button1.Text = "call script code from client code";
button1.Dock = DockStyle.Top;
button1.Click += new EventHandler(button1_Click);
webBrowser1.Dock = DockStyle.Fill;
Controls.Add(webBrowser1);
Controls.Add(button1);
Load += new EventHandler(Form1_Load);
}

private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.IsWebBrowserContextMenuEnabled = false;
webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.ObjectForScripting = this;
// Uncomment the following line when you are finished debugging.
//webBrowser1.ScriptErrorsSuppressed = true;

webBrowser1.DocumentText =
"<html><head><script>" +
"function test(message) { alert(message); }" +
"</script></head><body><button " +
"onclick=\"window.external.Test('called from script code')\">" +
"call client code from script code</button>" +
"</body></html>";
}

public void Test(String message)
{
MessageBox.Show(message, "client code");
}

private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Document.InvokeScript("test",
new String[] { "called from client code" });
}

}

2008年1月3日星期四

让你的.NET程序脱离Framework跑起来

摘自:
Mono虽好,可是他毕竟不是Microsoft .NET Framework,至少它的WinForms是采用了java里swing同样的方法,所以无论用户的主题多么漂亮,WinForm都是传统的Windows界面,作为桌面应用时就显得格格不入。

安装

但.NET核心文件并不多(相对而言,相比mono你会发现他很庞大)

我给出我的报告文件,看这个要比看那2mb的log轻松得多。

///////////////////////

files:

c:\windows\system32\mscoree.dll

c:\windows\system32\mscorier.dll

c:\windows\system32\mscories.dll

c:\windows\system32\dfshim.dll

c:\windows\system32\netfxperf.dll

这几个文件一定要放在system32下面

C:\windows\system32\mui\0409\mscoreer.dll

C:\windows\system32\mui\0409\mscorees.dll

我猜想mui下面其他版本的也是必须的

C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089

c:\windows\assembly\gac_32\[others]

需要其他的组件也要添加,比如System.Windows.Forms

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\[others]

这个文件夹下面只需要mscorjit.dll mscorwks.dll两个文件就可以使console运作正常,其他的我还没试过

c:\windows\winsxs\Manifests\...

c:\windows\winsxs\policies\...

c:\windows\winsxs\...

winsxs下有很多重要的组件,版本也很繁杂。确保一个都不能少。这些文件支撑着mscorwks.dll,没有他,mscorwks也无法加载。

////////////////////////////

REG:

HKEY_CLASSES_ROOT\TypeLib\{BED7F4EA-1A96-11D2-8F08-00A0C9A6186D}

HKEY_CLASSES_ROOT\TypeLib\{BED7F4EA-1A96-11D2-8F08-00A0C9A6186D}\2.0 = REG_SZ, "mscorlib.dll"

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\InstallRoot = "REG_SZ,C:\WINDOWS\Microsoft.NET\Framework\"

  只要设置了安装位置,jit自己能找到相应的framework

  有了这些文件,你就能运行.net 2.0的程序了。当然这是最小要求。

  我提供这些文件清单不是想让你把他们弄到你客户的电脑里去,而是希望有人能做出像thinstall那样的虚拟环境供程序运行,那么提供thinstall那样的功能也就不是什么难事了。

.NET Framework时,他对你系统的改动还真不少,光是一个记录文件就有2mb。(在一个不带.net framework的winxp sp2虚拟机上安装.net framework 2.0得到)

让 .Net 程序 脱离 .net framework框架 运行(源代码实现说明)

前面介绍了 “让 .Net 程序 脱离 .net framework框架 运行的方法”,
该方法主要是利用了Fetion的框架来实现的,
今天我们要介绍的是不使用Fetion的框架,自己来实现Fetion框架的相关功能,
并给出相关实现代码。

关于Fetion框架它主要是有两个文件,FetionVM.exe和FetionVM.rsm。其中对于第二个文件,我们在介绍 native compile 保护的dotNet本地程序还原成dotNet IL程序集 时已经给出了其实现的源代码。

今回就给出 FetionVM.exe 功能实现的,近似代码。

首先使用 remote的试用版 创建一个demo 程序,然后对这个demo程序进行分析,分析发现它的 loader 实际使用是通过调用 rsdeploy.dll 导出的三个函数完成初始化工作,并把控制权转交到dotNet程序集。

这三个函数的原型定义:
typedef BOOL (WINAPI* pInitialize)(HMODULE h, LPCSTR szModule, LPCSTR szMainExe);
typedef BOOL (WINAPI* pReloc)(HMODULE hModule, PIMAGE_NT_HEADERS pNtHeader);
typedef BOOL (WINAPI* pResolveImportDLL)(HMODULE);

有朋友对此多有不满,删除完整实现代码,只对实现代码进行说明

首先是Load要运行的dotNet程序文件,得到HMODULE 句柄,在三个函数中都要用到了。
然后调用 Initialize函数,szModule 是 dotNet程序的文件名,szMainExe 当前执行文件的文件名。
再调用 Reloc 处理重定位表。pNtHeader 也是 dotNet程序在内存中加载后的 NtHeader。
然后 调用ResolveImport,处理导入的dll。
最后将jmp到 dotNet程序的入口,转移控制权。


另外我还发现了另外一种使用实现方法,就是上次提到的那个 dotNet加密壳的 vm unpacker,它也使用了remotesoft 的虚拟框架,但是它没有使用rsdeploy导出的那三个函数。

昨天上 ReTeam 的论坛看到这个 unpacker 更新了。下载回来研究了一下,对于其初始化 DotNetVM 的部分还没有细看,主要看了一下它对框架 hook 的变化,发现其在Jit层中的 Hook 位置移动了。好像是Hook了 emitter对象的一个成员函数,emitter对象是被 complie调用的,位置应该算比较深了,方法体重构方式没有变化。目前的加密壳核心似乎都无法逃过其Hook的拦截。
它拦截的位置比较深,DNGuard HVM标准版对其也没有检测,不过对于DNGuard HVM标准加密的程序集,其脱壳功能仍然无害。试用版的就不能幸免了。

目前对其使用 dotnetvm 的方法比较感兴趣了,简单的看了一下,它只是load了rsdeploy.dll。没有调用rsdeploy导出的三个函数。看起来好像是直接调用了mscorwks中的函数,有可能它自己实现了这三个函数的功能。
感兴趣的朋友可以一起来分析一下,有什么收获再跟大家分享。

引用:

2008年1月2日星期三

.NET资源列表

迅雷博客上的一些视频教程:
http://xiazhi33.blog.xunlei.com

MicroSoft The .Net Show
http://msdn.microsoft.com/theshow/default.aspx
相当不错的~

C#高级编程(第3版)在线看
http://www.51shuji.com/article/10/16176/index.html

关于API的
http://www.webtropy.com/articles/Win32-API-DllImport-art9.asp

2007年12月24日星期一

混音

Symbian 6.1上实现的混音是个比较麻烦的问题,因为程序只能同时播放一个音乐,实现混音就需要程序自己来实现。下面是我从newlc上找到的一个关于PCM脉冲编码的音频信号的混音实现,其中包含了一个关键的混音算法!

Hi !!!!

I am not sure weather I have fully understood your question or not, I persume that you are asking
"How can we mix two or more audio stream", If this is the question then I am explaning below the
mixing of the two audio stream (You Can Mix More Audio Stream),

Step 1,

Get the Raw data of the two files, (Example, of the sample 8bit and 8Kh, means one sample is of
8bit)


Step 2

Let the two audio signal be A and B respectively, the range is between 0 and 255. Where A and B are the
Sample Values (Each raw data) And store the resultant into the Y

If Both the samples Values are possitve

Y = A + B - A * B / 255

Where Y is the resultant signal which contains both signal A and B, merging two audio streams into single
stream by this method solves the problem of overflow and information loss to an extent.


If the range of 8-bit sampling is between -127 to 128

If both A and B are negative Y = A +B - (A * B / (-127))
Else Y = A + B - A * B / 128


Similarly for the nbit (ex 16bit data)

For n-bit sampling audio signal


If both A and B are negative Y = A + B - (A * B / (-(2 pow(n-1) -1)))
Else Y = A + B - (A * B / (2 pow(n-1))


Step 3.

Add the Header to the Resultant (mixed) data and play back.

If some thing is unclear and ambigious let me know.

Regards
Ranjeet Gupta.

还有简单C程序示意代码,但是其中包含了核心算法:
#include
#include
#include
#include

int main(int argc,char *argv[]) {
char mixname[255];
FILE *pcm1, *pcm2, *mix;
char sample1, sample2;
int value;

pcm1 = fopen(argv[1],"r");
pcm2 = fopen(argv[2],"r");

strcpy (mixname, argv[1]);
strcat (mixname, "_temp.wav");
mix = fopen(mixname, "w");

while(!feof(pcm1)) {

sample1 = fgetc(pcm1);
sample2 = fgetc(pcm2);

if ((sample1 < 0) && (sample2 < 0)) {
value = sample1 + sample2 - (sample1 * sample2 / -(pow(2,16-1)-1));
}else{
value = sample1 + sample2 - (sample1 * sample2 / (pow(2,16-1)-1));
}

fputc(value, mix);
}


fclose(pcm1);
fclose(pcm2);
fclose(mix);

return 0;
}

另外,如果只是在Symbian上实现混音,在Nokia 的官方网站上,也有一个SoundMixer的examples
http://www.forum.nokia.com/info/sw.nokia.com/id/70a2bde5-9b14-41b3-89ae-198b0d8d380d/SoundMixer_Example_v1_0.zip.html

2007年12月23日星期日

多路数字语音合成

摘要数字音频混音是嵌入式多媒体设备不可缺少的功能,本文介绍数字混音的基本原理,并提供了几种实际应用方法,并进行了实际的测试,取得了良好的效果。 ---- 关键词 多路语音合成,混音,衰减因子。 1.引言 ---- 随着嵌入式处理器的处理能力不断加强,网络技术的不断进展,嵌入式多媒体通讯已经迅速普及,其应用产品前途很越来越广泛,如IP电话,音频会议产品,多媒体教学产品。这些产品的一个基本功能就……
【文章正文】

摘要 数字音频混音是嵌入式多媒体设备不可缺少的功能,本文介绍数字混音的基本原理,并提供了几种实际应用方法,并进行了实际的测试,取得了良好的效果。
---- 关键词 多路语音合成,混音,衰减因子。
1.引言
---- 随着嵌入式处理器的处理能力不断加强,网络技术的不断进展,嵌入式多媒体通讯已经迅速普及,其应用产品前途很越来越广泛,如IP电话,音频会议产品,多媒体教学产品。这些产品的一个基本功能就是语音采集(数字化),语音传输和实时播放。但由于成本和设计资源的限制,一个终端一般只可能有一路(立体声)输出能力,这在一对一通话是不会产生任何问题。但在多个终端同时通话时(如音频会议),如果接收到的数字语音信号不经特殊处理,就很难模拟出多个与会者在一个会议室进行对话的情形。这就要求终端有能力将收到到多路数字语音合成(混合)成一路输出。因此必须采取多路音频流混合方案。
2.设计思想:
2.1 混音的合理性和必要性:
---- 传输话音这种连续的、时间要求严格的流与传输别的数据不同。这涉及声波转换为数字信号,数字信号恢复为声波。虽然AD/DA由硬件完成,但录音和播放由用户设置。特别需要注意的是,不象典型的视频流在空间/时间域占有唯一的位置,在同一时间和位置的图象元素叠加是无任何意义的,但人耳可以感知在同一空间/ 时间播放多个音频流。这就是混音的合理性和必要性。混音就是用一个输出设备播放多个音频流。
2.2 混音方案的理论依据:
---- 在时域上语音是短时平稳信号,对语音信号进行处理的一个基本概念就是对语音样本以缓冲区为单位处理,即对输入的语音样本分帧。为了满足合理的延时要求,语音帧的长度一般是选10~20ms。
---- 当多个音频源在一个房间播放时,人耳听到的声波是各个声源声波的线性叠加,这正是模拟混音的基础。该事实表明数字话音的混音也应线性相加。假设有n路输入音频流进行混音,Xi(t)是t时刻的第i路输入语音的采样值,则t时刻的混音值为:
---- m(t)=ΣXi(t),i=0,1,…,n-1
---- 数字音频的重要参数是采样率和采样位数,其中各路输入音频流的采样率相同是混音的前提。
3. 混音的实际算法:
考虑到数字音频的采样位数,其每点的的采用的最大最小值是被限定的,如8位采样,则采样值的范围是-127~+127。因此在混音计算时,m(t)=ΣXi (t)必须考虑其溢出的情况。简单的处理溢出的方法是m(t)=(ΣXi(t))/n, 其中n表示参与混音的路数,这样即可以保证每个采样点都不会溢出。
但这种算法的缺点也很明显,即每路音频的音量都被缩小了n倍,没有使每路的音频在不溢出的情况下达到最大的输出(与混音前的每路音频尽量接近)。要达到这种效果,就需要使用另外一种比较复杂的算法: 使用衰减因子f, m(t)=Σ(Xi(t)*f)。其中 (1/n)<= f <= 1, n为混音的路数。
如上面所说,一个语音帧是一个处理单元。初始化时令f=1,每次开始处理一个新的语音帧时,任何一个合成值m(t)超过了范围,将m(t)箝位,并且求得对应的新的f,在时序上位于此点之后的样本都采用新的f。可以看出这样一来,f有越来越小的趋势。为了避免语音不必要的被衰减,因此需要有让f变大的地方,这发生在每个新的语音帧开始处理的入口。新的语音帧样本仍然需要衰减的可能性是很大的,所以f不能每次都又从1开始,而是应该在某种程度上继承过去的值。即在每个新的样本缓冲区的入口处,只要f不等于1,就将其调整为比f稍大一些的值,让它成为新的衰减因子。若样本的确不需要衰减,经过若干帧后f会慢慢变回1。
流程图如下,每次处理语音帧样本长度在10~20ms内选取, 以16位采样为例, f可取1/16, 2/16,… 15/16,1 。 也可以根据不同的应用取不同的取值范围,和不同的 #1, #2 算法。


4.注意事项:
考虑到不同的处理器的处理能力,以及产品对时延的不同要求,我们可以合理的采用上述两种方法。值得注意的是,每点的采样值都是有符号数,不能用简单的无符号数进行处理和运算。
同时,随着需要混合的语音信号路数的增加,在用户不采取任何附加的预防措施的情况下,一些并不需要的信号(例如回声和噪音)就会累积起来并终将导致让人无法接受的质量劣化。这样,每个终端还可以进行输入音频的有声/无声检测,对无有效信号的音道直接丢弃。
5.结束语
---- 在笔者开发音频会议终端(采用ARM7处理器)上,对上述两种方法都进行了测试。结果证明两种方法都能取的比较满意的效果。

2007年12月21日星期五

c#调节音量

多媒体的应用,往往离不开音频文件,DELPHI偏偏不带音量控制的控件,虽然可以安装第三方的音量控制控件,不过对于我们这些编程的超级菜鸟来说,自己动手才是丰脑之道,这里,我利用API函数就实现了WAVE文件的总音量控制及左右声道音量分别控制。

为了调用Windows函数,先在Uses中加上MMSystem,Delphi提供了调用WaveOutSetVolume 函数的Pascal语言的接口,不信看看MMSystem.pas文件*&^@*<。

我编了演示程序,界面如下:
加入三个TrackBar,分别命名为TB_vol,TB_l,TB_r,将Max值设为255(即8位二进制数的最大值),Frequency的值设为10。

先看看总音量控制的实现:


procedure TForm1.TB_volChange(Sender: TObject);

var
pos,vol:longint;

begin
pos:=TB_vol.Position;

vol:=(pos shl 8)or(pos shl 24);

waveoutsetvolume(0,vol);

end;


首先我们得到TrackBar的位置,用这个值来记录音量的大小,第二句转换Windows函数中对应的正确形式,末一句设置音量。

WaveOutSetVolume函数有两个参数:

第一个参数为波形文件输出设备的标识符,这里的标识符为0。

第二个参数为音量的大小,他是一个32位的整数,低16位表示左声道的音量,高16位表示右声道的音量。

由于TrackBar只用8位二进制数表示音量,因而先把得到的8位音量值pos左移8位,变成左声道16为中的高8位,然后将pos右移24位,变成右声道16为中的高8位,将两个值进行or运算赋给vol,将vol加给WaveOutSetVolume函数的第二个参数,这样就可以实现同时改变两个声道的音量了。

理解上述方法后,分别控制左右声道就不难了,看看左声道的实现:


procedure TForm1.TB_lChange(Sender: TObject);

var
pos,vol:longint;

begin
pos:=TB_l.Position;

waveoutgetvolume(0,@vol);

vol:=vol and $ffff0000 or (pos shl 8);

waveoutsetvolume(0,vol);

end;


由于只修改左声道的值,为了保存右声道的音量,即保存得到音量值pos的高16位,我们将vol和$ffff0000(16进制数)进行or运算,这样,vol的低16位被清零,高16位保持不变,再将低16位左移8位表示新的左声道的音量。

右声道同理实现


procedure TForm1.TB_rChange(Sender: TObject);

var
pos,vol:longint;

begin
pos:=TB_r.Position;

waveoutgetvolume(0,@vol);

vol:=vol and $0000ffff or (pos shl 24);

waveoutsetvolume(0,vol);

end;


同时,我们为了程序一运行滑块就能到当前的音量(完善完善嘛),需要在Form的Create事件中加入以下语句:



procedure TForm1.FormCreate(Sender: TObject);

var
vol:longint;

begin
waveoutgetvolume(0,@vol);

TB_l.Position :=hi(vol); {设置左声道音量}

TB_r.Position :=hi(vol shr 16); {设置右声道音量}

end;

2007年12月18日星期二

Socket 错误描述

常数 值 描述
sckOutOfMemory 7 内存不足
sckInvalidPropertyValue 380 属性值无效。
sckGetNotSupported 394 属性不可读。
sckSetNotSupported 383 属性是只读的。
sckBadState 40006 所请求的事务或请求本身的错误协议或者错误连接状态。
sckInvalidArg 40014 传递给函数的参数格式不确定,或者不在指定范围内。
sckSuccess 40017 成功。
sckUnsupported 40018 不受支持的变量类型。
sckInvalidOp 40020 在当前状态下的无效操作
sckOutOfRange 40021 参数越界。
sckWrongProtocol 40026 所请求的事务或请求本身的错误协议
sckOpCanceled 1004 取消操作。
sckInvalidArgument 10014 所请求的地址是广播地址,但未设置标记。
sckWouldBlock 10035 套接字不成块,而指定操作将使之成块。
sckInProgress 10036 制造块的 Winsock 操作在进行之中。
sckAlreadyComplete 10037 完成操作。未进行制造块的操作。
sckNotSocket 10038 描述符不是套接字。
sckMsgTooBig 10040 数据报太大,不适于缓冲区的要求,因而被截断。
sckPortNotSupported 10043 不支持指定的端口。
sckAddressInUse 10048 地址在使用中。
sckAddressNotAvailable 10049 来自本地机器的不可用地址。
sckNetworkSubsystemFailed 10050 网络子系统失败。
sckNetworkUnreachable 10051 此时不能从主机到达网络。
sckNetReset 10052 在设置 SO_KEEPALIVE 时连接超时。
sckConnectAborted 11053 由于超时或者其它失败而中止连接。
sckConnectionReset 10054 通过远端重新设置连接。
sckNoBufferSpace 10055 没有可用的缓冲空间。
sckAlreadyConnected 10056 已连接套接字。
sckNotConnected 10057 未连接套接字。
sckSocketShutdown 10058 已关闭套接字。
sckTimedout 10060 已关闭套接字。
sckConnectionRefused 10061 强行拒绝连接。
sckNotInitialized 10093 应首先调用 WinsockInit。
sckHostNotFound 11001 授权应答:未找到主机。
sckHostNotFoundTryAgain 11002 非授权应答:未找到主机。
sckNonRecoverableError 11003 不可恢复的错误。
sckNoData 11004 无效名,对所请求的类型无数据记录。

2007年12月17日星期一

语音编程 学习资料

http://www.cnblogs.com/AndyHai/archive/2007/07/07/809883.html
http://www.vckbase.com/document/

MMIO编程

MMIO(MultiMedia file Input and Output多媒体文件的输入与输出)比标准操作系统的I/O服务提供更多的功能,包括缓冲区I/O、RIFF文件、内存文件和定制的存储系统等。另外,多媒体文件I/O服务还对性能敏感的应用程序进行了优化。
MMIO定义了2个数据类型和2个结构类型、并提供了18个函数和1个宏,还有7个专用消息。由于篇幅所限,本节只针对RIFF文件(主要是WAV格式)的读入,介绍其中若干常用的结构和函数。
本节先介绍RIFF文件的结构和相关定义,然后给出MMIO的若干基本I/O和RIFF I/O函数,最后编写读取WAV文件和资源的内容和信息的实例代码。
12.6.1 RIFF文件
RIFF(Resource Interchange File Format资源交换文件格式)是微软为Windows设计的一类多媒体文件格式,主要包括WAV(Waveform Audio File Format波形音频文件格式)和AVI(Audio/Video Interleaved File Format音频视频交互文件格式)两种。音频文件格式WAV已经在3.3.1中介绍过,而视频文件格式AVI也在6.2.3中介绍过。

 文件结构
RIFF文件由文件头、数据类型标识及若干块组成。块(chunk)是RIFF文件的基本结构,每个块都包括如下三个域:
 用于标识块类型的4字符代码,如’RIFF’、’LIST’和’fmt ’、’data’等;
 数据块大小的字节数
 数据域本身
RIFF文件中的块是可以嵌套的,块的数据域可含若干子块,子块又可含孙块。例如,RIFF文件本身就是一个RIFF块,其数据域可以是WAV子块或AVI子块,而WAV子块又包含格式块('fmt ‘)和数据块('data’),AVI文件的AVI子块,包含格式列表块(’LIST’)、数据列表块(’LIST’)和可选的索引块(’ind1’),……。
RIFF文件具有相同的结构:
’RIFF’<文件大小><格式类型><块>……
例如,WAV文件的结构为:
’RIFF’<文件大小>’WAVE’<格式块><数据块>
而AVI文件的结构为:
’RIFF’<文件大小>’AVI ’<格式列表块><数据列表块>[<索引块>]

为了读写和处理RIFF文件,在多媒体SDK和MMIO中,定义了若干数据类型、结构和宏。下面给出它们的定义和使用方法:

 四字符代码类型和其构造宏
为了读写和比较RIFF文件的由4字符组成的块类型标识代码,定义了一个FOURCC(FOUR Character Code,四字符代码)数据类型:
typedef DWORD FOURCC;
还定义了一个由4个字符来构造FOURCC类型值的宏mmioFOURCC:
FOURCC mmioFOURCC( // 构造四字符代码
CHAR ch0, // 四字符代码的第1个字符,typedef char CHAR;
CHAR ch1, // 四字符代码的第2个字符
CHAR ch2, // 四字符代码的第3个字符
CHAR ch3 // 四字符代码的第4个字符
);
该宏是利用MAKEFOURCC宏来定义的:
#define mmioFOURCC(ch0, ch1, ch2, ch3) MAKEFOURCC(ch0, ch1, ch2, ch3);
而MAKEFOURCC宏的定义为:
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ));
例如:
#define ID_RIFF mmioFOURCC('R', 'I', 'F', 'F')
#define ID_WAVE mmioFOURCC('W', 'A', 'V', 'E')
#define ID_fmt mmioFOURCC('f', 'm', 't', ' ')
#define ID_data mmioFOURCC('d', 'a', 't', 'a')
FOURCC id;
ar >> id;
if (id != ID_RIFF) ……

 块结构定义
typedef struct {
FOURCC ckid; // 块ID
DWORD cksize; // 块的字节大小
FOURCC fccType; // (RIFF和LIST块的)格式类型(如’WAVE’)
DWORD dwDataOffset; // 块的数据部分的偏移量
DWORD dwFlags; // 用于MMIO函数的标志,可取0或MMIO_DIRTY(脏)
} MMCKINFO;

12.6.2 基本与RIFF I/O函数
下面是若干通用的MMIO基本I/O函数和两个用于RIFF I/O的定位函数:

 打开/关闭文件
mmioOpen函数可以用来打开缓冲和非缓冲的I/O文件,这里的文件可以是标准文件、内存文件和定制存储系统的元素。该函数的原型为:
HMMIO mmioOpen( // 返回北打开文件的句柄,出错返回NULL
LPSTR szFilename, // 文件名串,对内存文件为NULL
LPMMIOINFO lpmmioinfo, // 指向包含额外参数的MMIOINFO结构的指针
// 一般为NULL,除非是打开内存文件,指定缓冲I/O的缓冲区大小
DWORD dwOpenFlags // 打开操作的标志位组合,取值见表12-11
);
其中,MMIOINFO结构的定义为:
typedef struct {
DWORD dwFlags; // 打开文件方式标志,取值见表12-11
FOURCC fccIOProc; // 标识文件IO过程的四字符代码,无IO过程时为NULL
LPMMIOPROC pIOProc; // 件IO过程的指针
UINT wErrorRet; // 扩展的错误值,只用于打开函数
HTASK hTask; // 局部IO过程的句柄
LONG cchBuffer; // 文件缓冲区的字节大小,对非缓冲文件为0
HPSTR pchBuffer; // 指向文件缓冲区的指针,对非缓冲文件为NULL
HPSTR pchNext; // 指向缓冲区的下一读/写位置的指针
HPSTR pchEndRead; // 指向缓冲区内的可读位置尾
HPSTR pchEndWrite; // 指向缓冲区内的可写位置尾
LONG lBufOffset; // 保留
LONG lDiskOffset; // 当前文件位置(从文件头的偏移字节数)
DWORD adwInfo[4]; // IO过程维护的状态信息
DWORD dwReserved1; // 保留
DWORD dwReserved2; // 保留
HMMIO hmmio; // 由打开函数返回的文件句柄
} MMIOINFO;
其中,HPSTR类型的定义为:
typedef char _huge * HPSTR; /* a huge version of LPSTR */
表12-11 打开文件操作的标志符号常量
=========================================================
值 含义
MMIO_ALLOCBUF 打开缓冲文件
MMIO_COMPAT 打开兼容模式文件
MMIO_CREATE 创建新文件
MMIO_DELETE 删除文件
MMIO_DENYNONE 打开共享文件
MMIO_DENYREAD 打开禁止其他过程读访问的文件
MMIO_DENYWRITE 打开禁止其他过程写访问的文件
MMIO_EXCLUSIVE 打开禁止其他过程读写访问的文件
MMIO_EXIST 判断指定文件是否存在,存在时返回TRUE
MMIO_GETTEMP 创建临时文件名
MMIO_PARSE 创建完整文件名
MMIO_READ 打开只读文件
MMIO_READWRITE 打开读写文件
MMIO_WRITE 打开只写文件
=========================================================
由mmioOpen函数打开的文件,在使用完后必须调用函数mmioClose关闭它。该关闭函数对缓冲文件,还会调用mmioFlush函数将缓冲区的数据写回磁盘。关闭函数的原型为:
MMRESULT mmioClose( // 成功返回MMSYSERR_NOERROR(= 0)
HMMIO hmmio, // 文件句柄
UINT wFlags // 关闭操作标志,可取0或MMIO_FHOPEN(对非MMIO文件句柄)
);
例如:
HMMIO hmmio = mmioOpen(L"sample.wav", NULL, MMIO_READ);
…… // 使用和处理数据
mmioClose(hmmio, 0);

 读/写数据
// 从文件中读取数据
LONG mmioRead( // 返回实际读出的字节数
HMMIO hmmio, // 文件句柄
HPSTR pch, // 存放读入数据的缓冲区指针
LONG cch // 读取数据的字节数
);
// 写入数据到文件
LONG mmioWrite( // 返回实际写入的字节数
HMMIO hmmio, // 文件句柄
HPSTR pch, // 存放写入数据的缓冲区指针
LONG cch // 写入数据的字节数
);
例如:
WAVEFORMATEX wfFormat;
mmioRead(hmmio, (HPSTR)&wfFormat, sizeof(WAVEFORMATEX));
又如:
Write(const char* pData, LONG lLen) {
ASSERT(m_hmmio != NULL);
return ::mmioWrite(m_hmmio, pData, lLen);
}

 定位文件
// 定位:改变文件的当前位置
LONG mmioSeek( // 返回新位置(相对于文件头的字节数),出错返回-1
HMMIO hmmio, // 文件句柄
LONG lOffset, // 改变位置的偏移量
int iOrigin // 偏移类型标志,可取值有:SEEK_CUR(从当前起算)、
// SEEK_END(从文件尾起算)、SEEK_SET(从文件头起算)

);
// 下降:进入RIFF文件中的(特定)块
MMRESULT mmioDescend( // 成功返回MMSYSERR_NOERROR(= 0)
HMMIO hmmio, // 文件句柄
LPMMCKINFO lpck, // 指向接收MMCKINFO结构的缓冲区指针
LPMMCKINFO lpckParent, // 指向指定父块之MMCKINFO结构的指针
// 无父块时取为NULL
UINT wFlags // 搜索标志,可取值有:0(当前位置)、MMIO_FINDCHUNK
// (指定块标识符)、MMIO_FINDLIST(列表块内的指定标识符块)、
// MMIO_FINDRIFF(RIFF块内的指定标识符块)
);
// 上升:移出RIFF文件中的当前块
MMRESULT mmioAscend( // 成功返回MMSYSERR_NOERROR(= 0)
HMMIO hmmio, // 文件句柄
LPMMCKINFO lpck, // 指向(已被mmioDescend填充的)MMCKINFO结构的指针
UINT wFlags // 保留,必须为0
);
例如:
MMCKINFO ckInfo; // 定义块信息结构变量
mmioSeek(hmmio, 12, SEEK_SET); // 定位到’fmt ‘块的开始处
mmioDescend(hmmio, &ckInfo, NULL, 0); // 获取’fmt ‘块信息
…… // 读取操作
mmioAscend(hmmio, &ckInfo, 0); // 跳出’fmt ‘块
LONG currentPosition = mmioSeek(hmmio, 0, SEEK_CUR); // 获取当前位置
又例如:
// Set the position to the begining of the file
if ( mmioSeek(hmmio, 0, SEEK_SET) == -1) {
MessageBox(L"Seek to the begining of file error!", L"Error");
return false;
}
// Find the RIFF chunk
MMCKINFO mmckRiffInfo;
mmckRiffInfo.ckid = mmioFOURCC('R','I','F','F');
if ( mmioDescend(hmmio, &mmckRiffInfo, NULL, MMIO_FINDCHUNK) != 0 ) {
MessageBox(L"Descend to RIFF chunk error!", L"Error");
return false;
}
// Find the WAVE chunk
MMCKINFO mmckWaveInfo;
mmckWaveInfo.ckid = mmioFOURCC('W','A','V','E');
if ( mmioSeek(hmmio, -4, SEEK_CUR) == -1) {
MessageBox(L"Seek to the begining of 'WAVE' error!", L"Error");
return false;
}
if ( mmioDescend(hmmio, &mmckWaveInfo, &mmckRiffInfo,
MMIO_FINDCHUNK) != 0 ) {
MessageBox(L"Descend to WAVE chunk error!", L"Error");
return false;
}
// Find and read the format subchunk
MMCKINFO mmckFmtInfo;
mmckFmtInfo.ckid = mmioFOURCC('f','m','t',' ');
if ( mmioSeek(hmmio, 12, SEEK_SET) == -1) {
MessageBox(L"Seek to the begining of 'fmt ' error!", L"Error");
return false;
}
if ( mmioDescend(hmmio, &mmckFmtInfo, &mmckWaveInfo,
MMIO_FINDCHUNK) != 0 ) {
MessageBox(L"Descend to fmt chunk error!", L"Error");
return false;
}
if ( mmioRead(hmmio, (HPSTR)&wfFormat, sizeof(WAVEFORMATEX))
< sizeof(WAVEFORMATEX) ) {
MessageBox(L"Read format struct error!", L"Error");
return false;
}
if ( mmioAscend(hmmio, &mmckFmtInfo, 0) != 0 ) {
MessageBox(L"Ascend from fmt chunk error!", L"Error");
return false;
}
12.6.3 读取WAV文件和资源
可以利用MMIO,来读取WAV文件和资源中的数据内容与参数信息。下面给出若干有关函数和代码段,这些内容,在后面的13.3节(DirectX声音编程)中会用到。

 读取WAV文件
函数OpenWave,用于打开WAV波形音频文件,获取文件的句柄:
// 打开WAV文件
HMMIO OpenWave(LPWSTR strFilePath) {// Open WAV file
return mmioOpen(strFilePath, NULL, MMIO_READ);
}

函数GetWaveData,利用文件句柄,来获取波形音频格式结构内容和数据块长度:
// 获取波形数据:格式结构和数据块长度
bool GetWaveData(HMMIO hmmio, WAVEFORMATEX& wfFormat,
DWORD& dwDataLen) {
// Find the RIFF chunk and WAVE form type
MMCKINFO mmckInfo;
if ( mmioDescend(hmmio, &mmckInfo, NULL, 0) != 0
|| mmckInfo.ckid != FOURCC_RIFF
|| mmckInfo.fccType != mmioFOURCC('W','A','V','E') ) {
MessageBox(L"Not a WAV file !", L"Error");
return false;
}
// Find and read the format subchunk
if ( mmioDescend(hmmio, &mmckInfo, NULL, 0) != 0
|| mmckInfo.ckid != mmioFOURCC('f','m','t',' ') ) {
MessageBox(L"fmt chunk error!", L"Error");
return false;
}
if ( mmioRead(hmmio, (HPSTR)&wfFormat, sizeof(WAVEFORMATEX))
< sizeof(WAVEFORMATEX) ) {
MessageBox(L"Read format struct error!", L"Error");
return false;
}
if ( mmioAscend(hmmio, &mmckInfo, 0) != 0 ) {
MessageBox(L"Ascend from fmt chunk error!", L"Error");
return false;
}
// Find and get the size of the data subchunk
mmckInfo.ckid = mmioFOURCC('d','a','t','a');
if ( mmioDescend(hmmio, &mmckInfo, NULL, MMIO_FINDCHUNK) != 0 ) {
MessageBox(L"data chunk error!", L"Error");
return false;
}
dwDataLen = mmckInfo.cksize;
return true;
}

函数GetWave,调用OpenWave和GetWaveData函数,由文件路径串来打开波形音频文件,获取文件句柄、格式结构和数据块长度:
// 获取波形:文件句柄、格式结构和数据块长度
bool GetWave(LPWSTR strFilePath, HMMIO& hmmio,
WAVEFORMATEX& wfFormat, DWORD& dwDataLen) {
// Open WAV file
hmmio = OpenWave(strFilePath);
if ( hmmio == NULL ) {
MessageBox(L"Open WAV file error!", L"Error");
return false;
}
// Get WAV data
if ( !GetWaveData(hmmio, wfFormat, dwDataLen) ) {
MessageBox(L"Get wave data error!", L"Error");
return false;
}
return true;
}

 读取WAV资源
为了读取WAV资源,需要调用若干SDK函数来定位资源位置、装入资源到全局内存、锁定资源并获得资源地址、获取资源大小等。下面逐个加以介绍:
// 确定指定模块中指定类型和名称之资源的位置
HRSRC FindResource( // 成功返回指定资源的信息块句柄,失败返回NULL
HMODULE hModule, // 其可执行文件包含资源之模块的句柄,NULL为当前模块
LPCTSTR lpName, // 资源名,一般取MAKEINTRESOURCE(资源ID)
LPCTSTR lpType // 指定资源类型,取值可为RT_BITMAP、RT_CURSOR、
// RT_ICON、……,对波形音频资源为L"WAVE"
);
其中,hModule也可取值为MFC的全局函数AfxGetInstanceHandle的返回值:
HINSTANCE AFXAPI AfxGetInstanceHandle( ); // 返回当前应用程序的实例句柄
// 将指定资源装入全局内存
HGLOBAL LoadResource( // 成功返回资源数据句柄,失败返回NULL
HMODULE hModule, // 模块的句柄,NULL为当前模块
HRSRC hResInfo // 资源信息块句柄
);
// 释放资源
BOOL FreeResource( // 成功返回0
HGLOBAL hglbResource // 资源数据句柄
);
// 锁定资源,获得资源地址
LPVOID LockResource( // 成功返回资源头指针,失败返回NULL
HGLOBAL hResData // 资源数据句柄
);
// 获取资源字节大小
DWORD SizeofResource( // 返回资源字节数,失败返回0
HMODULE hModule, // 模块的句柄,NULL为当前模块
HRSRC hResInfo // 资源信息块句柄
);

 读取WAV资源例子
下面利用这些SDK函数,来打开波形音频资源:
// 打开WAV资源
HMMIO OpenWave(UINT uiResID) { // Open WAV resource
HMMIO hmmio = NULL;
BYTE* m_pImageData;
DWORD m_dwImageLen;
// Find the wave resource
HRSRC hresInfo = FindResource(NULL, MAKEINTRESOURCE(uiResID),
L"WAVE");
if ( hresInfo == NULL) return NULL;
// Load the wave resource
HGLOBAL hgmemWave = LoadResource(NULL, hresInfo);
// Get wave file image
if (hgmemWave != NULL) {
// Get pointer to and length of the wave image data
m_pImageData= (BYTE*)LockResource(hgmemWave);
m_dwImageLen = SizeofResource(NULL, hresInfo);
} else return NULL;
// Set the MMIOINFO struct
MMIOINFO mmioInfo;
ZeroMemory(&mmioInfo, sizeof(MMIOINFO));
mmioInfo.pIOProc = NULL;
mmioInfo.fccIOProc = FOURCC_MEM;
mmioInfo.pchBuffer = (HPSTR)m_pImageData;
mmioInfo.cchBuffer = m_dwImageLen;
// Open MMIO memory file
hmmio = mmioOpen(NULL, &mmioInfo, MMIO_READWRITE);
if ( hmmio == NULL ) {
MessageBox(L"Open memory file error!", L"Error");
return NULL;
}
return hmmio;
}
其中,用到了一个SDK宏:
// 用0填充内存块
void ZeroMemory(
PVOID Destination, // 块头地址
SIZE_T Length // 块的字节大小
);
#define ZeroMemory RtlZeroMemory
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))

函数GetWave,调用OpenWave和GetWaveData函数,由资源ID来打开波形音频文件,获取文件句柄、格式结构和数据块长度:(与WAV文件的类似,其中的GetWaveData函数相同)
// 获取波形:文件句柄、格式结构和数据块长度
bool GetWave(UINT uiResID, HMMIO& hmmio, WAVEFORMATEX& wfFormat,
DWORD& dwDataLen) {
// Open WAV resource
hmmio = OpenWave(uiResID);
if ( hmmio == NULL ) {
MessageBox(L"Open WAV resource error!", L"Error");
return false;
}
// Get WAV data
if ( !GetWaveData(hmmio, wfFormat, dwDataLen) ) {
MessageBox(L"Get wave data error!", L"Error");
return false;
}
return true;
}