A
aimingoo
Unregistered / Unconfirmed
GUEST, unregistred user!
哈哈,差不多是这个意思了。哈~~~~不过你有很多地方用词不是太准确,说得很含含糊糊
的,我也略略地补充一下。
--------
1.“可以通过查看messages.pas中的delphi定义的消息参数,来查找……”
messages.pas中定义的可不是消息参数,它主要定义消息的结构和消息句柄。WM_KEYDOWN = $0100
就是一个消息ID号,可不是没有用的东西。
windows的消息处理核心是通过不同的消息ID来判断并分发消息的,这个ID号反映了windows当前在干什么。
------------
2. 可以在这儿下载到CodeSearch的最新版本Ver2.20
http://168.144.184.193/download/codesearch.zip
------------
3. 之所以要查delphi/source目录下的文件,是因为这里包含着VCL/RLT等Delphi内核级的
源代码,也包含大量DEMO。通常我对一个问题不太了解时,都会试图去从Delphi自己的源
码中找找答案。Delphi源码实在能给你提供很多的信息。此外,参考一些大型控件包的源
码对你也是有帮助的。
------------
4. “WM_KEYDOWN在好多个pas文件中多有定义,但都是一样的定义。”
这样说是不对的,WM_KEYDOWN只在messages.pas中被定义,其它.pas中只是引用了这个
消息ID号。
procedure WMKeyDown(var Message: ;TWMKeyDown); message WM_KEYDOWN;
表明实现了一个消息处理过程,这个过程响应WM_KEYDOWN,也就是$0100这个消息号,当
前应用程序的窗体得到这个编号的消息时,就交给定义的这个处理过程来处理。
窗体将一个消息的处理权交给一个对象时,会告诉它这个消息发生时的一些参数,这些
参数就是通过(var Message: ;TWMKeyDown)这个接口来传递的。
所有Windows的消息参数都可以被描述成TMessage这个记录结构,但通过记录类型强制转换,
它可以被描述成多种形式的记录结构。比如TWMKeyDown类型。
------------
5. “其中的定义是这样的:TWMKeyDown = TWMKey;可见TWMKeyDown是通过TWMKey来赋值的。”
两个类型之前是不存在赋值关系的。这里不是过给TWMKey取了一个别名而已,两个类型是完全等价
的。我记得有资料中称这种关系叫“类型别名”。
------------
6. “再查windows sdk,看那个keystroke message事件”
keystroke message并不是事件,它是一消息的一个参数类型。
------------
7. “那个表介绍的lparam好象有32位,但这里只有5位,还有4位的,我想是因为其中好多对于WM_KEYDOWN事件来
说都可以是0,所以可以省略掉0吧?”
lparam就是一个32位的参数。它不存在5位或者4位这样的说活。我记得keystroke message的结构里有“repeat count”,
而且是放在前几位。这让我想起来快捷键中的组合键,比如ctrl + Q + F是查找。这里的Q和F是一组快速的连续按键。那
么,如果按键是ctrl + k + k,那windows如何区分呢?我想可能会是repeat count=1,也就是表明“K”键在一个时间
片里连续地重复了一次。所以,通常情况下repeat count这个位是0,忽略掉这些为0的位,就可以得到zhangkan给出的那
个列表了。
——必须一再声明的是,上面这一段只是我的猜测,我没有查阅资料,也没有做代码测试。但你说lparam有时是4位,有时
是5位却实实在在是不对的。
-----------
ok. 就说到这儿吧。哈。jbas,别总称呼人家高手,我不喜欢你这样叫我。就叫我aimingoo好了。
至今没有想过出书,不过近一段时间总想着要做几个小工具来试试手。
的,我也略略地补充一下。
--------
1.“可以通过查看messages.pas中的delphi定义的消息参数,来查找……”
messages.pas中定义的可不是消息参数,它主要定义消息的结构和消息句柄。WM_KEYDOWN = $0100
就是一个消息ID号,可不是没有用的东西。
windows的消息处理核心是通过不同的消息ID来判断并分发消息的,这个ID号反映了windows当前在干什么。
------------
2. 可以在这儿下载到CodeSearch的最新版本Ver2.20
http://168.144.184.193/download/codesearch.zip
------------
3. 之所以要查delphi/source目录下的文件,是因为这里包含着VCL/RLT等Delphi内核级的
源代码,也包含大量DEMO。通常我对一个问题不太了解时,都会试图去从Delphi自己的源
码中找找答案。Delphi源码实在能给你提供很多的信息。此外,参考一些大型控件包的源
码对你也是有帮助的。
------------
4. “WM_KEYDOWN在好多个pas文件中多有定义,但都是一样的定义。”
这样说是不对的,WM_KEYDOWN只在messages.pas中被定义,其它.pas中只是引用了这个
消息ID号。
procedure WMKeyDown(var Message: ;TWMKeyDown); message WM_KEYDOWN;
表明实现了一个消息处理过程,这个过程响应WM_KEYDOWN,也就是$0100这个消息号,当
前应用程序的窗体得到这个编号的消息时,就交给定义的这个处理过程来处理。
窗体将一个消息的处理权交给一个对象时,会告诉它这个消息发生时的一些参数,这些
参数就是通过(var Message: ;TWMKeyDown)这个接口来传递的。
所有Windows的消息参数都可以被描述成TMessage这个记录结构,但通过记录类型强制转换,
它可以被描述成多种形式的记录结构。比如TWMKeyDown类型。
------------
5. “其中的定义是这样的:TWMKeyDown = TWMKey;可见TWMKeyDown是通过TWMKey来赋值的。”
两个类型之前是不存在赋值关系的。这里不是过给TWMKey取了一个别名而已,两个类型是完全等价
的。我记得有资料中称这种关系叫“类型别名”。
------------
6. “再查windows sdk,看那个keystroke message事件”
keystroke message并不是事件,它是一消息的一个参数类型。
------------
7. “那个表介绍的lparam好象有32位,但这里只有5位,还有4位的,我想是因为其中好多对于WM_KEYDOWN事件来
说都可以是0,所以可以省略掉0吧?”
lparam就是一个32位的参数。它不存在5位或者4位这样的说活。我记得keystroke message的结构里有“repeat count”,
而且是放在前几位。这让我想起来快捷键中的组合键,比如ctrl + Q + F是查找。这里的Q和F是一组快速的连续按键。那
么,如果按键是ctrl + k + k,那windows如何区分呢?我想可能会是repeat count=1,也就是表明“K”键在一个时间
片里连续地重复了一次。所以,通常情况下repeat count这个位是0,忽略掉这些为0的位,就可以得到zhangkan给出的那
个列表了。
——必须一再声明的是,上面这一段只是我的猜测,我没有查阅资料,也没有做代码测试。但你说lparam有时是4位,有时
是5位却实实在在是不对的。
-----------
ok. 就说到这儿吧。哈。jbas,别总称呼人家高手,我不喜欢你这样叫我。就叫我aimingoo好了。
至今没有想过出书,不过近一段时间总想着要做几个小工具来试试手。