ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:2928回复:25

怎么捕获鼠标有没有键盘动作

楼主#
更多 发布于:2004-12-27 11:57
我现在在写一个函数,用来监视系统是不是有外部输入动作,如果在一定时间后没有动作,就关闭背光,现在不知道如何得到鼠标键盘是否有动作,请问wince是否提供这样的API?
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-27 12:29
你的监视功能是需要在应用中实现还是要底层实现?如果是在应用中的话,可以利用鼠标键盘的消息来实现;如果是在底层动的话,修改键盘和鼠标驱动,并利用定时器机制,应该也可以实现。
Come on, let us drive the world.
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-27 14:00
我就是不想改驱动而只调用wince的api来实现,有可能吗?
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-27 15:03
应该是可以的,你可以写一个线程,这个线程在有鼠标键盘动作时启动,然后每隔一定时间检查当前窗口上有没有鼠标或键盘的消息,如果没有就关背光。
根据地的兄弟们,团结就是力量
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-27 15:06
兄弟刚好弄反了吧,我现在要做的是当鼠标键盘有动作的时候通知我的线程,而不是线程在有动作时启动
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-28 12:42
:)
我说的那个线程是只管关背光的,你要在你写的应用里面关背光?这样的话不是每个应用都要单独处理背光啊?专门起一个管理就行了啊
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-30 13:35
ziyun兄弟,我有这样一个想法:
(1)你单独创建一个监视线程,在这个线程中等待一个事件,超时间隔你自己定(就是鼠标没有动作的最长时间);
(2)在应用中添加处理鼠标动作的消息处理函数,在消息处理函数中置位监视线程等待的事件,激活线程。
(3)在监视线程函数中,当Waiforxxx函数释放后,判断释放的原因(即wait函数的返回值),如果是因为超时,则关闭背光;否则是由鼠标动作引起,不关闭背光,重新进入等待状态。
你试试看。
Come on, let us drive the world.
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-30 13:46
ok,谢谢各位,这个问题我已经搞定了,我是单独做成一个驱动的样子(实际上我把它放在触摸屏驱动中),启动一个线程,设置一个超时中断,并修改了鼠标键盘触摸的驱动,如果他们有动作,就setevent,这样我的线程就不是超时中断了,就不会关背光了。但是又出现了一个新的问题,由于我是把这个中断放在触摸驱动中,当系统没启动时候就插上鼠标键盘的话,启动过程中先加载的是usb host驱动,然后它发现了usbhid设备,加载了hid驱动,这时我的触摸屏驱动还没有加载,那么,鼠标有动作了也没法setevent了,我想问,怎样调整驱动加载顺序,使系统先加载touch驱动,然后加载usb驱动?
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-30 14:54
把注册表相应目录下的order值改改,越小的越先启动
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-30 15:19
wxl_50685330大哥说得对:)))
To ziyun:
我觉得即使你不改变touch驱动和usb驱动的加载顺序,也不会影响正常的功能。因为在你的触摸屏驱动加载之前,即使有usb鼠标动作,并且调用了setevent,也是没有作用的,因为触摸屏驱动还没起来。
但是从逻辑上来讲,先加载touch驱动再加载usb驱动看起来可能更合理些。
如果我说的不对,我认错 :P
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-30 15:40
嗯,怎么做无所谓,只要达到目的就行了,这个线程由谁起无所谓,不如就放到鼠标键盘驱动算了
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-30 15:53
wxl_50685330大哥,如果把监控线程放到鼠标键盘驱动里面,实现起来会不会有问题啊? 关闭背光要操作触摸屏硬件或者借助于触摸屏驱动程序,如果在鼠标键盘驱动里实现这个功能应该比较复杂吧。

还请大哥赐教:)))


[编辑 -  12/30/04 by  wwei_wang]
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-30 15:56
咦~~~~~,越来越懂事了喔!!!
根据地的兄弟们,团结就是力量
icefly_x
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2006-02-07
  • 粉丝0
  • 关注0
  • 积分119分
  • 威望16点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-30 17:51
我想利用电源管理模块(PM)这部分应该更简单些吧,利用PM就只需要写一个接收消息的程序就好了,也不需要改别的驱动了
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-30 17:58
这位兄弟有做电源管理的经营吗,我也知道用PM就行了,可是我对pm一点了解都没有,能不能指点一下
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-12-31 15:20
wxl_50685330大哥,如果把监控线程放到鼠标键盘驱动里面,实现起来会不会有问题啊? 关闭背光要操作触摸屏硬件或者借助于触摸屏驱动程序,如果在鼠标键盘驱动里实现这个功能应该比较复杂吧。

还请大哥赐教:)))


[编辑 -  12/30/04 by  wwei_wang]


大哥还没说话你又说,现在不仅是一片一片的,还是一串一串的喔,哈哈


操作被光的动作就是把被光的led关掉或打开,没什么太复杂的动作,不需要借助touch的驱动,可以独立做,只是在不同驱动里面起的线程隶属于不同进程,touch的属于gwes,usb的属于device,针对不同的情况倒是需要考虑一下
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-12-31 15:29
咦~~~~~,越来越懂事了喔!!!

引用:
--------------------------------------------------------------------------------
wxl_50685330大哥,如果把监控线程放到鼠标键盘驱动里面,实现起来会不会有问题啊? 关闭背光要操作触摸屏硬件或者借助于触摸屏驱动程序,如果在鼠标键盘驱动里实现这个功能应该比较复杂吧。

还请大哥赐教:)))


[编辑 - 12/30/04 by wwei_wang]
--------------------------------------------------------------------------------


完了,全都乱了,我咋个觉得这些是回的另外的帖子的话,在这儿怎么对不上号了,wwei_wang,兄弟儿,你越来越凶了,哥哥都被你说昏了,哈哈
根据地的兄弟们,团结就是力量
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-12-31 15:57
1,建议把背光管理单独做成一个驱动程序,这样从程序结构的独立性来看更便于修改,管理和理解.

2,在背光驱动程序里,放一个线程来接收外界触发的RESET TIMER事件,否则就等到TIMEOUT之后关背光.

3,注册表里有:
; Backlight tab of Display control panel (timeouts in seconds)
[HKEY_CURRENT_USERControlPanelBacklight]
"BatteryTimeout"=dword:2710 ;0x2710 == 10K ms
"ACTimeout"=dword:EA60 ;0xEA60 == 1 min.
这两个值是可以由控制面板里设定的,你可以读出这些值来作为你的TIMEOUT的时间.同时,当控制面板里的值被修改时,系统会发出_T("BackLightChangeEvent")事件,你可以在你的线程里接收这个事件,RESET你的TIMEOUT的值.

4,把背光写成单独的驱动程序,还有一个好处就是可以在系统SUSPEND/Wakeup的时候,BKL_PowerDown() 和BKL_PowerUp()会被自动调用,你可以完成开关背光的动作.

5.把背光驱动做成单独的一个stream-interface的驱动后,可以在注册表此项下加入
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"   ;GUID for generic power-managed devices.
并且在驱动代码里的BKL_IoControl()函数里加入以下IOCTL_CODE的支持:
IOCTL_POWER_CAPABILITIES
IOCTL_POWER_QUERY
IOCTL_POWER_SET
IOCTL_POWER_GET
这可以把背光驱动声明为一个PM-Aware的设备,当系统的状态变化(D0->D1->D2->D3->D4)时,都会接收到IOCTL_POWER_SET的IoControl的调用.但是这个调用的时间和上述的TIMEOUT的时间并不相同,而是系统状态变化的时间(在[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerTimeouts])里设定.
所以说,单纯的加入PM支持并不能达到定时关闭背光的目的,主要还是得靠一个管理线程来控制. 但是加入PM支持后有一个好处,就是你可以通过调用PM的API来达到直接控制背光的作用,比如调用
DevicePowerNotify(_T("bkl1:"), D0, POWER_NAME);  //开背光
DevicePowerNotify(_T("bkl1:"), D4, POWER_NAME);  //关背光
DevicePowerNotify()这个API其实也是调用背光驱动的
IoControl(IOCTL_POWER_SET)来控制背光.

6.其实背光管理看似简单,却涉及到很多外界的东西. 简单的只是它的控制,可是它的管理却可能有很多外界要求的.比如当用MEDIAPLAYER放电影的时候,一般是不会去按按键的,这时你的管理线程TIMEOUT了,你能把背光直接关掉吗?那用户不骂死才怪!!!也就是说这时Mediaplayer这个APPLICATION对背光这个DEVICE是有一些要求的,就是要求背光不能关闭.可是怎么把这个要求传递给背光驱动程序(管理程序)知道呢? 这就是MICROSOFT提出PM这个驱动的意义.有了PM后,Application可以调用PM的API: SetPowerRequirement()来设定对某个PM-Aware的DEVICE的要求. 这样PM在系统状态变化时,或者别的Application调用DevicePowerNotify()来要求DEVICE做出另外的动作时,PM就可以把这些要求全部浏览一遍, 满足最苛刻的条件,其余的则不做理会.

[编辑 -  12/31/04 by  joyfly]
www.cnemb.com
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-01-04 16:59
我基本上是按照上面这位老兄的做法做了,但是有个问题,如果我写一个线程来监视外部输入,如果一段时间没有动作,背光肯定被关掉,这样即使在mediaplay运行的时候也会关掉,这样没有达到效果,如果不加监视线程,背光又关不调.这个怎么办
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-01-05 09:48
mediaplayer在放VIDEO的时候,会每隔几秒去SetEvent( _T("PowerManager/SystemIdleTimerReset") ) 所以你的线程里可以等待这个事件,有的话就重新等待.
www.cnemb.com
上一页
游客

返回顶部