鼠标类驱动mouclass 与人机工程鼠标接口类驱动 hidclass 之间是什么关系

在对话框上创建了两个属性页,这两个属性页之间怎么通讯 - VC/MFC当前位置:& &&&在对话框上创建了两个属性页,这两个属性页之间怎么在对话框上创建了两个属性页,这两个属性页之间怎么通讯&&网友分享于:&&浏览:19次在对话框上创建了两个属性页,这两个属性页之间如何通讯?主对话框 CTabDlg.h#include &Pag1.h&#include &Pag2.h& &CPag1 m_Page1D &CPag2 m_Page2D主对话框 CTabDlg.cppBOOL CTabDlg::OnInitDialog(){... m_Page1Dlg.Create(IDD_PAG1_DIALOG, this); &
m_Page2Dlg.Create(IDD_PAG2_DIALOG, this); &
CRect rcD &
GetDlgItem(IDC_DLG_AREA)-&GetWindowRect(rcDlgs); &
ScreenToClient(rcDlgs); &
rcDlgs.top = 50; &
rcDlgs.left = 350; &
rcDlgs.bottom = rect.bottom -50;
rcDlgs.right = 775; &
m_Page1Dlg.MoveWindow(rcDlgs);
//第1个属性页 &
m_Page1Dlg.ShowWindow(SW_SHOW);&
rcDlgs.top = 50; &
rcDlgs.left = 780;
rcDlgs.bottom = rect.bottom -50;
//第2个属性页 &
rcDlgs.right = rect.right-60; &
m_Page2Dlg.MoveWindow(rcDlgs); &
m_Page2Dlg.ShowWindow(SW_SHOW); &
////两个属性页都显示出来了,class CPag1 : public CPropertyPage{ &
DECLARE_DYNCREATE(CPag2)class CPag2 : public CPropertyPage{ &
DECLARE_DYNCREATE(CPag2)public: &
void SetData(CString str) &
m_Edit1.SetWindowText(str); &
CPag2上有个m_Edit1& 现在CPag1, 与CPage2两个属性页之间通信在CPag1.cpp &
CTabDlg* MainDlg=(CTabDlg*) GetParent()-&GetParent(); //获取主对话窗 指针 &
框CPag2* View2=(CPag2*) MainDlg-&GetParent();
//在主对话窗获取属性2指针 &
View2-&SetData(&发送成功.&);
// 调用CPag2的函数SetData()将数据传给CPag2属性页但执行有问题,不成功啥问题呀?????------解决方案--------------------MainDlg-&GetParent(); 主对话框的父窗口怎么会是属性页呢
------解决方案--------------------
CTabDlg* MainDlg=(CTabDlg*) GetParent()-&GetParent(); //获取主对话窗 指针主对话框里有成员m_Page1Dlg和 m_Page2Dlg直接 MainDlg-&m_Page1Dlg....操作就可以了
------解决方案--------------------
通过该他们公共的父窗口来中转即可
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有标 题: 【原创】我写的模拟挂
作 者: asrn
时 间: 2013-05-07,23:32:09
链 接: http:///showthread.php?t=171203
发出来,一为抛砖引玉,论坛应该也有很多xd想写外挂,可以参考下;二来想出去找份工作,本人年近30岁,而且还没有编码的工作经验,没有信心,希望大家能给点意见。。
驱动最初参考了http:///showthread.php?t=101653
中的代码,因为是根据特征码搜索,不爽,后面又根据寒江独钓中的代码作了修改(这里要澄清下,不是为寒江独钓打广告,反而我觉得那书写得不清不楚的)。
原理:通过直接调用Kbdclass的回调函数KeyboardClassServiceCallback直接给上层发送键盘驱动,就可以实现模拟键盘操作,鼠标类似。
通过windbg查看类设备下面的端口设备(i8042prt)或usb设备(kbdhid),其设备对象中的DeviceExtension里面保存了设备对象与KeyboardClassServiceCallback回调函数,设备对象保存在回调函数前面一个地址中。
这个是驱动扩展结构,用来保存查找到的设备对象和回调函数,避免直接使用全局变量
typedef struct _DEVICE_EXTENSION {
PDEVICE_OBJECT
kbdDeviceO
//键盘类设备对象
PDEVICE_OBJECT
mouDeviceO
//鼠标类设备对象
MY_KEYBOARDCALLBACK
//KeyboardClassServiceCallback函数
MY_MOUSECALLBACK
//MouseClassServiceCallback函数
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
下面是查找KeyboardClassServiceCallback的关键函数,鼠标设备查找方法类似,我合成了一个函数
NTSTATUS GetKmclassInfo(PDEVICE_OBJECT DeviceObject, USHORT Index)
UNICODE_STRING
kmhidName, kmclassName, kmN
TargetDeviceO
TargetclassC
PDEVICE_EXTENSION
PDRIVER_OBJECT
kmDriverObject
PDRIVER_OBJECT
kmclassDriverObject
deviceExtension = (PDEVICE_EXTENSION)DeviceObject-&DeviceE
switch(Index)
case KEYBOARD_DEVICE:
= L"\\Driver\\kbdhid";
kmclassName
= L"\\Driver\\kbdclass";
TargetDeviceObject
= (PVOID*)&(deviceExtension-&kbdDeviceObject);
TargetclassCallback = (PVOID*)&(deviceExtension-&My_KbdCallback);
case MOUSE_DEVICE:
= L"\\Driver\\mouhid";
kmclassName
= L"\\Driver\\mouclass";
TargetDeviceObject
= (PVOID*)&(deviceExtension-&mouDeviceObject);
TargetclassCallback = (PVOID*)&(deviceExtension-&My_MouCallback);
return STATUS_INVALID_PARAMETER;
// 通过USB类设备获取驱动对象
RtlInitUnicodeString(&ObjectName, kmhidName);
status = ObReferenceObjectByName(&ObjectName,
OBJ_CASE_INSENSITIVE,
FILE_READ_ACCESS,
*IoDriverObjectType,
KernelMode,
(PVOID*)&kmDriverObject);
if(!NT_SUCCESS(status))
// 通过i8042prt获取驱动对象
RtlInitUnicodeString(&ObjectName, L"\\Driver\\i8042prt");
status = ObReferenceObjectByName(&ObjectName,
OBJ_CASE_INSENSITIVE,
FILE_READ_ACCESS,
*IoDriverObjectType,
KernelMode,
(PVOID*)&kmDriverObject);
if(!NT_SUCCESS(status))
KdPrint(("Couldn't Get the i8042prt Driver Object\n"));
// 通过kmclass获取键盘鼠标类驱动对象
RtlInitUnicodeString(&ObjectName, kmclassName);
status = ObReferenceObjectByName(&ObjectName,
OBJ_CASE_INSENSITIVE,
FILE_READ_ACCESS,
*IoDriverObjectType,
KernelMode,
(PVOID*)&kmclassDriverObject);
if(!NT_SUCCESS(status))
KdPrint(("Couldn't Get the kmclass Driver Object\n"));
kmDriverStart = kmclassDriverObject-&DriverS
kmDriverSize
= kmclassDriverObject-&DriverS
DeviceExtensionS
PDEVICE_OBJECT
kmTempDeviceO
PDEVICE_OBJECT
kmclassDeviceO
PDEVICE_OBJECT
kmDeviceObject = kmDriverObject-&DeviceO
while (kmDeviceObject)
kmTempDeviceObject = kmDeviceO
while (kmTempDeviceObject)
kmDeviceExtension
= (PULONG)kmTempDeviceObject-&DeviceE
kmclassDeviceObject = kmclassDriverObject-&DeviceO
DeviceExtensionSize = ((ULONG)kmTempDeviceObject-&DeviceObjectExtension - (ULONG)kmTempDeviceObject-&DeviceExtension) / 4;
while (kmclassDeviceObject)
for (ULONG i = 0; i & DeviceExtensionS i++)
if (kmDeviceExtension[i] == (ULONG)kmclassDeviceObject &&
kmDeviceExtension[i + 1] & (ULONG)kmDriverStart
kmDeviceExtension[i + 1] & (ULONG)kmDriverStart + kmDriverSize)
// 将获取到的设备对象保存到自定义扩展设备结构
*TargetDeviceObject
= (PVOID)kmDeviceExtension[i];
*TargetclassCallback = (PVOID)kmDeviceExtension[i + 1];
KdPrint(("%SDeviceObject == 0x%x\n", kmName, kmDeviceExtension[i]));
KdPrint(("%SClassServiceCallback == 0x%x\n", kmName, kmDeviceExtension[i + 1]));
return STATUS_SUCCESS;
kmclassDeviceObject = kmclassDeviceObject-&NextD
kmTempDeviceObject = kmTempDeviceObject-&AttachedD
kmDeviceObject = kmDeviceObject-&NextD
return STATUS_UNSUCCESSFUL;
应用层模拟键盘操作函数
BOOL KeyboardButton(USHORT VirtualKey, USHORT Flags)
KEYBOARD_INPUT_DATA
HANDLE hDevice = CreateFile(KEYMOUSE_WIN32_DEVICE_NAME, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
return FALSE;
memset(&kid, 0, sizeof(KEYBOARD_INPUT_DATA));
kid.MakeCode = (USHORT)MapVirtualKey(VirtualKey, 0);
BOOL bRet = DeviceIoControl(hDevice, IOCTL_KEYBOARD, &kid, sizeof(KEYBOARD_INPUT_DATA), NULL, 0, &dwOutput, NULL);
if (!bRet)
TRACE(_T("Error! please open the simulate kmclass driver!\n"));
CloseHandle(hDevice);
模拟鼠标的函数
BOOL MouseMove(LONG dx, LONG dy, USHORT Flags)
MOUSE_INPUT_DATA
HANDLE hDevice = CreateFile(KEYMOUSE_WIN32_DEVICE_NAME, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDevice == INVALID_HANDLE_VALUE)
return FALSE;
memset(&mid, 0, sizeof(MOUSE_INPUT_DATA));
mid.Flags = F
switch (mid.Flags)
case MOUSE_MOVE_RELATIVE:
mid.LastX =
mid.LastY =
case MOUSE_MOVE_ABSOLUTE:
mid.LastX = dx * 0xffff / GetSystemMetrics(SM_CXSCREEN);
mid.LastY = dy * 0xffff / GetSystemMetrics(SM_CYSCREEN);
TRACE(_T("Flags: Parameter error!\n"));
return FALSE;
BOOL bRet = DeviceIoControl(hDevice, IOCTL_MOUSE, &mid, sizeof(MOUSE_INPUT_DATA), NULL, 0, &dwOutput, NULL);
if (!bRet)
TRACE(_T("Error! please start the kmclass driver!\n"));
CloseHandle(hDevice);
另外一个是前台窗口找图的实现
class Cbm {
BITMAPFILEHEADER
// 位图文件头
BITMAPINFOHEADER
// 位图信息头
// 位图像素位指针
// 位图每行所用字节总数
// 位图水平像素宽度
// 位图垂直像素高度
void SetcBits() {cBits = ((cxDib * bmih.biBitCount + 31) & ~31) && 3;}
void SetcxDib() {cxDib = bmih.biW}
void SetcyDib() {cyDib = bmih.biH}
// 通过窗口图像获取位图信息
Cbm::Cbm(HWND hwndScreen)
hdc, hdcMem, hdcS
HBITMAP hB
if (!hwndScreen)
memset(&rect, 0, sizeof(RECT));
rect.right
= GetSystemMetrics(SM_CXSCREEN);
rect.bottom
= GetSystemMetrics(SM_CYSCREEN);
GetClientRect(hwndScreen, &rect);
//获得截图窗口的范围大小
= GetDC(NULL);
= CreateCompatibleDC(hdc);
hBitmap = CreateCompatibleBitmap(hdc, rect.right - rect.left, rect.bottom - rect.top);
SelectObject(hdcMem, hBitmap);
= GetDC(hwndScreen);
BitBlt(hdcMem, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hdcScreen, 0, 0, SRCCOPY);
DeleteDC(hdcMem);
ReleaseDC(hwndScreen, hdcScreen);
//初始化信息头bmi结构
memset(&bmih, 0, sizeof(BITMAPINFOHEADER));
bmih.biSize
= sizeof(BITMAPINFOHEADER);
bmih.biWidth
= rect.right - rect.
bmih.biHeight
= rect.bottom - rect.
bmih.biBitCount
bmih.biCompression = BI_RGB;
bmih.biPlanes
SetcxDib();
SetcyDib();
SetcBits();
//获取pBits的值
pBits = new BYTE [cBits * cyDib];
GetDIBits(hdc, hBitmap, 0, cyDib, pBits, (LPBITMAPINFO)&bmih, DIB_RGB_COLORS);
//初始化文件头bmfh
bmfh.bfType
bmfh.bfSize
= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + cBits * cyD
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits
= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
ReleaseDC(NULL, hdc);
DeleteObject(hBitmap);
// 通过加载文件获取位图信息
Cbm::Cbm(PCTSTR FilePath)
HANDLE hFile = CreateFile(FilePath, GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile == INVALID_HANDLE_VALUE)
pBits = NULL;
TRACE(_T("read file failed. FileName: %s\n"), FilePath);
DWORD dwBytesR
if ( !(ReadFile(hFile, &bmfh, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL) &&
ReadFile(hFile, &bmih, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL) &&
bmfh.bfType == 0x4D42) )
pBits = NULL;
TRACE(_T("read file failed. FileName: %s\n"), FilePath);
CloseHandle(hFile);
SetcxDib();
SetcyDib();
SetcBits();
pBits = new BYTE [cBits * cyDib];
if (!ReadFile(hFile, pBits, cBits * cyDib, &dwBytesRead, NULL))
delete [] pB
pBits = NULL;
TRACE(_T("read file failed. FileName: %s\n"), FilePath);
CloseHandle(hFile);
// 保存位图到文件
BOOL Cbm::SaveBitmapToFile(PCTSTR FileName, LPCRECT pRect) const
ASSERT(pBits);
TCHAR FilePath[MAX_PATH], DefaultFileName[MAX_PATH];
//创建以系统时间命名的bmp文件
SYSTEMTIME
GetLocalTime(&time);
wsprintf(DefaultFileName, _T("%04u%02u%02u%02u%02u%02u%03u.bmp"),
time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds);
//修正保存路径,默认保存至当前程序目录Screen文件夹
if (!FileName)
wsprintf(FilePath, _T("%s\\%s"), _T("screen"), DefaultFileName);
if (FileName[1] == ':')
_tcscpy_s(FilePath, FileName);
wsprintf(FilePath, _T("%s\\%s"), _T("screen"), FileName);
if (FileName[lstrlen(FileName) - 1] == '\\' || FileName[lstrlen(FileName) - 1] == '/')
_tcscat_s(FilePath, MAX_PATH, DefaultFileName);
// 判断文件路径是否有效,无效则创建路径中没有的文件夹
if (!PathIsDirectory(FilePath))
CreateFolder(FilePath);
//保存数据
HANDLE hFile = CreateFile(FilePath, GENERIC_WRITE, 0 ,NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;
DWORD dwBytesW
Cbm bmFile(*this, pRect);
BOOL bSuccess = WriteFile(hFile, &bmFile.bmfh, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL) &&
WriteFile(hFile, &bmFile.bmih, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL) &&
WriteFile(hFile, bmFile.pBits, bmFile.cBits * bmFile.cyDib, &dwBytesWritten, NULL);
CloseHandle(hFile);
if (!bSuccess)
DeleteFile(FilePath);
BOOL FindPic(const Cbm & bmWnd, const Cbm & bmFile, LPCRECT rectTarget, OUT PRECT retRect, int resemble, COLORREF rgb)
if (!(bmFile.pBits && bmWnd.pBits) || bmFile.cxDib & bmWnd.cxDib || bmFile.cyDib & bmWnd.cyDib)
return FALSE;
resemble = max(resemble, 0);
resemble = min(resemble, 100);
BYTE r = GetRValue(rgb);
BYTE g = GetGValue(rgb);
BYTE b = GetBValue(rgb);
// 实际范围
RECT rectD
if (rectTarget && bmWnd.IsInRect(*rectTarget))
rectDefault = *rectT
bmWnd.GetBitmapRect(rectDefault);
// bmFile图像坐标(x, y),
bmWnd图像坐标(x + xOffset, y + yOffset)
int yTotal
rectDefault.bottom - bmFile.cyD
int xTotal
rectDefault.right - bmFile.cxD
int invalidTotal
(100 - resemble) * (bmFile.cxDib * bmFile.cyDib);
int validTotal
resemble * (bmFile.cxDib * bmFile.cyDib);
ignoreNum忽略值, validNum有效值,invalidNum无效值
int invalidNum = 0, validNum = 0,
ignoreNum = 0;
for (int yOffset = rectDefault. yOffset &= yT yOffset++)
for (int xOffset = rectDefault. xOffset &= xT xOffset++)
for (int y = 0, bflag = TRUE; bflag && (y & bmFile.cyDib); y++)
for (int x = 0; x & bmFile.cxD x++)
int FileIndex = (bmFile.cyDib - 1 - y) * bmFile.cBits + 3 *
int WndIndex
= (bmWnd.cyDib - 1 - yOffset - y) * bmWnd.cBits + 3 * (xOffset + x);
== bmFile.pBits[FileIndex + 2] &&
== bmFile.pBits[FileIndex + 1] &&
== bmFile.pBits[FileIndex]
0xF8 != bmWnd.pBits[WndIndex + 2]
0xFC != bmWnd.pBits[WndIndex + 1]
0xF8 != bmWnd.pBits[WndIndex]) {
ignoreNum++;
else if (bmFile.pBits[FileIndex + 2] == bmWnd.pBits[WndIndex + 2] &&
bmFile.pBits[FileIndex + 1] == bmWnd.pBits[WndIndex + 1] &&
bmFile.pBits[FileIndex] == bmWnd.pBits[WndIndex]) {
validNum++;
invalidNum++;
if (100 * invalidNum & invalidTotal)
invalidNum = validNum = ignoreNum = 0;
bflag = FALSE;
if (100 * (validNum + ignoreNum) &= validTotal)
if (retRect)
retRect-&left
retRect-&top
retRect-&right
= xOffset + bmFile.cxD
retRect-&bottom = yOffset + bmFile.cyD
return TRUE;
return FALSE;
多图查找函数
BOOL FindSomePic(const Cbm & bmWnd, PCTSTR FileName, LPCRECT rectTarget, PRECT retRect, PTSTR retFileName, int resemble, COLORREF rgb)
WIN32_FIND_DATA fD
bFind = FALSE;
TCHAR FilePath[MAX_PATH];
TCHAR FileDir[MAX_PATH];
_tcscpy_s(FilePath, MAX_PATH, FileName);
_tcscpy_s(FileDir, MAX_PATH, FileName);
if (FileName[lstrlen(FileName) - 1] == '\\')
_tcscat_s(FilePath, MAX_PATH, _T("*.bmp"));
else if (_tcschr(FileName, '*'))
_tcsrchr(FileDir, '\\')[1] = '\0';
bFind = FindPic(bmWnd, FileName, rectTarget, retRect, resemble, rgb);
if (retFileName)
if (bFind)
_tcscpy_s(retFileName, MAX_PATH, FileName);
retFileName[0] = '\0';
HANDLE hFile = FindFirstFile(FilePath, &fData);
if (hFile == INVALID_HANDLE_VALUE)
TRACE(_T("FindSomePic --- read file failed.\n"));
return FALSE;
wsprintf(FilePath, _T("%s%s"), FileDir, fData.cFileName);
bFind = FindPic(bmWnd, FilePath, rectTarget, retRect, resemble, rgb);
}while (!bFind && FindNextFile(hFile, &fData));
FindClose(hFile);
if (retFileName)
if (bFind)
_tcscpy_s(retFileName, MAX_PATH, fData.cFileName);
retFileName[0] = '\0';
忘记说了,模拟鼠标移动需要关闭 控制面板-&鼠标-&指针选项-&提高指针精确度
整个项目是VS2008创建,驱动工程是通过visualddk的向导添加的。
驱动在XP、win7下测试通过
附件有完整项目的代码
阅读(...) 评论()是否需要编写驱动程序? (Windows Drivers)
是否需要编写驱动程序?
是否需要编写驱动程序?
Microsoft Windows 包含适用于许多设备类型的内置驱动程序。如果有适用于你的设备类型的内置驱动程序,则不必自行编写驱动程序。你的设备可以使用内置的驱动程序。
适用于 USB 设备的内置驱动程序
如果你的设备属于由 USB 设备工作组 (DWG) 定义的设备类,则可能已经存在适用于该设备的 Windows USB 类驱动程序。有关详细信息,请参阅。
适用于其他设备的内置驱动程序
目前,Microsoft 为以下其他类型的设备提供内置驱动程序:
设备技术和驱动程序内置驱动程序Windows 支持描述
ACPI:ACPI 驱动程序
Windows XP 及更高版本
Microsoft 通过 Acpi.sys 驱动程序和 ACPI BIOS,为基本的 ACPI 设备功能提供支持。为增强 ACPI 设备的功能,供应商可以提供 WDM 功能驱动程序。有关 Windows ACPI 支持的详细信息,请参阅 ACPI 设计指南中的。
音频:Microsoft 音频类驱动程序
PortCls.sys
Windows XP 及更高版本
Microsoft 通过自身的端口类驱动程序 (PortCl) 为基本的音频渲染和音频捕捉提供支持。音频设备的硬件供应商有责任提供兼容 PortCl 的适配器驱动程序。适配器驱动程序包括初始化代码、驱动程序管理代码(包括 DriverEntry 功能)和音频微型端口驱动程序的集合。 有关详细信息,请参阅。
总线:本机 SD 总线驱动程序、本机 SD 存储类驱动程序和存储微型端口驱动程序
sdbus.sys、sffdisk.sys、sffp_sd.sys
Windows Vista 及更高版本
Microsoft 为 SD 读卡器提供如下支持:操作系统为直接连接到 PCI 总线的 SD 主机控制器提供支持。 当系统枚举 SD 主机控制器时,会加载本机 SD 总线驱动程序 (sdbus.sys)。如果用户插入 SD 内存卡,则除总线驱动程序以外,Windows 还会加载本机 SD 存储类驱动程序 (sffdisk.sys) 和存储微型端口驱动程序 (sffp_sd.sys)。如果用户插入具有其他类型功能的 SD 卡(例如 GPS 或无线 LAN),则 Windows 会加载供应商为该设备提供的驱动程序。
HID:HID I2C 驱动程序
HIDI2C.sys
Windows 8 及更高版本
Microsoft 为支持简单外设总线 (SPB) 和通用 I/O (GPIO) 的 SoC 系统上的 HID over I2C 设备提供支持。它通过 HIDI2C.sys 驱动程序实现此支持。有关详细信息,请参阅 。
HID:传统游戏端口驱动程序
HidGame.sys、Gameenum.sys
Windows Vista
Windows Server 2003
Windows XP
在 Windows Vista 及更早版本中,Microsoft 通过 HidGame.sys 和 Gameenum.sys 驱动程序为传统(非 USB、非蓝牙、非 I2C)游戏端口提供支持。有关详细信息,请参阅 。
HID:传统键盘类驱动程序
Kbdclass.sys
Windows XP 及更高版本
Microsoft 通过 Kbdclass.sys 驱动程序为传统(非 USB、非蓝牙、非 I2C)键盘提供支持。有关详细信息,请参阅键盘和鼠标 HID 客户端驱动程序。为增强传统键盘的功能,供应商可以提供键盘筛选器驱动程序。有关详细信息,请参阅 。
HID:传统鼠标类驱动程序
Mouclass.sys
Windows XP 及更高版本
Microsoft 通过 Mouclass.sys 驱动程序为传统(非 USB、非蓝牙、非 I2C)鼠标提供支持。键盘和鼠标 HID 客户端驱动程序。为增强传统鼠标的功能,供应商可以提供鼠标筛选器驱动程序。有关详细信息,请参阅 。
HID:PS/2 (i8042prt) 驱动程序
I8042prt.sys
Windows XP 及更高版本
Microsoft 通过 I8042.sys 驱动程序为传统 PS/2 键盘和鼠标提供支持。为增强 PS/2 鼠标或键盘的功能,供应商可以提供键盘或鼠标筛选器驱动程序。有关详细信息,请参阅 MSDN 代码库中的 和 。
映像:设备的 Web 服务 (WSD) 扫描类驱动程序
WSDScan.sys
Windows Vista 及更高版本
Microsoft 通过 WSD 扫描驱动程序 (wsdscan.sys) 为 Web 服务扫描程序(即在 Web 上使用的扫描程序)提供支持。但是,支持 WSD 分布式扫描管理的 Web 服务扫描程序设备必须实现两个 Web 服务协议。有关详细信息,请参阅。
打印:Microsoft 绘图仪驱动程序
Windows XP 及更高版本
Microsoft 通过 Microsoft 绘图仪驱动程序 (Msplot) 为支持惠普图形语言的绘图仪提供支持。为增强绘图仪的功能,你可以创建由一个或多个绘图仪特性数据 (PCD) 文件组成的微型驱动程序。有关详细信息,请参阅。
打印:Microsoft PostScript 打印机驱动程序
Windows XP 及更高版本
Microsoft 通过 PostScript 打印机驱动程序 (Pscript) 为 PostScript 打印机提供支持。为增强 PostScript 打印机的功能,你可以创建由一个或多个 PostScript 打印机描述 (PPD) 文件和字体 (NTF) 文件组成的微型驱动程序。有关详细信息,请参阅 。
打印:Microsoft 通用打印机驱动程序
Windows XP 及更高版本
Microsoft 通过通用打印机驱动程序 (Unidrv) 为非 PostScript 打印机提供支持。为增强非 PostScript 打印机的功能,你可以创建由一个或多个通用打印机描述 (GPD) 文件组成的微型驱动程序。有关详细信息,请参阅 。
打印:Microsoft 第 4 版打印机驱动程序
Windows 8 及更高版本
从 Windows 8 开始,Microsoft 提供了支持 PostScript 和非 PostScript 打印机以及绘图仪的单个内置类驱动程序。该驱动程序可取代 Microsoft 绘图仪驱动程序、Microsoft 通用打印机驱动程序和 Microsoft PostScript 打印机驱动程序。该打印机驱动程序可通过自身提供基本的打印支持,无需任何修改。有关详细信息,请参阅。
打印:Microsoft XPS 打印机驱动程序
Windows Vista 及更高版本
Microsoft 通过 XPS 打印机驱动程序 (XPSDrv) 为打印 XPS 文档格式提供支持。该驱动程序扩展了 Microsoft 基于 GDI 的第 3 版打印机驱动程序体系结构,可支持消耗 XML 纸张规范 (XPS) 文档。通过 XPSDrv 打印机驱动程序,XPS 文档格式可用作后台打印文件格式和文档文件格式。该 XPSDrv 打印机驱动程序可通过自身提供基本的 XPS 打印支持,无需任何修改。有关详细信息,请参阅 。
传感器:传感器 HID 类驱动程序
SensorsHIDClassDriver.dll
Windows 8 及更高版本
Microsoft 通过 HID 类驱动程序为运动、活动以及其他类型的传感器提供支持。由于 Windows 8 包括此 HID 类驱动程序和相应的 HID I2C 及 HID USB 微型端口驱动程序,因此你不需要实现自己的驱动程序。你只需在传感器的固件中,报告此白皮书中所描述的使用方法。Windows 将使用你的固件及其 HID 驱动程序启用和初始化你的传感器,然后为相关 Windows API 提供访问该传感器的权限。
触摸:Windows 指针设备驱动程序
Windows 8 及更高版本
Microsoft 通过 HID 类驱动程序为笔和触摸设备提供支持。由于 Windows 8 包括此 HID 类驱动程序和相应的 HID I2C 及 HID USB 微型端口驱动程序,因此你不需要实现自己的驱动程序。你只需在指针设备的固件中报告此白皮书中描述的使用方法。Windows 将使用你的固件及其 HID 驱动程序启用设备的触摸和指针功能,并为 Windows 触摸和指针 API 提供访问该设备的权限。
WPD:媒体传输协议类驱动程序
WpdMtpDr.dll、WpdMtp.dll、WpdMtpUs.dll、WpdConns.dll 和 WpdUsb.sys
Windows Vista 及更高版本
Microsoft 通过媒体传输协议类驱动程序为需要连接 Windows 的便携设备(例如,音乐播放器、数字相机、手机和健康监控设备)提供支持。使用该类驱动程序的供应商必须在设备上实现 MTP 类协议。(对于静物数字相机,MTP 实现必须与 PTP 后向兼容。)有关详细信息,请参阅。
此页面有帮助吗?
更多反馈?
1500 个剩余字符
我们非常感谢您的反馈。
(C) Microsoft 2017

我要回帖

更多关于 人机识别鼠标 算法 的文章

 

随机推荐