2,641
社区成员
发帖
与我相关
我的任务
分享
//编程识别u盘的插入,通过处理WM_DEVICECHANGE的消息,来达到识别的效果
//vc下编译通过,能够识别
#include <windows.h>
#include <stdio.h>
#include <dbt.h>
#include <tchar.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
CHAR FirstDriveFromMask (ULONG unitmask);
PCHAR ReadKey(CHAR Disk);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//windows窗口类的成员
char szClassName[] = "MainWClass";
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = ::LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szClassName;
wndclass.hIconSm = NULL;
::RegisterClassEx(&wndclass);
HWND hwnd = ::CreateWindowEx(
0,
szClassName,
"mc",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
UINT Cret = GetLastError();
//printf("%d\n",GetLastError());
if (hwnd == NULL)
{
::MessageBox(NULL,"Create Window error!","error",MB_OK);
return -1;
}
::ShowWindow(hwnd,nCmdShow);
::UpdateWindow(hwnd);
MSG msg;
while (::GetMessage(&msg,NULL,0,0))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
return msg.wParam;
}
//回调函数处理消息
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:/*初始化*/
MessageBox(hwnd, "go!", "405 Studio", MB_OK);
break;
case WM_DEVICECHANGE:
if(wParam == DBT_DEVICEARRIVAL) //设备激活
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
CHAR szMsg[80],Disk;
Disk = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
wsprintf (szMsg, "Drive %c: Media has arrived./n",Disk);
MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
CHAR temp[1024] ;
lstrcpy(temp,ReadKey(Disk));
//Sleep(1000);
::PostQuitMessage(0);
}
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
return 0;
}
//提取u盘的盘符
CHAR FirstDriveFromMask (ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
//读取u盘中的key.txt
PCHAR ReadKey(CHAR Disk)
{
CHAR KeyPath[20];
KeyPath[0] = '\\';
KeyPath[1] = '\\';
KeyPath[2] = '.';
KeyPath[3] = '\\';
KeyPath[4] = Disk;
KeyPath[5] = ':';
KeyPath[6] = '\\';
KeyPath[7] = '\\';
KeyPath[8] = 0;
lstrcat(KeyPath,"key.txt");
HANDLE hDevice = CreateFile(KeyPath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH,
0);
if (INVALID_HANDLE_VALUE == hDevice)
{
printf("CreateFile error! GetLastError() == %d\n", GetLastError());
return false;
}
PVOID pBuffer = new BYTE[1024];
DWORD dwBytesRead;
BOOL bResult;
bResult = ReadFile(hDevice, pBuffer, 1024, &dwBytesRead, NULL);
if (!bResult){
printf("ReadFile error! GetLastError() == %d\n", GetLastError());
printf("%d byte(s) have been read.\n", dwBytesRead);
return false;
}
CHAR Key[1024];
wsprintf (Key, "%s",pBuffer);
CloseHandle(hDevice);
return Key;
}
//由于源码不在身边,可能有东西打错了
#include <stdio.h>
#include <windows.h>
int main()
{
MSG msg;
while (::GetMessage(&msg,NULL,0,0))
{
switch (msg.message)
{
case WM_DEVICECHANGE:
if(msg.wParam == DBT_DEVICEARRIVAL) //设备激活
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg.lParam;
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
CHAR szMsg[80],Disk;
Disk = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
wsprintf (szMsg, "Drive %c: Media has arrived./n",Disk);
MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
//CHAR temp[1024] ;
//lstrcpy(temp,ReadKey(Disk));
//Sleep(1000);
::PostQuitMessage(0);
}
break;
}
}