2010-03-15 15:13:13| 分类: 技术杂文 |字号 订阅
大道不过两三行,说穿一文不值.
本以为程序检测U盘的插入是多么困难的事呢.原来,如此的简单.MFC的一个消息映射就能搞定了.真是想不到.废话少说,切入正题.
首先,看到这么个东东
声明:
afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData );
实现:
BOOL CXXX::OnDeviceChange( UINT nEventType, DWORD dwData )
先看声明,明显是个消息响应函数,我找遍了整个应用程序也没有找到和它对应的消息宏映射,实在是太让人郁闷了.这..这不是挑战我对MFC的理解嘛.
拿出宝剑MSDN.小样,看你怎么跑!
MSDN如是说:
The framework calls this member function to notify an application or device driver of a change to the hardware configuration of a device or the computer框架调用这个函数来通知应用程序或者设备驱动程序设备硬件配置或者电脑的配置被改变了.
我靠,没有想到是框架在调用它!真没有料到,这么一个没有找到宏明宏映射的函数居然是精华所在!再一看还是CWnd的成员函数.真想打自己两耳光!CWnd看了N次,居然没有看到过它.!
但是….但是…打住!虽然是框架在调用,但也有要映射的.这是常识.总不能如此挑战我的常识吧?WM_PAINT也是系统调用,它就有宏映射!
我继续找.我找找找. ON_WM_DEVICECHANGE()看了N久终于看到它了.但是,我为什么在消息里没有看到过这个消息呢?先不管它,把它拿到小程序中测试再说.
对于消息,首先,它是系统调用,不用我操心.
其次,消息不外就那3个东东.声明,映射,实现.
再次,把这3样搬到任何MFC里都能响应!
所以,下面是摘出来的:
BEGIN_MESSAGE_MAP(OGrgFrmRepair, CDialog)
//{{AFX_MSG_MAP(OGrgFrmRepair)
//}}AFX_MSG_MAP
ON_WM_DEVICECHANGE()//这是精华
END_MESSAGE_MAP()
BOOL OGrgFrmRepair::OnDeviceChange(UINT nEventType, DWORD dwData)
{
//这里可以自由发挥的,能检测U盘或者其它硬件的状态,关键也就是那个ON_WM_DEVICECHANGE消息.只要根据nEventType的值不同就可以判断不同的状态.这个消息对应这个处理函数所以在这里可以做自己想做的事.呵呵…具体还是看MSDN吧.上面比我说的清楚多了.
if( nEventType == DBT_DEVICEREMOVECOMPLETE )
{
//Do something
}
对于下面这个值的说法,MSDN如是说: A device has been inserted and is now available(一个设备插入并且现在可用)这…这说的不就是U盘吗?
if( nEventType == DBT_DEVICEARRIVAL )
{
//Do something
}
}
afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData );
经测试证明,就是它在检测U盘的状态.具体MSDN上有说明,以OnDeviceChange作关键字就能找到.
但是很奇怪的是,为什么没有这个消息响应来正向完成这个消息机制.?是MSDN改正了还是就是没有公开的?等待答案的揭晓.
网络上的答案:
它是一个被隐藏了的Windows消息,在ClassWizard里面根本看不到它!
MS太不厚道了!