求教一个参数的取得。谢谢!(20分)

  • 主题发起人 主题发起人 jbas
  • 开始时间 开始时间
哈哈,差不多是这个意思了。哈~~~~不过你有很多地方用词不是太准确,说得很含含糊糊
的,我也略略地补充一下。

--------
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好了。
至今没有想过出书,不过近一段时间总想着要做几个小工具来试试手。:)
 
又看到您的指导,真是非常高兴。
我当时写下上面的东西完全是我一个初学者的理解,我对windows的消息理解,也只是在看了
一本delphi入门的书,看到上面一点简单的例子才知道的一点点。您对那个分析的那么透彻,
我还是有点模糊不清,只是因为你把windwos该干的事说出来了,而因为我学点东西,总是需要
一个最简单最简单的实例,只有它能让我知道这个能干什么以后,还有就是我完全脱离书本以后,
能把那个安我的理解写出来,并且编译通过以后,我才会再深入进去。因为这样我觉的自己,才有
点收获,才能说我会写这个了而不是说还要看别的代码或者书,所以您上面的分析我还要
在以后的编程中去体会了。虽然以前写过一个托盘程序,用到过消息处理,但是现在想来
真是对消息怎样处理的还不了解,我应该去找一本delphi的高级编程的书看了。
得到您的这么大的帮助,我查了你的资料:)。喔!原来是大富翁和delphi的元老了.讨论的
都是delphi的Bug这种高深的问题。真是佩服!
你在一个问题中提到你的主页:http://member.zz.ha.cn/~aiming/怎么上不去呀?不然可
又可以进一步看您了:)
最后衷心的感谢您对一个新手的帮忙!
 
OH...
现在我的个人主页是:
http://aiming.ynxx.com/
或者
http://www.doany.net/
 
jbas,你还没有明白我的意思!
我的意思是说,你如果要拦截A,那么可以先把写代码,把传入进来的lParam的值,写入一个文件,
然后运行这个程序,按A键,那么代码就会把A的lParam写入文件,这样就知道A的lParam值了,
然后把它写道程序里面就可以了,不知道明白没有?这样的话,你可以获取任意一个Key的lParam的值!
 
to Kingron:
小弟知道了,谢谢!
 

Similar threads

后退
顶部