获取连到电脑上的打印机的相关信息
2010-10-27 16:39
706 查看
一. 打印机型号获取
当打印机连接到电脑上的时候,会发送消息给系统。系统会读取打印机的型号,接口等一系列的消息,并把这些消息写到注册表里面。在程序当中我们并没有直接读取注册表的信息,而是间接的通过SETUP API的函数间接地读取到了相关的信息。主要相关的函数如下:
1. 首先枚举现在连接电脑的所有硬件。函数是
此函数的返回值使我们所需要的,指向了符合条件的一个硬件信息表,这个表中包含我们所需要的信息。此函数的第一个参数,是设备的一个标识,分为两种一种是interface标识,另一种是setup 标识,interface 标识是微软自己定义的,是已定的,setup 标识是驱动安装的时候设定的,是不定的。
2. 取得所有硬件的的句柄之后,需要的是枚举每一个硬件设备。
BOOL SetupDiEnumDeviceInfo(HDEVINFO DeviceInfoSet,DWORD MemberIndex,PSP_DEVINFO_DATA DeviceInfoData)
此函数第一个参数是SetupDiGetClassDevs返回的值作为输入。第二个参数硬件信息表的索引,第三个参数是输出一个指向SP_DEVINFO_DATA结构的指针。这个结构中包括该设备的interface guid以及设备实例的句柄。
3.
这个函数是获取特定设备信息的函数。第二个参数是SetupDiEnumDeviceInfo的输出值。
第三个参数有很多此时应赋值为SPDRP_HARDWAREID. PropertyBuffer是返回的数据。
4.
这个函数是获取设备的具体信息,包括设备是存储设备的具体类型,以及设备的名称和设备的usb端口。此函数与3的函数同时使用,才能的到相应的数据。可以根据此字符串判断打印机以及打印机的型号以及端口号。更进一步可以在此函数后便再次调用3,把第三个参数设置成不同的值来获取更加具体的结果。不过有些数据是取不到的,应该调用CM_XXX系列的函数来获取。
附上具体代码一则:需要一些库以及头文件请自己添加:
HDEVINFO hdevinfo=NULL;
SP_DEVINFO_DATA device_data;
DWORD dwIdx = 0;
SP_DEVINFO_DATA sDevInfo;
sDevInfo.cbSize=sizeof(SP_DEVINFO_DATA);
DWORD dwRegType;
DWORD DataT;
LPTSTR buffer = (LPTSTR)LocalAlloc(LPTR,10000);
LPTSTR buffer1 = (LPTSTR)LocalAlloc(LPTR,1000);
DWORD buffersize = 0;
BOOL c;
HANDLE hand;
SP_DEVICE_INTERFACE_DATA spdid;
spdid.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);
SP_DEVICE_INTERFACE_DETAIL_DATA sdidd;
sdidd.cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SP_DEVINFO_DATA sDevInfo1;
sDevInfo1.cbSize=sizeof(SP_DEVINFO_DATA);
vector<CString> vector1;
vector<CString> vector2;
hdevinfo= SetupDiGetClassDevs(NULL,0,0,DIGCF_ALLCLASSES |DIGCF_PRESENT);
DWORD a= GetLastError();
while(SetupDiEnumDeviceInfo(hdevinfo, dwIdx++, &sDevInfo))
{
if(dwIdx==139)
{
dwIdx=139;
}
c= SetupDiGetDeviceRegistryProperty(hdevinfo,&sDevInfo,SPDRP_HARDWAREID ,&DataT,(PBYTE)buffer,buffersize,&buffersize);
c=SetupDiGetDeviceInstanceId(hdevinfo,&sDevInfo,buffer1,buffersize,&buffersize);
vector1.push_back((CString)buffer);
vector2.push_back((CString)buffer1);
if(c)
{
CString a(buffer1);
a=a.Left(a.Find(L"//"));
if(L"USBPRINT"==a)
{ ZeroMemory(buffer,10000);
c= SetupDiGetDeviceRegistryProperty(hdevinfo,&sDevInfo,SPDRP_DEVICEDESC,&DataT,(PBYTE)buffer,1000,&buffersize);
buffersize=GetLastError();
}
}
}
LocalFree(buffer);
LocalFree(buffer1);
当打印机连接到电脑上的时候,会发送消息给系统。系统会读取打印机的型号,接口等一系列的消息,并把这些消息写到注册表里面。在程序当中我们并没有直接读取注册表的信息,而是间接的通过SETUP API的函数间接地读取到了相关的信息。主要相关的函数如下:
1. 首先枚举现在连接电脑的所有硬件。函数是
HDEVINFO SetupDiGetClassDevs(const GUID*ClassGuid,
PCTSTREnumerator, HWNDhwndParent, DWORDFlags)
此函数的返回值使我们所需要的,指向了符合条件的一个硬件信息表,这个表中包含我们所需要的信息。此函数的第一个参数,是设备的一个标识,分为两种一种是interface标识,另一种是setup 标识,interface 标识是微软自己定义的,是已定的,setup 标识是驱动安装的时候设定的,是不定的。
2. 取得所有硬件的的句柄之后,需要的是枚举每一个硬件设备。
BOOL SetupDiEnumDeviceInfo(HDEVINFO DeviceInfoSet,DWORD MemberIndex,PSP_DEVINFO_DATA DeviceInfoData)
此函数第一个参数是SetupDiGetClassDevs返回的值作为输入。第二个参数硬件信息表的索引,第三个参数是输出一个指向SP_DEVINFO_DATA结构的指针。这个结构中包括该设备的interface guid以及设备实例的句柄。
3.
BOOL SetupDiGetDeviceRegistryProperty( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property,PDWORD PropertyRegDataType,PBYTE PropertyBuffer,DWORD PropertyBufferSize, PDWORD RequiredSize);
这个函数是获取特定设备信息的函数。第二个参数是SetupDiEnumDeviceInfo的输出值。
第三个参数有很多此时应赋值为SPDRP_HARDWAREID. PropertyBuffer是返回的数据。
4.
BOOL SetupDiGetDeviceInstanceId( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData,PTSTR DeviceInstanceId,DWORD DeviceInstanceIdSize,PDWORD RequiredSize);
这个函数是获取设备的具体信息,包括设备是存储设备的具体类型,以及设备的名称和设备的usb端口。此函数与3的函数同时使用,才能的到相应的数据。可以根据此字符串判断打印机以及打印机的型号以及端口号。更进一步可以在此函数后便再次调用3,把第三个参数设置成不同的值来获取更加具体的结果。不过有些数据是取不到的,应该调用CM_XXX系列的函数来获取。
附上具体代码一则:需要一些库以及头文件请自己添加:
HDEVINFO hdevinfo=NULL;
SP_DEVINFO_DATA device_data;
DWORD dwIdx = 0;
SP_DEVINFO_DATA sDevInfo;
sDevInfo.cbSize=sizeof(SP_DEVINFO_DATA);
DWORD dwRegType;
DWORD DataT;
LPTSTR buffer = (LPTSTR)LocalAlloc(LPTR,10000);
LPTSTR buffer1 = (LPTSTR)LocalAlloc(LPTR,1000);
DWORD buffersize = 0;
BOOL c;
HANDLE hand;
SP_DEVICE_INTERFACE_DATA spdid;
spdid.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);
SP_DEVICE_INTERFACE_DETAIL_DATA sdidd;
sdidd.cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SP_DEVINFO_DATA sDevInfo1;
sDevInfo1.cbSize=sizeof(SP_DEVINFO_DATA);
vector<CString> vector1;
vector<CString> vector2;
hdevinfo= SetupDiGetClassDevs(NULL,0,0,DIGCF_ALLCLASSES |DIGCF_PRESENT);
DWORD a= GetLastError();
while(SetupDiEnumDeviceInfo(hdevinfo, dwIdx++, &sDevInfo))
{
if(dwIdx==139)
{
dwIdx=139;
}
c= SetupDiGetDeviceRegistryProperty(hdevinfo,&sDevInfo,SPDRP_HARDWAREID ,&DataT,(PBYTE)buffer,buffersize,&buffersize);
c=SetupDiGetDeviceInstanceId(hdevinfo,&sDevInfo,buffer1,buffersize,&buffersize);
vector1.push_back((CString)buffer);
vector2.push_back((CString)buffer1);
if(c)
{
CString a(buffer1);
a=a.Left(a.Find(L"//"));
if(L"USBPRINT"==a)
{ ZeroMemory(buffer,10000);
c= SetupDiGetDeviceRegistryProperty(hdevinfo,&sDevInfo,SPDRP_DEVICEDESC,&DataT,(PBYTE)buffer,1000,&buffersize);
buffersize=GetLastError();
}
}
}
LocalFree(buffer);
LocalFree(buffer1);
相关文章推荐
- .Net中获取打印机的相关信息
- 获取所有打印机相关信息
- .Net中获取打印机的相关信息
- c#获取本机电脑相关信息
- C#获取电脑的相关信息
- c#获取本机电脑相关信息
- .Net中获取打印机的相关信息
- c#获取本机电脑相关信息
- c#获取本机电脑相关信息
- C#获取电脑的相关信息
- c#获取本机电脑相关信息
- c#获取本机电脑相关信息
- C#获取自己电脑相关设备信息
- Android获取手机相关信息
- Android中获取屏幕相关信息(屏幕大小,状态栏、标题栏高度)
- [Windwos Phone 7] 获取设备相关信息
- Java获取系统信息(cpu,内存,硬盘,进程等)的相关方法
- android 获取 imei号码 及相关信息
- JAVA获取JPEG文件Exif相关信息
- iphone中获取设备的相关信息