请问键盘过滤驱动(ctrl2cap)如何实现只为我的应用程序服务???

上下游的鱼   2007-7-19 02:08 楼主
比如说当我的应用程序活动时,按下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;
}

回复评论 (2)

可以在你的应用程序每次使用前将其使能,使用完后将起禁止.
就是说只要你的应用程序处于活动状态,就发命令让驱动能转换
当你程序退出时,发命令给驱动让其禁止转换功能.
不知道我说明白了没有.
点赞  2008-4-9 18:37
都是很好的建议! 值得学习
点赞  2008-5-1 14:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复