freefly
驱动牛犊
驱动牛犊
  • 注册日期2001-11-08
  • 最后登录2007-02-11
  • 粉丝0
  • 关注0
  • 积分113分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:1855回复:4

键盘过滤出错

楼主#
更多 发布于:2003-01-01 14:51
我想编写一个win2000下的键盘过滤驱动程序过滤某些特殊按键如delete.但是我发现虽然成功地过滤了,但在我的和过滤驱动通信的app的输入框里却不能输入u和d字母键,并且当按这两个键时系统弹出程序管理器窗口和资源管理器窗口。我很迷茫,请高手指点迷津!3x3x3x!!!其中SCANCODE_HARMLESS=(USHORT)0X00
NTSTATUS KeyboardFilterDevice::OnIrpComplete(KIrp I, PVOID Context)
{
int numKeys, i;
PKEYBOARD_INPUT_DATA KeyData;

if( NT_SUCCESS(I.Status()))
{
KeyData = (KEYBOARD_INPUT_DATA*)I.IoctlBuffer();
numKeys = I.Information() / sizeof(KEYBOARD_INPUT_DATA);

DbgPrint(\"numKeys: %d \\n\", numKeys);

for(i=0; i<numKeys; i++)
{
DbgPrint(\"ScanCode: %d \\n\", KeyData.MakeCode);
DbgPrint(\"%s\\n\", KeyData.Flags ? \"Up\" : \"Down\");

switch( KeyData.MakeCode)
{
//Save the state of the control key
case SCANCODE_LCONTROL:
m_ControlDown = KeyData.Flags & KEY_BREAK ? 0 : 1;
break;
//Save the state of the alt key
case  SCANCODE_LALT:
m_AltDown = KeyData.Flags & KEY_BREAK ? 0 : 1;
break;
//save the state of the shift keys
//The grey del key generates a 0x2a code with flags=KEY_E0.
//We have to distinguish this from the left shift and correctly process it.
            case SCANCODE_LSHIFT:
if( KeyData.Flags & KEY_E0) //it\'s grey delete
{
if( m_ControlDown && m_AltDown && !m_ShiftDown)
{
KeyData.MakeCode = SCANCODE_HARMLESS;
                        break;
}
}// if it\'s left shift just drop through
case SCANCODE_RSHIFT:
m_ShiftDown = KeyData.Flags & KEY_BREAK ? 0 : 1;
break;

//Tray alt-ctl-del
case SCANCODE_DELETE:
if( m_ControlDown && m_AltDown && !m_ShiftDown)//alt-ctl-del
KeyData.MakeCode = SCANCODE_HARMLESS;
                break;

   //tray ctrl-escape, ctrl-shift-escape and alt-escape
case SCANCODE_ESCAPE:
if( m_ControlDown && !m_AltDown && !m_ShiftDown)//ctrl-esc
{
KeyData.MakeCode = SCANCODE_HARMLESS;
}
else if( m_ControlDown && !m_AltDown && m_ShiftDown)//ctrl-shift-esc
{
                    KeyData.MakeCode = SCANCODE_HARMLESS;
}
else if( !m_ControlDown && m_AltDown && !m_ShiftDown)//alt-esc
{
KeyData.MakeCode = SCANCODE_HARMLESS;
}
else if( m_ControlDown && m_AltDown && !m_ShiftDown)
{
KeyData.MakeCode = SCANCODE_HARMLESS;
}
break;

                //Tray alt-tab
case SCANCODE_TAB:
if( !m_ControlDown && m_AltDown && !m_ShiftDown)
{
KeyData.MakeCode = SCANCODE_HARMLESS;
}
break;

//Trap alt-F4;really this should be done from apps
            case SCANCODE_F4:
if( !m_ControlDown && m_AltDown && !m_ShiftDown)//alt-F4
{
KeyData.MakeCode = SCANCODE_HARMLESS;
}
else if( m_ControlDown && !m_AltDown && !m_ShiftDown)//ctrl-F4
{
KeyData.MakeCode = SCANCODE_HARMLESS;
}
break;
                
//Trap LWIN key
            case SCANCODE_LWIN:
                KeyData.MakeCode = SCANCODE_HARMLESS;
break;

                //Trap  RWIN key
            case SCANCODE_RWIN:
KeyData.MakeCode = SCANCODE_HARMLESS;
break;
}

}

}
return KFilterDevice::OnIrpComplete(I, Context);
}

最新喜欢:

hartonoharton...
freefly
驱动牛犊
驱动牛犊
  • 注册日期2001-11-08
  • 最后登录2007-02-11
  • 粉丝0
  • 关注0
  • 积分113分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-03 10:04
哪位大虾不要保守,请指点一下。3x!
drank
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-20 13:32
请问你为什么不用servicecallback
而用irponcomplete呢? 他们有什么区别?
DS的kbfilter就是用的servicecallback.
我试过kbfilter,在过滤按键时挺好用的.
但就是不知道怎样用app与这个filter通信?

也请指点一二.
webstartlove
驱动牛犊
驱动牛犊
  • 注册日期2002-07-01
  • 最后登录2004-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-04 21:57
我想问一下 freefly 兄
可不可以把代码发给我参考一下,我最近也在写这方面的东东,但不得要领,windows xp 的
jackboy
驱动牛犊
驱动牛犊
  • 注册日期2003-10-13
  • 最后登录2010-11-10
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望130点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-15 14:28
请问可以把代码发给我参考一下,我最近搞这些,老是搞不懂,头都蒙了,谢谢!
游客

返回顶部