比如说当我的应用程序活动时,按下F12键等于按下F1键,而在系统中的其它程序则正常运行(F12还是F12).
当我的用户程序调用DeviceIoControl(控制代码=Start)后,过滤驱动进入Start部分,接下来我想实现:当我按下F12键时等于按下F1键(在我的用户程序上),而当我在系统中其它地方时,按下F12键不变化。
请问具体要怎么实现?这个问题想了很久都没解决,希望这里有人有这方面的经验,帮帮忙解决下,先谢谢了。
注:已建立一键盘过滤设备,并能完成系统中F12键转换为F1键(无法实现只在我的用户程序里转换键)。
已建立的另一设备提供接口给用户程序调用。
代码如下:
NTSTATUS Ctrl2capDispatchGeneral (IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp)
{
NTSTATUS ntStatus=STATUS_SUCCESS;
ULONG IoControlCodes=0; //I/O控制代码
PIO_STACK_LOCATION IrpStack=NULL; //IRP堆栈
PIO_STACK_LOCATION nextIrpStack=NULL;
//设置IRP状态
pIrp->IoStatus.Status=STATUS_SUCCESS;
pIrp->IoStatus.Information=0;
IrpStack=IoGetCurrentIrpStackLocation(pIrp); //得到当前调用者的IRP
nextIrpStack = IoGetNextIrpStackLocation(pIrp);
switch (IrpStack->MajorFunction)
{
case IRP_MJ_READ:
*nextIrpStack = *IrpStack;
IoSetCompletionRoutine( pIrp, Ctrl2capReadComplete, DeviceObject, TRUE, TRUE, TRUE );
return IoCallDriver( kbdDevice, pIrp );
break;
case IRP_MJ_CREATE:
DbgPrint("IRP_MJ_CREATE\n");
break;
case IRP_MJ_CLOSE:
DbgPrint("IRP_MJ_CLOSE\n");
break;
case IRP_MJ_DEVICE_CONTROL:
DbgPrint("IRP_MJ_DEVICE_CONTROL\n");
//取得I/O控制代码
IoControlCodes=IrpStack->Parameters.DeviceIoControl.IoControlCode;
switch (IoControlCodes)
{
case START: //下面不知要怎样操作才能实现? DbgPrint("Starting\n");
break;
case STOP:
DbgPrint("Stoping\n");
break;
default:
pIrp->IoStatus.Status=STATUS_INVALID_PARAMETER;
break;
}
break;
default:break;
}
ntStatus=pIrp->IoStatus.Status;
IoCompleteRequest(pIrp,IO_NO_INCREMENT);
return ntStatus;
}
可以在你的应用程序每次使用前将其使能,使用完后将起禁止.
就是说只要你的应用程序处于活动状态,就发命令让驱动能转换
当你程序退出时,发命令给驱动让其禁止转换功能.
不知道我说明白了没有.