blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:2025回复:7

如何捕获键盘消息?

楼主#
更多 发布于:2004-12-14 19:26
由于Wince系统里的程序有很多,用键盘关闭的时候有的是ESC,有的是ALT+F4,有的是ALT C,有的是ALT X等,乱七八糟,我想把他们统一一下,比如都用ALT+F4。
所以我想先用程序捕获到键盘的消息,如果是ALT+F4的话,就找到系统当前最上面的程序,然后强制关闭他。

现在的问题是:

1、我如何捕获到键盘的消息?
    由于2000下有钩子函数可以使用,这点比较容易实现,可是CE下却不支持钩子,我该如何捕获呢?
    想通过键盘的驱动程序,不知道有没有可能实现?
    不知哪位有没有更好点的方法?

2、如何找到当前系统中正在运行的最上面的那个程序,然后关闭他?
    这点也还没有眉目,不知道可否能行的通?

  
  
努力!
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-15 08:58
(2)通过调用GetForegroundWindow()函数可以获得当前的前台窗口。调用DestroyWindow函数可以销毁指定的窗口。

[编辑 -  12/15/04 by  wwei_wang]
Come on, let us drive the world.
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-15 12:55
关于WINCE下的HOOK的有限支持,
http://www.cnemb.com/index.php?name=PNphpBB2&file=viewtopic&t=10333


关于"如何找到当前系统中正在运行的最上面的那个程序,然后关闭他?"
好象有GetWindow(...,GW_HWNDFIRST)可以找到目前最顶端的窗口,这个窗口有可能是你的后台监控程序的窗口(如果你有创建隐藏窗口的话),也有可能就是你要关闭的那个应用程序的窗口. 反正从最顶端的窗口往下找到你要关的窗口,然后把它关掉.
www.cnemb.com
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-15 14:15
对于“如何捕获到键盘的消息?”,我觉得也可以在键盘驱动程序里实现,先捕获Alt+F4,然后通知上层的应用(也可以是一个动态链接库,当然这个需要自己开发,应该很简单的),由这个应用(或动态链接库)负责关闭处于顶层的应用程序。
如果我说的不对,还请各位大侠批评指正,谢谢:)))
Come on, let us drive the world.
joyfly
驱动小牛
驱动小牛
  • 注册日期2002-07-02
  • 最后登录2009-09-17
  • 粉丝0
  • 关注0
  • 积分319分
  • 威望32点
  • 贡献值0点
  • 好评度31点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-15 15:47
如果可以修改KEYBOARD DRIVER,就可以在DRIVER里得到你要的KEY的时候,SetEvent()通知你的APPLICATION就可以了,用不着写DLL那么麻烦了;
同时还能在DRIVER里把你不想交给系统处理的KEY直接丢掉,不给GWES,也就起到了屏蔽一些KEY的作用了.
www.cnemb.com
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-16 08:35
joyfly说得没错。但是DLL也是一种应用,到底在哪里实现完全是个人所好,而且与实际情况有关。如果把这个功能放到其他的动态链接库里面,那么就可以减少一个进程的运行,这对物理内存相对比较紧缺的系统来说肯定是有益的。当然,具体的实现还是与实际的情况有关的。:))))
Come on, let us drive the world.
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-16 16:06
键盘捕获的问题我已经解决了,谢谢大家,我注册了一个系统热键,就可以得到了。

第二个问题就比较麻烦了,我得到窗口的句柄,那个句柄虽然不是我程序的,但可能是另外一个程序的一个自窗口的句柄,这样的话,我给那个句柄发关闭消息,结果是那个句柄的窗口(也就是子窗口)被关闭了,而不是应用程序被关闭了。

我该如何解决呢?
努力!
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-17 08:31
兄弟你可以试试下面的函数:
HWND GetParent(
  HWND hWnd
);
当你得到一个窗口的句柄之后,你可以递归调用它,直到找到对应的应用程序的主窗口,然后关闭它;如果当前窗口即为主窗口,直接关闭它就可以了。

[编辑 -  12/17/04 by  wwei_wang]
Come on, let us drive the world.
游客

返回顶部