送分100分:WINDOWS消息机制 当我们在给一个文本框输入内容时,当在键盘上按下一个键后,WINDOWS的消息KEYPRESS是如何产生的,由谁产生的,而后这个消息是依次由谁提供给谁,而后再提供给文本框,中间可以在哪一个环节将消息中传递的KEYASCII值由谁来更改,最后由谁将更改后的Keyasccii传给文本框。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 好长的问题,第一步当然是硬件,硬件与驱动程序通讯,第二步是驱动程序通知系统产生WM_KEYXXXX消息,系统根据当前活动的窗口将消息发给相关线程的消息队列,如果你想拦截消息的话,挂一个消息钩子就行了,不用问那么多的。 http://www.4oa.com/Article/html/6/32/466/2005/16428.html 有两个问题:1、“第二步是驱动程序通知系统产生WM_KEYXXXX消息”,消息不应当是驱动程序产生的吧,驱动程序应该只知道是按下了哪个键,将键值告诉WINDOWS系统,而后由WINODWS系统产生消息吧(是我猜测的,很可能不对)。2、拦截是在哪一步拦截,是在驱动程序通知系统时拦截,还是在系统将消息发送给当前活动窗体时拦截。3、系统是将消息直接发给当前窗口,还是直接发送到当前窗体的文本框。 、“第二步是驱动程序通知系统产生WM_KEYXXXX消息”,消息不应当是驱动程序产生的吧,驱动程序应该只知道是按下了哪个键,将键值告诉WINDOWS系统,而后由WINODWS系统产生消息吧(是我猜测的,很可能不对)。 ==============我上面好像没说是驱动程序产生消息的吧,而是由驱动程序通知系统产生相关的消息拦截是在哪一步拦截,是在驱动程序通知系统时拦截,还是在系统将消息发送给当前活动窗体时拦截。============================如果你所做的仅是想拦截消息,挂消息钩子就行了,当然如果你想在驱动级处理也行,前提是你得会编写驱动程序。3、系统是将消息直接发给当前窗口,还是直接发送到当前窗体的文本框。=================这里有一个理解错误,系统是将消息发给当前前台线程的消息队列,并不是直接发给窗口,线程中用GetMessage来获取消息队列中的消息,再用DispatchMessage(&msg);进行分配,也就是决定由哪个窗口处理函数处理。 第一步是驱动程序获得按键信息,将其转交给操作系统,第二不,操作系统得到按键信息后,会根据当前焦点所在窗口句柄产生一个WM_KEY之类的消息,并把其放到消息队列中;第三步,接下来当前程序的窗口回调函数会从消息队列中获得该消息,并根据消息类别作出反映。 这个题目有点大,不过了解一些确实挺好。我觉得吧,大概过程应该是这样的:按下键盘之后由硬件接收,可能是中断也可能是别的方式吧,譬如定时,轮询等,当然,中断方式更好些吧。硬件到系统这一步,必然是通过驱动,只有驱动才能跟系统底层交互。至于再接下来,系统应该做一些处理吧,类似TranslageMessage那种方式。然后,相应的窗口就接收到了。不知道对不对? 大哥:结构这样写是什么意思啊?struct xx {a:1;b:2;} 缓冲区同步问题(防止分流失,如果满意另外送分50) 已知窗口句柄,如何得到给窗口所属的应用程序名? 如果关闭有模态对话框的程序? 哪兒可以得到最新的OPenGL安裝版本呢? 总是出现错误!!!!!!! OpenGL 中如何才能调出金属效果? 局域网中的数据库访问 如何用MCI设备播放远程视频文件?一定给分的!!! 问题不能解决我想哭..... updatewindow和invalidate 位图贴纹理的一个问题
有两个问题:
1、“第二步是驱动程序通知系统产生WM_KEYXXXX消息”,消息不应当是驱动程序产生的吧,驱动程序应该只知道是按下了哪个键,将键值告诉WINDOWS系统,而后由WINODWS系统产生消息吧(是我猜测的,很可能不对)。
2、拦截是在哪一步拦截,是在驱动程序通知系统时拦截,还是在系统将消息发送给当前活动窗体时拦截。
3、系统是将消息直接发给当前窗口,还是直接发送到当前窗体的文本框。
==============
我上面好像没说是驱动程序产生消息的吧,而是由驱动程序通知系统产生相关的消息拦截是在哪一步拦截,是在驱动程序通知系统时拦截,还是在系统将消息发送给当前活动窗体时拦截。
============================
如果你所做的仅是想拦截消息,挂消息钩子就行了,当然如果你想在驱动级处理也行,前提是你得会编写驱动程序。3、系统是将消息直接发给当前窗口,还是直接发送到当前窗体的文本框。
=================
这里有一个理解错误,系统是将消息发给当前前台线程的消息队列,并不是直接发给窗口,线程中用GetMessage来获取消息队列中的消息,再用DispatchMessage(&msg);进行分配,也就是决定由哪个窗口处理函数处理。
按下键盘之后由硬件接收,可能是中断也可能是别的方式吧,譬如定时,轮询等,当然,中断方式更好些吧。
硬件到系统这一步,必然是通过驱动,只有驱动才能跟系统底层交互。
至于再接下来,系统应该做一些处理吧,类似TranslageMessage那种方式。
然后,相应的窗口就接收到了。不知道对不对?