基于win32的USB识别程序
来源:互联网 发布:淘宝宝贝被别人复制了 编辑:程序博客网 时间:2024/06/09 14:27
最近遇到客户提出插入我们公司加密锁产品,弹出指定锁内网址页面的需求,其中需要用到usb设别相关程序,对于我这样的VC小白来说,首先只能先搜资料了,废话不多说,直接上demo。
*消息= WM_DEVICECHANGE
*按钮= DBT_DEVNODES_CHANGED
* lParam = 0
*
*发送当configmg结束进程树一批。一些devnodes
*可能被添加或删除。这是被ring3人使用
*需要刷新任何devnode改变(如发生
*设备管理器)。人们应该使用特定于特定设备
* DBT_DEVICE *。
#include <tchar.h> #include <string> #include <iostream> #include <Windows.h> #include <dbt.h> /*------------------------------------------------------------------ FirstDriveFromMask( unitmask ) Description Finds the first valid drive letter from a mask of drive letters. The mask must be in the format bit 0 = A, bit 1 = B, bit 2 = C, and so on. A valid drive letter is defined when the corresponding bit is set to 1. Returns the first drive letter that was found. --------------------------------------------------------------------*/ char FirstDriveFromMask(ULONG unitmask) { char i; for (i = 0; i < 26; ++i) { if (unitmask & 0x1) break; unitmask = unitmask >> 1; } return(i + 'A'); } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam; PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; TCHAR szMsg[80]; char driveName; switch(uMsg) { case WM_DEVICECHANGE: switch(wParam ) { case DBT_DEVICEARRIVAL: driveName = FirstDriveFromMask(lpdbv->dbcv_unitmask); sprintf(szMsg, "USB Drive %c: has inserted.\n", driveName); printf("%s\r\n", szMsg); MessageBox(hWnd, szMsg, TEXT("WM_DEVICECHANGE"), MB_OK); break; case DBT_DEVICEREMOVECOMPLETE: driveName = FirstDriveFromMask(lpdbv->dbcv_unitmask); sprintf(szMsg, "USB Drive %c: has removed.\n", driveName); printf("%s\r\n", szMsg); MessageBox(hWnd, szMsg, TEXT("WM_DEVICECHANGE"), MB_OK ); break; default: ; } break; default: ; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { TCHAR szClassName[] = _T("MyApp"); WNDCLASS wndcls = {0}; wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndcls.hCursor = (HCURSOR)LoadCursor(NULL, IDC_ARROW); wndcls.hIcon = (HICON)LoadIcon(NULL, IDI_APPLICATION); wndcls.lpfnWndProc = WndProc; wndcls.lpszClassName = szClassName; if(!RegisterClass(&wndcls)) { printf("RegisterClass Failed!\r\n"); return 0; } HWND hWnd = CreateWindow(szClassName, szClassName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL); if(NULL == hWnd) { printf("CreateWindow Failed!\r\n"); return 0; } ShowWindow(hWnd, SW_HIDE); UpdateWindow(hWnd); MSG msg; while(GetMessage(&msg, NULL, NULL, NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }可是问题来了,这两个信号:DBT_DEVICEARRIVAL: DBT_DEVICEREMOVECOMPLETE: 只能分别对应U盘的插入和拔出,针对加密锁却无半点响应。抓耳挠腮不得其解情况下,直接插拔加密锁让它打印:switch(wParam )中的wParam,结果打印的数为0X0007,对应宏为:DBT_DEVNODES_CHANGED,找到对应解释为:/ *
*消息= WM_DEVICECHANGE
*按钮= DBT_DEVNODES_CHANGED
* lParam = 0
*
*发送当configmg结束进程树一批。一些devnodes
*可能被添加或删除。这是被ring3人使用
*需要刷新任何devnode改变(如发生
*设备管理器)。人们应该使用特定于特定设备
* DBT_DEVICE *。
* /
不太懂为何如此,也闹不清普通U盘和我们加密锁的关于USB驱动的实质区别,但是目前问题已经解决,至于原因如何,日后深究,先以此文记之,留作备忘。
0 0
- 基于win32的USB识别程序
- 基于win32创建的direct3d程序
- 一个基于win32的涂鸦程序
- 基于win32的涂鸦程序(2)
- 基于Win32框架的OpenGL程序
- 基于win32应用程序的电梯调度程序
- MFC之基于对话框的Win32程序
- 基于GTK的USB视频采集程序
- 基于GTK的USB视频采集程序
- 基于GTK的USB视频采集程序
- 《基于GTK的USB视频采集程序》
- 基于opencv的环心识别程序
- 无法识别的USB
- virtualbox的USB识别
- Pywinauto 基于Win32 程序的自动化功能测试工具
- 基于Win32的VTK多窗口程序创建
- 基于WIN32下写的map小程序
- 基于OpenSSL的服务器USB-key签发程序
- 401. Binary Watch
- JSP基础之web配置
- Life for experience !
- 常用牛人主页链接(计算机视觉、模式识别、机器学习相关方向)
- sql视图
- 基于win32的USB识别程序
- 【JAVA之容器】2.Collection
- C++ string类 用法总结
- unity3d 动态加载资源Resources.Load和AssetBundle
- 使用相对布局、线性布局,创建手机信息页面
- URl地址解析
- HTTP中Get与Post的区别
- Palindrome number
- python爬虫—安装