zxw2844
驱动牛犊
驱动牛犊
  • 注册日期2006-06-12
  • 最后登录2009-03-06
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望66点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:2929回复:8

读取PS/2键盘/鼠标的输入的问题

楼主#
更多 发布于:2008-07-09 15:12
我只是想得到键盘设备的路径,然后打开设备读取键盘的所有输入,但是总是在SetupDiEnumDeviceInterfaces失败,
返回错误259(没有可用的数据了) !!! 请问问题出在那里???

难道是SetupDiClassGuidsFromName得到的GUID是错误的???

// 代码如下:
GUID hidGuid;
HANDLE hidHandle = INVALID_HANDLE_VALUE;

DWORD dwi=sizeof(GUID);  
SetupDiClassGuidsFromName("Keyboard",&hidGuid,dwi,&dwi);//得到设备的GUID

//char szGUID[] = "4D36E96B-E325-11CE-BFC1-08002BE10318"; //从注册表中得到.
//UuidFromString((unsigned char *)szGUID, &hidGuid);

HDEVINFO hDevInfo = SetupDiGetClassDevs( &hidGuid,NULL,NULL,DIGCF_PRESENT ¦ DIGCF_DEVICEINTERFACE );
if( hDevInfo == NULL ) return 0;

SP_DEVICE_INTERFACE_DATA  devInfoData;
::ZeroMemory( &devInfoData,sizeof(devInfoData) );
devInfoData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);

int  nDevCount = 0;
BOOL bResult  = FALSE;

SetLastError(NO_ERROR);
while( GetLastError()!=ERROR_NO_MORE_ITEMS )
{
    bResult = SetupDiEnumDeviceInterfaces( hDevInfo,0,&hidGuid,nDevCount++,&devInfoData );
    DWORD dwError = GetLastError();//总是返回错误259(没有可用的数据了。)
    // 请问为什么啊! 如何解决啊,
    if ( !bResult ) continue;

    ULONG reqLength = 0;
    SetupDiGetInterfaceDeviceDetail( hDevInfo,&devInfoData,NULL,0,&reqLength,NULL );
    PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail =
            (PSP_INTERFACE_DEVICE_DETAIL_DATA) new BYTE[reqLength];
    devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
    bResult = SetupDiGetInterfaceDeviceDetail  (hDevInfo,&devInfoData,devDetail,reqLength,NULL,NULL );
    if ( !bResult )
    {
        delete devDetail;
devDetail = NULL;
continue;
      }
      TRACE("-- %s\n",devDetail->DevicePath);
      delete devDetail;
      devDetail = NULL;
} // while

SetupDiDestroyDeviceInfoList (hDevInfo);
zxw2844
驱动牛犊
驱动牛犊
  • 注册日期2006-06-12
  • 最后登录2009-03-06
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望66点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-14 09:28
怎么就没有人做过吗??
Owen.Guo
驱动中牛
驱动中牛
  • 注册日期2001-03-30
  • 最后登录2012-03-29
  • 粉丝0
  • 关注1
  • 积分402分
  • 威望260点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-07-18 16:47
这个好像要写驱动才可以的
Owen.Guo 祝你成功!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-07-21 11:42
PS/2还是写驱动或者使用Hook吧
不建议你用CreateFile打开然后直接读
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
eaatcc
禁止发言
禁止发言
  • 注册日期2006-04-21
  • 最后登录2018-12-27
  • 粉丝0
  • 关注0
  • 积分6884分
  • 威望34869点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2008-08-19 14:47
用户被禁言,该主题自动屏蔽!
flycatjp
驱动牛犊
驱动牛犊
  • 注册日期2007-11-21
  • 最后登录2020-08-18
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-08-19 15:32
引用第4楼eaatcc于2008-08-19 14:47发表的  :
用过滤驱动吧,键盘鼠标是系统独占的,不能直接createfile with read/write

请教,PS/2的鼠标在系统启动时是否是自动打开的,即系统会调用驱动的CREATEFIEL例程打开一个句柄,如果是,那系统何时会关闭该句柄,应该怎样促使系统关闭该句柄?
feiba7288
驱动牛犊
驱动牛犊
  • 注册日期2008-09-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-09-29 22:03
谁有ps/2鼠标的过滤驱动啊,小弟求购一个,QQ:1020725464
Chialong
驱动牛犊
驱动牛犊
  • 注册日期2010-06-07
  • 最后登录2011-01-31
  • 粉丝0
  • 关注2
  • 积分12分
  • 威望221点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2010-09-10 18:06
看到就回一下了,,,我也是初學的
在mouclass.sys 會擋下來.
可參考wdk 裡的mouclass sample

NTSTATUS
MouseClassCreate (

    //
    // We do not allow user mode opens for read.  This includes services (who
    // have the TCB privilege).
    //
    if (Irp->RequestorMode == UserMode &&
        (irpSp->Parameters.Create.SecurityContext->DesiredAccess & FILE_READ_DATA)) {
        status = STATUS_ACCESS_DENIED;
        goto MouseClassCreateEnd;
    


eaatcc
禁止发言
禁止发言
  • 注册日期2006-04-21
  • 最后登录2018-12-27
  • 粉丝0
  • 关注0
  • 积分6884分
  • 威望34869点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2010-09-16 10:19
用户被禁言,该主题自动屏蔽!
游客

返回顶部