资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 软件开发 >
Advertisement
文章正文

有关检测usb设备拔插的问题

类型:转载   责任编辑:asp.net   日期:2007/05/23


热门软件下载:


   

我在在win32直接编程模式下可以修改WnProc如下:加入#include   "dbt.h"添加  
  case   WM_DEVICECHANGE:  
          if   (wParam   ==   DBT_DEVICEARRIVAL)  
  {  
                                MessageBox(hWnd,"device   detect","Message",MB_OK);  
  }  
                          else   if   (wParam   ==   DBT_DEVICEREMOVECOMPLETE)  
  {  
                                  MessageBox(hWnd,"device   remove","Message",MB_OK);  
  }  
  break;  
  得到  
  LRESULT   CALLBACK   WndProc(HWND   hWnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)  
  {  
  int   wmId,   wmEvent;  
  PAINTSTRUCT   ps;  
  HDC   hdc;  
  TCHAR   szHello[MAX_LOADSTRING];  
  LoadString(hInst,   IDS_HELLO,   szHello,   MAX_LOADSTRING);  
   
  switch   (message)    
  {  
  case   WM_COMMAND:  
  wmId         =   LOWORD(wParam);    
  wmEvent   =   HIWORD(wParam);    
  //   Parse   the   menu   selections:  
  switch   (wmId)  
  {  
  case   IDM_ABOUT:  
        DialogBox(hInst,   (LPCTSTR)IDD_ABOUTBOX,   hWnd,   (DLGPROC)About);  
        break;  
  case   IDM_EXIT:  
        DestroyWindow(hWnd);  
        break;  
   
   
  default:  
        return   DefWindowProc(hWnd,   message,   wParam,   lParam);  
  }  
  break;  
  case   WM_PAINT:  
  hdc   =   BeginPaint(hWnd,   &ps);  
  //   TODO:   Add   any   drawing   code   here...  
  RECT   rt;  
  GetClientRect(hWnd,   &rt);  
  DrawText(hdc,   szHello,   strlen(szHello),   &rt,   DT_CENTER);  
  EndPaint(hWnd,   &ps);  
  break;  
  case   WM_DESTROY:  
  PostQuitMessage(0);  
  break;  
  case   WM_DEVICECHANGE:  
          if   (wParam   ==   DBT_DEVICEARRIVAL)  
  {  
                                MessageBox(hWnd,"device   detect","Message",MB_OK);  
  }  
                          else   if   (wParam   ==   DBT_DEVICEREMOVECOMPLETE)  
  {  
                                  MessageBox(hWnd,"device   remove","Message",MB_OK);  
  }  
  break;  
   
  default:  
  return   DefWindowProc(hWnd,   message,   wParam,   lParam);  
        }  
        return   0;  
  }  
  可以发现usb的拔插动作  
  但是我想用MFC   Wizard开发,WinMain和WinProc都隐藏在MFC框架里,没法访问到,搜索一翻后发现WinAPP有个PreTranslateMessage函数,于是实现该函数如下:  
   
  BOOL   CUsbtest1App::PreTranslateMessage(MSG*   pMsg)    
  {  
          if   (pMsg->message==WM_DEVICECHANGE)  
  {  
  MessageBox(NULL,"Device   Change","Message",MB_OK);  
  switch(pMsg->wParam)  
  {  
  case   DBT_DEVICEARRIVAL:  
  MessageBox(NULL,"Device   detected","Message",MB_OK);  
  break;  
  case   DBT_DEVICEREMOVECOMPLETE:  
  MessageBox(NULL,"Device   Removed","Message",MB_OK);  
  break;  
  }  
  }  
   
  return   CWinApp::PreTranslateMessage(pMsg);  
  }  
  奇怪的事情发生了,虽然还是可以检测到硬件改动即:  
  MessageBox(NULL,"Device   Change","Message",MB_OK);弹出了,  
  但是  
  MessageBox(NULL,"Device   detected","Message",MB_OK);  
  MessageBox(NULL,"Device   Removed","Message",MB_OK);  
  都没有弹出,请问这是什么原因呢?有什么办法可以解决吗?  
  或者是在其他时间里处理WM_DEVICECHANGE消息,谢谢,解决马上给分

网友回答:

发表者:zhangnanonnet

设备的删除代码(pMsg->wParam)应该是32772

发表者:flyelf

7就是DBT_DEVNODES_CHANGED  
  用mfc,可以在CMainFrame中响应WM_DEVICECHANGE的消息

发表者:yangng

重载   虚函数   CWnd   的DefWindowProc(UINT   message,   WPARAM   wParam,   LPARAM   lParam)  
  具体如下:  
  LRESULT   CxxxxDlg::DefWindowProc(UINT   message,   WPARAM   wParam,   LPARAM   lParam)    
  {  
  //   TODO:   Add   your   specialized   code   here   and/or   call   the   base   class  
  if(WM_DEVICECHANGE==message)  
  {  
  switch(wParam)   {  
  case   DBT_DEVICEARRIVAL:  
  MessageBox("设备消息--有新设备可以使用");  
  break;  
  case   DBT_DEVICEREMOVECOMPLETE:  
  MessageBox("设备消息--设备移开不能使用");  
  break;  
  default:  
  break;  
  }  
   
  }  
  return   CDialog::DefWindowProc(message,   wParam,   lParam);  
  }  
   
  CxxxxDlg   是CDialog的子类;


 

 
热门推荐笔记本: IBM笔记本
相关文章:
webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
©2007 popbb.net All Rights Reserved