问一个键盘过滤驱动的问题

loveshell 2009-08-20 11:05:39
想把键盘中的win键屏蔽掉,但是实际效果确实win键一直被系统认为是按下状态。比如在按了win键过后,按R就是运行,按L就是注销。代码如下,请高人指点
NTSTATUS OnReadCompletion(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context)            
{
int numKeys;
int i;
if(pIrp->IoStatus.Status == STATUS_SUCCESS)
{
PKEYBOARD_INPUT_DATA keys = (PKEYBOARD_INPUT_DATA)pIrp->AssociatedIrp.SystemBuffer;

numKeys = pIrp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA);
for(i = 0; i < numKeys; i++)
{
if (keys[i].MakeCode ==0x5b||keys[i].MakeCode ==0x5c )
{
keys[i].MakeCode = 0x00; //
}

}
......
}
...全文
170 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveshell 2009-08-20
  • 打赏
  • 举报
回复
我把信息打印出来左win是0x5b,右win是0x5c,小键盘4是0x4b
MoXiaoRab 2009-08-20
  • 打赏
  • 举报
回复
你要屏蔽MakeCode ==0x5c 做什么呢?这个是小键盘的4
MoXiaoRab 2009-08-20
  • 打赏
  • 举报
回复

NTSTATUS IncisionReadComplete(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
)
{
PIO_STACK_LOCATION IrpSp;
PKEYBOARD_INPUT_DATA KeyData;
int numKeys, i;

//
// Request completed - look at the result.
//
IrpSp = IoGetCurrentIrpStackLocation( Irp );
if( NT_SUCCESS( Irp->IoStatus.Status ) ) {

KeyData = Irp->AssociatedIrp.SystemBuffer;
numKeys = Irp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA);
if (keys[i].MakeCode ==0x5b||keys[i].MakeCode ==0x5c )
{
keys[i].MakeCode = 0x00; //
}
}

//
// Mark the Irp pending if required
//
if( Irp->PendingReturned ) {
IoMarkIrpPending( Irp );
}
return Irp->IoStatus.Status;
}

看看我从自己的源代码中抽出来的
jason176374 2009-08-20
  • 打赏
  • 举报
回复
不要再完成例程里面捕获呢?
loveshell 2009-08-20
  • 打赏
  • 举报
回复
刚才看了下,按的第一个键的按下没有屏蔽到,弹起是屏蔽了的。后面的按下弹起都屏蔽了。为什么第一个键的按下没有捕获到呢
路人乙2019 2009-08-20
  • 打赏
  • 举报
回复
你只屏蔽掉弹起,没屏蔽掉按下吧.

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧