我在在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消息,谢谢,解决马上给分
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消息,谢谢,解决马上给分
对照DBT_DEVICEARRIVAL定义的地方,看看传了什么值
用mfc,可以在CMainFrame中响应WM_DEVICECHANGE的消息
具体如下:
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的子类;