[VC]关于控制台下接收WM_DEVICECHANGE消息

sunnysab 2012-11-24 06:01:21
vc编程检测u盘插入 - 下载频道 - CSDN.NET 下载了一个源码,是MFC的实例,可以用,为什么我把改成一个控制台程序就无法检测?(编译、运行正常)
网上的源码:
//编程识别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;
}
}
...全文
406 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wo2ltt1314 2013-12-23
  • 打赏
  • 举报
回复
楼主解决了吗,分享一下代码啊~~
sunnysab 2012-11-25
  • 打赏
  • 举报
回复
控制台窗口也算是窗口吧?
sunnysab 2012-11-25
  • 打赏
  • 举报
回复
不理解...............
sunnysab 2012-11-25
  • 打赏
  • 举报
回复
UP!!!!!!!!!!!!! 怎么用控制台实现呢?3楼的代码看不懂。
傻X 2012-11-24
  • 打赏
  • 举报
回复
首先,控制台是不会把消息转发到你的main函数里面的。所以的消息循环完全没用。 看看这个教程就懂如何修改了 如何在你的控制台程序里创建消息循环
yusheng628 2012-11-24
  • 打赏
  • 举报
回复
WM_DEVICECHANGE是对所有窗口发送的
sunnysab 2012-11-24
  • 打赏
  • 举报
回复
运行之后插入U盘没反应

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧