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

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

楼主#
更多 发布于:2004-12-27 11:57
我现在在写一个函数,用来监视系统是不是有外部输入动作,如果在一定时间后没有动作,就关闭背光,现在不知道如何得到鼠标键盘是否有动作,请问wince是否提供这样的API?
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-06 09:36
在common。reg中有如下话:
; This registry setting tells GWES to signal the Power Manager
; when user input devices are active.  GWES will reset this activity timer
; whenever it dequeues any type of input event (keyboard, mouse, or
; touch) from its internal queue.
[HKEY_LOCAL_MACHINE\SYSTEM\GWE]
    "ActivityEvent"="PowerManager/ActivityTimer/UserActivity"÷
我的英文不好,不知道是不是这个意思:这个注册表信息设置告诉gwes当系统有外部输入时,告诉PM,如果时这样的话,那么我只需要检测这个PowerManager/ActivityTimer/UserActivity就可以了,对不对??
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-06 08:58
“我这样做的结果是系统等待一半的时间就直接关闭背光了,难道不是先等待WaitForSingleObject(hsysevent一半的时间,然后再等待WaitForSingleObject(gPenIntrEvent另一半的时间,而是两个信号同时发生了?”
-------------------

兄弟为何要这么做?建议驱动中的监视线程只等待( _T("PowerManager/SystemIdleTimerReset") )这一个事件,有外部输入时,激活这个事件就可以了。
Come on, let us drive the world.
hijacker2000
驱动牛犊
驱动牛犊
  • 注册日期2004-06-23
  • 最后登录2005-05-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-05 13:31
ziyun兄,看看这个,或许对你有帮助。

GWES reads an event name from HKEY_LOCAL_MACHINE\System\GWE\ActivityEvent. If an event is named in this key and its handle can be opened, the event will be signaled every time the GWES user input thread wakes up to handle an input event

The CXPORT module in the networking stack will periodically signal an activity timer event named by HKEY_LOCAL_MACHINE\Comm\CXPORT\NoIdleTimerEvent whenever at least one socket is in the connected state. Many OEMs may choose to set the "NoIdleTimerReset" flag in the registry if they are using activity timers.

The PCMCIA driver will signal an activity timer event named by HKEY_LOCAL_MACHINE\Drivers\PCMCIA\StatusChangeActivityEvent whenever a card is ejected or inserted
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-05 11:11
我这样做的结果是系统等待一半的时间就直接关闭背光了,难道不是先等待WaitForSingleObject(hsysevent一半的时间,然后再等待WaitForSingleObject(gPenIntrEvent另一半的时间,而是两个信号同时发生了?
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-05 10:42
说错了,我是这样想的,比如,我设置1分钟后关闭背光,那么,我先等待30s看有没有power信号发生,如果没有,就再等30s,看有没有外部输入发生,如果都没有,就关闭背光
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-05 10:38
我按照你的说法做了,发现在播放的时候还是关闭了背光,下面是我的代码:
HANDLE hsysevent=OpenEvent(EVENT_ALL_ACCESS,FALSE,_T("PowerManager/SystemIdleTimerReset"));
BacklightDrvGetRegistryData();
TimeOut = Backlight_ACTimeOut;
if(TimeOut)
{
      if(WaitForSingleObject(hsysevent, 500*TimeOut)==WAIT_OBJECT_0)
     {
}
else
{
DWORD RetValue = WaitForSingleObject(gPenIntrEvent, 500*TimeOut);
………………

我的想法是,先等待power信号一半的等待时间,如果是等待超时,则等待另一半的外部输入信号,如果还是超时,则关闭背光
辛苦你,帮我分析一下,为什么没有产生预期的效果?
非常感谢!
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-05 09:48
mediaplayer在放VIDEO的时候,会每隔几秒去SetEvent( _T("PowerManager/SystemIdleTimerReset") ) 所以你的线程里可以等待这个事件,有的话就重新等待.
www.cnemb.com
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-04 16:59
我基本上是按照上面这位老兄的做法做了,但是有个问题,如果我写一个线程来监视外部输入,如果一段时间没有动作,背光肯定被关掉,这样即使在mediaplay运行的时候也会关掉,这样没有达到效果,如果不加监视线程,背光又关不调.这个怎么办
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
9楼#
发布于: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
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-31 15:29
咦~~~~~,越来越懂事了喔!!!

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

还请大哥赐教:)))


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


完了,全都乱了,我咋个觉得这些是回的另外的帖子的话,在这儿怎么对不上号了,wwei_wang,兄弟儿,你越来越凶了,哥哥都被你说昏了,哈哈
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-31 15:20
wxl_50685330大哥,如果把监控线程放到鼠标键盘驱动里面,实现起来会不会有问题啊? 关闭背光要操作触摸屏硬件或者借助于触摸屏驱动程序,如果在鼠标键盘驱动里实现这个功能应该比较复杂吧。

还请大哥赐教:)))


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


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


操作被光的动作就是把被光的led关掉或打开,没什么太复杂的动作,不需要借助touch的驱动,可以独立做,只是在不同驱动里面起的线程隶属于不同进程,touch的属于gwes,usb的属于device,针对不同的情况倒是需要考虑一下
根据地的兄弟们,团结就是力量
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-30 17:58
这位兄弟有做电源管理的经营吗,我也知道用PM就行了,可是我对pm一点了解都没有,能不能指点一下
icefly_x
驱动牛犊
驱动牛犊
  • 注册日期2004-02-26
  • 最后登录2006-02-07
  • 粉丝0
  • 关注0
  • 积分119分
  • 威望16点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-30 17:51
我想利用电源管理模块(PM)这部分应该更简单些吧,利用PM就只需要写一个接收消息的程序就好了,也不需要改别的驱动了
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-30 15:56
咦~~~~~,越来越懂事了喔!!!
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
15楼#
发布于: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分
16楼#
发布于:2004-12-30 15:40
嗯,怎么做无所谓,只要达到目的就行了,这个线程由谁起无所谓,不如就放到鼠标键盘驱动算了
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
17楼#
发布于: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分
18楼#
发布于:2004-12-30 14:54
把注册表相应目录下的order值改改,越小的越先启动
根据地的兄弟们,团结就是力量
ziyun
驱动小牛
驱动小牛
  • 注册日期2003-07-28
  • 最后登录2009-05-31
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望109点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-12-30 13:46
ok,谢谢各位,这个问题我已经搞定了,我是单独做成一个驱动的样子(实际上我把它放在触摸屏驱动中),启动一个线程,设置一个超时中断,并修改了鼠标键盘触摸的驱动,如果他们有动作,就setevent,这样我的线程就不是超时中断了,就不会关背光了。但是又出现了一个新的问题,由于我是把这个中断放在触摸驱动中,当系统没启动时候就插上鼠标键盘的话,启动过程中先加载的是usb host驱动,然后它发现了usbhid设备,加载了hid驱动,这时我的触摸屏驱动还没有加载,那么,鼠标有动作了也没法setevent了,我想问,怎样调整驱动加载顺序,使系统先加载touch驱动,然后加载usb驱动?
上一页
游客

返回顶部