我在在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消息,谢谢,解决马上给分

解决方案 »

  1.   

    trace pMsg->wParam
    对照DBT_DEVICEARRIVAL定义的地方,看看传了什么值
      

  2.   

    trace 到pMsg->wParam的值为7,DBT_DEVICEARRIVAL的值是多少?
      

  3.   

    第一种方法下能够捕捉到4个WM_DEVICECHANGE消息,其中有3个的pMsg->wParam的值是7,还有一个是32768,即DBT_DEVICEARRIVAL,但是PreTranslateMessage只捕捉到1个消息,而且pMsg->wParam的值是7,这是怎么回事啊?
      

  4.   

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

  5.   

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

  6.   

    WM_DEVICECHANGE消息我已经处理了,但是我想知道是拔除还是插入消息,关键是DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE这两个消息没法获得
      

  7.   

    重载 虚函数 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的子类;
      

  8.   

    多谢:),发现在CUsbtest1Dlg::WindowProc里也可以实现改代码