阅读:1922回复:4
键盘过滤出错
我想编写一个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); } |
|
最新喜欢:harton... |
沙发#
发布于:2003-01-03 10:04
哪位大虾不要保守,请指点一下。3x!
|
|
板凳#
发布于:2003-02-20 13:32
请问你为什么不用servicecallback
而用irponcomplete呢? 他们有什么区别? DS的kbfilter就是用的servicecallback. 我试过kbfilter,在过滤按键时挺好用的. 但就是不知道怎样用app与这个filter通信? 也请指点一二. |
|
地板#
发布于:2004-03-04 21:57
我想问一下 freefly 兄
可不可以把代码发给我参考一下,我最近也在写这方面的东东,但不得要领,windows xp 的 |
|
地下室#
发布于:2004-09-15 14:28
请问可以把代码发给我参考一下,我最近搞这些,老是搞不懂,头都蒙了,谢谢!
|
|