精华内容
下载资源
问答
  • 增强型键盘驱动程序是什么? 增强型虚拟键盘功能可更好地处理国际键盘和带有额外按键的键盘。此功能只能在 Windows 主机系统中使用。 由于增强型虚拟键盘功能可尽可能快地处理原始键盘输入,所以能够绕过 Windows ...

    安装vmware时出现如下勾选框,纠结要不要勾选?狗哥了一下发现这玩意儿还有用,索性勾上,反正不缺内存(zz)
    在这里插入图片描述
    增强型键盘驱动程序是什么?

    增强型虚拟键盘功能可更好地处理国际键盘和带有额外按键的键盘。此功能只能在 Windows 主机系统中使用。
    由于增强型虚拟键盘功能可尽可能快地处理原始键盘输入,所以能够绕过 Windows 按键处理和任何尚未出现在较低层的恶意软件,从而提高安全性。使用增强型虚拟键盘功能时,如果按下 Ctrl+Alt+Delete,只有客户机操作系统会做出反应。

    小贴示:如果最初安装或升级 Workstation Pro 时没有安装“增强型键盘实用工具”功能,那么可在程序维护模式下运行 Workstation Pro 安装程序来安装此功能

    在 Windows 主机系统中,要使用虚拟机的增强型虚拟键盘功能,则必须安装增强型键盘驱动程序。

    所以大家到里应该可以明白vmware增强型键盘驱动程序是什么了,如果安装虚拟机时没有勾选,以后也可以安装。

    附上pro12的说明

    展开全文
  • VMware增强型键盘驱动程序

    千次阅读 2020-06-13 06:37:07
    VMware增强型键盘驱动程序是什么? VMware增强型键盘驱动程序需要装吗? VMware增强型键盘驱动程序有必要打勾吗? 由于今天一位朋友在安装 VMware Workstation Pro 的时候,也遇到这个疑问,我就干脆给给大家...

     

    我相信很多人在安装VMware Workstation Pro的时候,都曾发现有一个“增强型键盘驱动程序“,默认是没有打勾的,同样,我也相信很多人都有如下这样的疑问:

    VMware增强型键盘驱动程序是什么?

    VMware增强型键盘驱动程序需要装吗?

    VMware增强型键盘驱动程序有必要打勾吗?

     

    由于今天一位朋友在安装 VMware Workstation Pro 的时候,也遇到这个疑问,我就干脆给给大家简单的讲解一下。

    一般我们在”自定义安装“路径这里,就会出现”增强型键盘驱动程序(需要重新引导以使用此功能(E)此功能要求主机驱动器上具有10MB空间。)“

     

     

    一、增强型键盘驱动程序是什么?

    增强型虚拟键盘功能可更好地处理国际键盘和带有额外按键的键盘。此功能只能在 Windows 主机系统中使用。

     

    由于增强型虚拟键盘功能可尽可能快地处理原始键盘输入,所以能够绕过 Windows 按键处理和任何尚未出现在较低层的恶意软件,从而提高安全性。使用增强型虚拟键盘功能时,如果按下 Ctrl+Alt+Delete,只有客户机操作系统会做出反应。

     

    二、VMware增强型键盘驱动程序需要装吗?

    如果最初安装或升级 Workstation Pro 时没有安装“增强型键盘实用工具”功能,那么,可在程序维护模式下运行 Workstation Pro 安装程序来安装此功能。

     

    在 Windows 主机系统中,要使用虚拟机的增强型虚拟键盘功能,则必须安装增强型键盘驱动程序。

     

    所以大家到里应该可以明白vmware增强型键盘驱动程序是什么了,如果安装虚拟机时没有勾选,以后也可以安装。

     

    三、VMware增强型键盘驱动程序有必要打勾吗?

    从上面的讲解可以看出来,VMware增强型键盘驱动程序主要的作用是提高安全性,如果只是家庭、个人电脑上使用VMware,我个人觉得没有必要打勾。

    展开全文
  • KeyLauncher用于Windows的简单键盘驱动的启动器应用程序。 主要特点 启动应用程序 启动网址 使用文件资源管理器启动文件夹 存储少量信息 描述 当前,硬编码主题颜色和显示KeyLauncher(Alt + Space)的快捷方式...
  • 什么是驱动程序

    2018-11-14 17:36:05
    驱动,就是屏蔽到底层设备的细节,比如,键盘驱动程序,QT在打开键盘的设备节点的时候,它不知道系统的键盘是什么,是GPIO接的,是I2C总线接的,它都不知道,它所做的就是read,如果有按键,那么就能读出键值,如果...

    驱动就是一个应用程序。添加到操作系统中的一段代码。驱动程序是根据操作系统编写的配置文件。

    驱动,就是屏蔽到底层设备的细节,比如,键盘驱动程序,QT在打开键盘的设备节点的时候,它不知道系统的键盘是什么,是GPIO接的,是I2C总线接的,它都不知道,它所做的就是read,如果有按键,那么就能读出键值,如果没有sleep啊。应用程序就只能做到这里了,剩下的都是由驱动完成了。这就是驱动的任务

    驱动程序,英文名为“Device Driver”,全称为“设备驱动程序”,它是一种特殊的程序。首先其作用是将硬件本身的功能告诉操作系统,接下来的主要功能就是完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。

    所以简单的说驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称为“硬件底层驱动是程序以访问底层硬件的形式实现人机交互,驱动程序和应用程序之间需要实现相应的信息交互,一方面,应用程序通过对驱动程序发送相应的指令,实现 硬件控制的动作指令,另一方面,驱动程序将硬件读写的状态、从硬件上获得的数据传送给应用程序,实现应用程序与驱动程序间的交互和系统之间的桥梁”。

    展开全文
  • 1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底怎样的 先来回忆下,我们之前写的鼠标驱动的id_table这样: 所以我们要修改id_table,使这个驱动为键盘的驱动,如下图所示: 然后修改中断函数,...

    1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的

    先来回忆下,我们之前写的鼠标驱动的id_table是这样:

     

    所以我们要修改id_table,使这个驱动为键盘的驱动,如下图所示:

     

    然后修改中断函数,通过printk()打印数据:

    我们先按下按键A为例,打印出0x04,如下图:

     

     

    我们再同时按下按键A和S,打印出0x04,0X16, 如下图:

     

    显然这些普通按键都是从buf[2]开始的,那第一个数组到底又存什么值?

    我们按完所有键盘按键,发现只有8个按键会打印在buf[0]里,如下图所示:

     

    所以buf[0]是用来保存键盘的特定功能的键,而buf[1]可能是个保留键,没有用到的,buf[2]~buf[7]是普通按键,比如ABCD,1234,F1,F2等等,能支持最多6个按键同时按下。

    2.那么每个按键的数据又是怎么定义的?

    2.1比如我们按下按键A,为什么打印0X04?

    我们找到输入子系统(input.h)中按键A定义的值,它对应的却是30,看来不是直接调用的,如下图:

     

     

    我们再来参考内核自带的USB键盘驱动 (/drivers/hid/usbhid/usbkbd.c)

    发现它的中断函数中有个键盘描述码表(其中0表示保留的意思):

     

     

     

    发现该数组的0X04就是0X30,看来要写个键盘驱动,还需要上面的数组才行.

    那么问题又来了,如果我们按下左alt键,buf[0]中会出现0x04,如果也代入到键盘描述码表中,显然就会当作键盘按键A来使用。

    2.2我们来分析内核的键盘中断函数是如何处理的:

    发现有这么一句:

    for (i = 0; i < 8; i++)
    
           input_report_key(kbd->dev, usb_kbd_keycode[i+ 224], (kbd->new[0] >> i) & 1);

     

    其中kbd->new表示的就是键盘数据数组,它将buf[0]的每一位通通以usb_kbd_keycode[i+ 224]的形式上传到按键事件中

    显然我们的buf[0]的0X04就是上传的usb_kbd_keycode[4+ 224]

    2.3我们来看看usb_kbd_keycode[226]里的数据对应的到底是不是左ALT键

    找到usb_kbd_keycode[226]=56:

     

    然后再进入input.h,找到56的定义,刚好就是KEY_LEFTALT(左边的alt键)

     

     

    3.接下来再来仔细分析下内核自带的USB键盘驱动usbkbd.c里的中断函数:

    代码如下:

     

    static void usb_kbd_irq(struct urb *urb)
    {
           struct usb_kbd *kbd = urb->context;
           int i;
           switch (urb->status) {                        // 只有urb->status==0时,说明数据传输成功
           case 0:                  /* success */
                  break;
           case -ECONNRESET:     /* unlink */
           case -ENOENT:
           case -ESHUTDOWN:
                  return;
           /* -EPIPE:  should clear the halt */
           default:          /* error */
                  goto resubmit;
           }
    
           for (i = 0; i < 8; i++)                           //上传crtl、shift、atl、windows 等按键
                  input_report_key(kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1);
    
           for (i = 2; i < 8; i++) {                  //上传普通按键
                  /*通过上个状态的按键数据kbd->old[i]的非0值,来查找当前状态的按键数据,若没有找到,说明已经松开了该按键 */
              if (kbd->old[i] > 3 && memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8) {
                  if (usb_kbd_keycode[kbd->old[i]])              //再次判断键盘描述码表的值是否非0
                    input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0); //上传松开事件
                   else
                    info("Unknown key (scancode %#x) released.", kbd->old[i]);
                  }
    
          /*通过当前状态的按键数据kbd->new[i]的非0值,来查找上个状态的按键数据,若没有找到,说明已经按下了该按键 */
             if (kbd->new[i] > 3 && memscan(kbd->old + 2, kbd->new[i], 6) == kbd->old + 8) {
                 if (usb_kbd_keycode[kbd->new[i]]) //再次判断键盘描述码表的值是否非0
                    input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);      //上传按下事件
                 else
                    info("Unknown key (scancode %#x) pressed.", kbd->new[i]);
                  }
           }
    
           input_sync(kbd->dev); 
           memcpy(kbd->old, kbd->new, 8);                     //更新上个状态值 
    resubmit:
           i = usb_submit_urb (urb, GFP_ATOMIC);
           if (i)
             err ("can't resubmit intr, %s-%s/input0, status %d",
             kbd->usbdev->bus->bus_name,
             kbd->usbdev->devpath, i);
    }

     

    3.1上面获取普通按键时,为什么不直接判断非0,要判断按键数据> 3?

    之前我们就分析了,当按键数据=0X01、0X02时,代表的是特定功能的键(crtl、shift),是属于buf[0]的数据

    其中memscan()是用来匹配上次按键和当前按键的数据,它这么做的原因是怕上个buf[]和当前buf[]的数据错位,这里就不做详细分析了

    一切迎刃而解,我们只需要将自己的代码也通过这个码表添加所有按键按键事件,然后再在键盘中断函数中根据数据来上传事件即可

    4.本节键盘代码如下:

     

    #include <linux/kernel.h>
    #include <linux/slab.h>
    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/usb/input.h>
    #include <linux/hid.h>
    
    static struct input_dev *myusb_kbd_dev;           //input_dev
    static unsigned char *myusb_kbd_buf;                //虚拟地址缓存区
    static dma_addr_t myusb_kbd_phyc;                  //DMA缓存区;
    
    static __le16 myusb_kbd_size;                            //数据包长度
    static struct urb  *myusb_kbd_urb;                     //urb
    
    static const unsigned char usb_kbd_keycode[252] = {
             0,  0,  0,  0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
            50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44,  2,  3,
             4,  5,  6,  7,  8,  9, 10, 11, 28,  1, 14, 15, 57, 12, 13, 26,
            27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
            65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
           105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
            72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
           191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
           115,114,  0,  0,  0,121,  0, 89, 93,124, 92, 94, 95,  0,  0,  0,
           122,123, 90, 91, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
            29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
           150,158,159,128,136,177,178,176,142,152,173,140
    };       //键盘码表共有252个数据
    
     
    void my_memcpy(unsigned char *dest,unsigned char *src,int len)      //复制缓存
    {
           while(len--)
            {
                *dest++= *src++;
            }
    }
    
    static void myusb_kbd_irq(struct urb *urb)               //键盘中断函数
    {
       static unsigned char buf1[8]={0,0,0,0,0,0,0,0};
       int i;
    
          /*上传crtl、shift、atl、windows 等按键*/
         for (i = 0; i < 8; i++)
         if(((myusb_kbd_buf[0]>>i)&1)!=((buf1[0]>>i)&1))
         {    
                 input_report_key(myusb_kbd_dev, usb_kbd_keycode[i + 224], (myusb_kbd_buf[0]>> i) & 1);
                 input_sync(myusb_kbd_dev);             //上传同步事件
          }
    
    
         /*上传普通按键*/
        for(i=2;i<8;i++)
        if(myusb_kbd_buf[i]!=buf1[i])
        {
         if(myusb_kbd_buf[i] )      //按下事件
        input_report_key(myusb_kbd_dev,usb_kbd_keycode[myusb_kbd_buf[i]], 1);   
        else  if(buf1[i])                                             //松开事件
        input_report_key(myusb_kbd_dev,usb_kbd_keycode[buf1[i]], 0);
        input_sync(myusb_kbd_dev);             //上传同步事件
        }
    
      my_memcpy(buf1, myusb_kbd_buf, 8);       //更新数据    
      usb_submit_urb(myusb_kbd_urb, GFP_KERNEL);
    }
    
    static int myusb_kbd_probe(struct usb_interface *intf, const struct usb_device_id *id)
    {
           volatile unsigned char  i;
           struct usb_device *dev = interface_to_usbdev(intf);                 //设备
           struct usb_endpoint_descriptor *endpoint;                            
           struct usb_host_interface *interface;                                              //当前接口
           int pipe;                                                                               //端点管道
           interface=intf->cur_altsetting;                                                                   
           endpoint = &interface->endpoint[0].desc;                                    //当前接口下的端点描述符
           printk("VID=%x,PID=%x\n",dev->descriptor.idVendor,dev->descriptor.idProduct);   
    
     /*   1)分配一个input_dev结构体  */
           myusb_kbd_dev=input_allocate_device();
    
     /*   2)设置input_dev支持 按键事件*/
           set_bit(EV_KEY, myusb_kbd_dev->evbit);
           set_bit(EV_REP, myusb_kbd_dev->evbit);        //支持重复按功能
    
           for (i = 0; i < 252; i++)
           set_bit(usb_kbd_keycode[i], myusb_kbd_dev->keybit);     //添加所有键
           clear_bit(0, myusb_kbd_dev->keybit);
    
     /*   3)注册input_dev结构体*/
           input_register_device(myusb_kbd_dev);
    
     /*   4)设置USB键盘数据传输 */
     /*->4.1)通过usb_rcvintpipe()创建一个端点管道*/
           pipe=usb_rcvintpipe(dev,endpoint->bEndpointAddress); 
    
      /*->4.2)通过usb_buffer_alloc()申请USB缓冲区*/
          myusb_kbd_size=endpoint->wMaxPacketSize;
          myusb_kbd_buf=usb_buffer_alloc(dev,myusb_kbd_size,GFP_ATOMIC,&myusb_kbd_phyc);
    
      /*->4.3)通过usb_alloc_urb()和usb_fill_int_urb()申请并初始化urb结构体 */
           myusb_kbd_urb=usb_alloc_urb(0,GFP_KERNEL);
           usb_fill_int_urb (myusb_kbd_urb,              //urb结构体
                                     dev,                                       //usb设备
                                     pipe,                                      //端点管道
                                     myusb_kbd_buf,               //缓存区地址
                                     myusb_kbd_size,              //数据长度
                                     myusb_kbd_irq,               //中断函数
                                     0,
                                     endpoint->bInterval);              //中断间隔时间
     
      /*->4.4) 因为我们2440支持DMA,所以要告诉urb结构体,使用DMA缓冲区地址*/
            myusb_kbd_urb->transfer_dma   =myusb_kbd_phyc;                  //设置DMA地址
            myusb_kbd_urb->transfer_flags   =URB_NO_TRANSFER_DMA_MAP;     //设置使用DMA地址
    
      /*->4.5)使用usb_submit_urb()提交urb*/
            usb_submit_urb(myusb_kbd_urb, GFP_KERNEL);   
           return 0;
    }
    
    static void myusb_kbd_disconnect(struct usb_interface *intf)
    {
        struct usb_device *dev = interface_to_usbdev(intf);        //设备
        usb_kill_urb(myusb_kbd_urb);
        usb_free_urb(myusb_kbd_urb);
        usb_buffer_free(dev, myusb_kbd_size, myusb_kbd_buf,myusb_kbd_phyc);
        input_unregister_device(myusb_kbd_dev);               //注销内核中的input_dev
        input_free_device(myusb_kbd_dev);                        //释放input_dev
    }
    
    static struct usb_device_id myusb_kbd_id_table [] = {
           { USB_INTERFACE_INFO(
                  USB_INTERFACE_CLASS_HID,                      //接口类:hid类
                  USB_INTERFACE_SUBCLASS_BOOT,             //子类:启动设备类
                  USB_INTERFACE_PROTOCOL_KEYBOARD) }, //USB协议:键盘协议
    };
    
    static struct usb_driver myusb_kbd_drv = {
           .name            = "myusb_kbd",
           .probe           = myusb_kbd_probe,                        
           .disconnect     = myusb_kbd_disconnect,
           .id_table  = myusb_kbd_id_table,
    };
    
    /*入口函数*/
    static int myusb_kbd_init(void)
    { 
           usb_register(&myusb_kbd_drv);
           return 0;
    }
     
    /*出口函数*/
    static void myusb_kbd_exit(void)
    {
           usb_deregister(&myusb_kbd_drv);
    }
    
    module_init(myusb_kbd_init);
    module_exit(myusb_kbd_exit);
    MODULE_LICENSE("GPL");

     

     

    5.测试运行

    5.1 重新设置编译内核(去掉默认的hid_USB驱动)

    make menuconfig ,进入menu菜单重新设置内核参数:

    进入-> Device Drivers -> HID Devices 

    <> USB Human Interface Device (full HID) support     //hid:人机交互的USB驱动,比如鼠标,键盘等

    然后make uImage 编译内核

    将新的键盘驱动模块放入nfs文件系统目录中

    5.2然后烧写内核,装载触摸屏驱动模块

    如下图,当我们插上USB键盘时,可以看到该VID和PID,和电脑上的键盘的参数一样

     

     

    5.3使用cat  tty1进程测试

     

     

    5.4 使用exec 0</dev/tty1测试

     

    如下图,就能通过板子上的键盘来操作了

     

    展开全文
  • kbdclass管理键盘输入输出的驱动,无论usb键盘还是ps/2还是什么没见过的接口,最后数据都要流入这个驱动,所以实现键盘的过滤最简单的方法挂载kbdclass,对其IRP_MJ_READ操作进行过滤。
  • 本课程设计目的旨在使用Altera公司的EPM144C5系列的FPGA芯片,利用开发板PS2键盘接口等资源,实现一个键盘驱动程序。以达到外接键盘按键的选择、8位动态七段数码管实现按键扫描码显示和8×8点阵实现按键字符显示的...
  • 使用中断,时钟中断,键盘驱动定义一个中断处理函数定义中断向量时钟中断关于时钟中断键盘中断下一步要做什么 在上一篇文章中我们讲述了如何定义一个异常处理函数以及如何向IDT注册异常处理函数,在本篇中我们开始...
  •   闲来无事,逆向一下自己写的驱动,加深下认识。   这里把逆向的驱动分为...  所以这里学习重点讲的逆向Debug版编译的自己的驱动。 Debug版   首先拖入IDA识别的DriverEntry并不我们实际的DriverEntry
  • 键盘驱动之--- 硬件i8042控制器

    千次阅读 2013-10-02 15:53:05
    【PC端】 : 从我前面转载的一篇文章可以知道: pc机上对键盘进行读写与控制的io端口是60H和64H. ...在linux下我们可以用下面的命令来查看我们pc机当前使用的是什么键盘控制器: helight@helight-desktop:~$ ca
  • C# 什么是【事件驱动

    千次阅读 2019-03-07 11:12:12
    按下鼠标,按下键盘,按下游戏手柄,将U盘插入USB接口,都将产生事件。比如说按下鼠标左键,将产生鼠标左键被按下的事件。 消息 当鼠标被按下,产生了鼠标按下事件,windows侦测到这一事件的发生,随即发出鼠标被按...
  • 如果您遇到了计算机故障,则可能硬件驱动程序造成的。 这些计算机操作系统用来与其硬件对话的软件。 从Windows到Android的每个操作系统都使用硬件驱动程序。 驱动程序就像计算机的翻译器 从根本上讲,两个主要...
  • 驱动键盘模拟(C#)

    万次阅读 2013-10-14 13:08:10
    游戏外挂一般分为三个级别:初级鼠标、键盘模拟,中级Call游戏内部函数,读写内存,高级抓包,封包的“脱机挂”(完全模拟客户端网络... 对于鼠标键盘模拟的外挂而言,很多人认为没有什么技术含量,因为无非就是
  • WinIo驱动键盘模拟编程

    千次阅读 2011-04-26 22:05:00
    当时为了提高我魔兽三的按键速度,用了个叫移花接木的软件,把键盘的键位改了。的确有所帮助,但这共享软件,用40次就不能再用了除非注册。于是乎就有了做一个类似的软件出来,在网上搜索了一把发现WinIo模拟...
  • 新装的系统,win7,双系统,另一个win10,win 10完全没有问题,现在想回win7,就装了个雨林木风的,网卡什么驱动都有的(装操作系统自动装的),但键盘鼠标都没用,在win10上检测(驱动精灵),驱动都可以用于...
  • 游戏外挂一般分为三个级别:初级鼠标、键盘模拟,中级Call游戏内部函数,读写内存,高级抓包,封包的“脱机挂”(完全模拟... 对于鼠标键盘模拟的外挂而言,很多人认为没有什么技术含量,因为无非就是Sen...
  • 矩形键盘

    2020-07-29 18:04:41
    矩形键盘介绍什么是矩阵键盘矩阵键盘的原理驱动电路图软件程序实现 介绍 什么是矩阵键盘 矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要...
  • linux驱动编写(其他的驱动代码)

    千次阅读 2018-04-11 22:03:39
    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 linux里面的代码很多,要全部说完,那不现实的...1、其他还有什么重要的驱动gpio驱动,位于drivers/gpio,主要用作键盘输入...
  • 所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数)。当然事件也不仅限于用户的操作. 事件驱动的核心自然事件。从事件角度说,事件驱动程序的基本结构由一个事件...
  • Linux驱动开发_设备文件系统详解

    千次阅读 热门讨论 2021-05-11 14:09:24
    设备管理器就是负责管理这台电脑上的外设,当我们通过电脑提供的USB口插入一个键盘、鼠标时设备管理器会与其通讯来确认你插入的到底一个什么样的设备,然后在创建对应的设备驱动。 以上的前提下你的设备流行...
  • 事件驱动

    2015-01-02 21:05:14
    所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数).当然事件不仅限于用户的操作. 事件驱动的核心自然事件。从事件角度说,事件驱动程序的基本结构由一个事件收集...
  • 电脑红外线驱动通用

    2020-07-13 03:12:53
    红外线驱动什么用?红外线驱动主要用于点对点传输起一个桥梁作用,此驱动为通用版本,需要的朋友欢迎下载使用。红外线驱动介绍点对点的无线驱动,有它,你可以用红外线键盘、红外线鼠标,红外线打印机等。红外...
  • 商品扫码器驱动如何设置?商品扫码器驱动设置步骤,商品扫码器一般分为三种接口,分别为USB接口、串口和键盘口。...不管是什么系统,只要键盘可以输入的地方都可以扫描录入数据,USB键盘不需要驱动,所以和
  • FPGA之矩阵键盘

    千次阅读 2019-10-13 23:08:04
    一 、矩阵键盘原理 如何将自己理解的东西教给别人,这一门学问,我...我们要写的矩阵键盘驱动,因此必须先了解键盘的工作原理,只有知道键盘需要什么样的信号、有哪些输入输出,你才好确定驱动该怎么写。 ...
  • 如何编写驱动程序

    2016-06-18 14:53:46
    驱动,就是屏蔽到底层设备的细节,比如,键盘驱动程序,QT在打开键盘的设备节点的时候,它不知道系统的键盘是什么,是GPIO接的,是I2C总线接的,它都不知道,它所做的就是read,如果有按键,那么就能读出键值,如果...
  • 驱动程序

    千次阅读 2013-07-07 08:00:34
    但像CPU、内存、主板、软驱、键盘、显示器等设备却并不需要安装驱动程序也可以正常工作,而显卡、声卡、网卡等却一定要安装驱动程序,否则便无法正常工作。这什么呢? 这主要由于这些硬件对于一台个人电脑来...
  • js是什么

    2021-01-17 00:03:00
    事件驱动:指的用户对浏览器做出的动作,一般通过鼠标或键盘做出的动作称之为事件。驱动指的浏览器对事件做出的响应。 安全性能:指的操作安全,js没有权限访问操作系统,也就意味着无法操作文件和注册表,从而...
  • 驱动的认知

    2021-03-10 15:04:55
    驱动是一定要有的,每个设备对应不同的驱动。 4.如何找到对应的驱动 open(1.文件名 2.设备号(包含主设备号和次设备号)) 主设备号类似于各大手机品牌,例如:华为,苹果 次设备号类似于各大手机品牌下的各种系列...
  • JavaScript事件驱动

    2016-04-01 20:37:12
    要想弄明白事件驱动,首先得清楚什么是事件和什么是事件处理程序这两个问题。 浏览者通过鼠标或键盘执行的操作称为事件,对此事件做出响应的代码称为事件处理程序,事件的发生使得相应的事件处理程序被执行称为事件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 748
精华内容 299
关键字:

键盘驱动是什么