如何获取SD卡插拔的消息

huhacn 2010-07-26 05:11:00
RT,如何监视SD卡插拔的消息,有大概的例子代码就可以,先谢谢了!
...全文
354 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
huhacn 2010-07-28
  • 打赏
  • 举报
回复
要监测SD卡,最好将hn = RequestDeviceNotifications(&guid, hQueue, TRUE);
改为RequestDeviceNotifications(&FATFS_MOUNT_GUID, hMsgQ, TRUE);
不然在下面会有两次storag card消息。结贴!
huhacn 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 huhacn 的回复:]
引用 7 楼 yuhuaijun 的回复:
C/C++ code


#include <Pnp.h>

//定义DEVDETAIL联合体,目的为了DEVDETAIL结构体的szName变量的长度
typedef union {
DEVDETAIL d;
char pad[sizeof(DEVDETAIL)+MAX_DEVCLASS_NAMELEN];
} MYDEV;

……
[/Quote]
sorry,已ok,没仔细看!
huhacn 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yuhuaijun 的回复:]
C/C++ code


#include <Pnp.h>

//定义DEVDETAIL联合体,目的为了DEVDETAIL结构体的szName变量的长度
typedef union {
DEVDETAIL d;
char pad[sizeof(DEVDETAIL)+MAX_DEVCLASS_NAMELEN];
} MYDEV;

//检测SD卡插拔状态的线程
UINT CR……
[/Quote]
呵呵,少了一个头文件:#include <msgqueue.h>,
另外FATFS_MOUNT_GUID: 当FAT文件系统被装载时触发,这个怎么用?
先谢!
chenzhp 2010-07-28
  • 打赏
  • 举报
回复
楼上的同学很详细呀
yuhuaijun 2010-07-28
  • 打赏
  • 举报
回复


#include <Pnp.h>

//定义DEVDETAIL联合体,目的为了DEVDETAIL结构体的szName变量的长度
typedef union {
DEVDETAIL d;
char pad[sizeof(DEVDETAIL)+MAX_DEVCLASS_NAMELEN];
} MYDEV;

//检测SD卡插拔状态的线程
UINT CRequestDeviceNotifications_TestDlg::SDCheckThread(LPVOID lpParam)
{
GUID guid = {0}; // or any known and relevant device interface GUID
HANDLE hQueue, hn;
MSGQUEUEOPTIONS msgopts;

msgopts.dwSize = sizeof(MSGQUEUEOPTIONS);
msgopts.dwFlags = 0;
msgopts.dwMaxMessages = 0;
msgopts.cbMaxMessage = sizeof(MYDEV);
msgopts.bReadAccess = TRUE;

//创建消息队列
hQueue = CreateMsgQueue(NULL, &msgopts);

if (hQueue == 0)
{
return 0;
}

//注册消息队列到设备管理器
hn = RequestDeviceNotifications(&guid, hQueue, TRUE);

MYDEV devDetail;
DWORD dwFlags;
DWORD dwSize;

for(;;)
{
//等待消息队列的返回
DWORD rel = ::WaitForSingleObject(hQueue, INFINITE);

if(rel == WAIT_OBJECT_0)
{
//读消息队列的数据,这里是读出很多消息的,因为有比较多的设备
while(::ReadMsgQueue(hQueue, &devDetail, sizeof(MYDEV), &dwSize, 0, &dwFlags) == TRUE)
{
//判断是否SD卡目录,这里可以增加其他判断,这样就可以变成检测其他设备
if(TEXT("\\SD Memory") == devDetail.d.szName)
{
wprintf(L"ReadMsgQueue %s\r\n",devDetail.d.szName);
}
}
}
}

return 0;
}

huhacn 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nbcool 的回复:]
这样做不好,这样写你完全分不出其他设备的拔插和SD卡拔插了。
SD卡有单独的方法监控文件系统消息,通过RequestDeviceNotifications 注册 FATFS_MOUNT_GUID 来获得拔插及映射文件夹名称,Window Media就是这么做的。
[/Quote]
大侠,给个sample?谢谢先
Joe-xXx 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nbcool 的回复:]

这样做不好,这样写你完全分不出其他设备的拔插和SD卡拔插了。
SD卡有单独的方法监控文件系统消息,通过RequestDeviceNotifications 注册 FATFS_MOUNT_GUID 来获得拔插及映射文件夹名称,Window Media就是这么做的。
[/Quote]

支持!
载舟之水 2010-07-26
  • 打赏
  • 举报
回复
这样做不好,这样写你完全分不出其他设备的拔插和SD卡拔插了。
SD卡有单独的方法监控文件系统消息,通过RequestDeviceNotifications 注册 FATFS_MOUNT_GUID 来获得拔插及映射文件夹名称,Window Media就是这么做的。
huhacn 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhaoshangshang 的回复:]
楼主这个确信吗,前一段时间还想获得存储卡的拔插消息的,下次尝试一下
[/Quote]
确信,自己下午测过的~
zhaoshangshang 2010-07-26
  • 打赏
  • 举报
回复
楼主这个确信吗,前一段时间还想获得存储卡的拔插消息的,下次尝试一下
huhacn 2010-07-26
  • 打赏
  • 举报
回复
以为要注册消息队列,其实只是wm_devicechange消息,#include "dbt.h"
case WM_DEVICECHANGE:
{
switch(wParam)
{
//插入SD卡
case DBT_DEVICEARRIVAL:
{
printf("插入SD卡\n");
}
break;
//拔出SD卡
case DBT_DEVICEREMOVECOMPLETE:
{
printf("拔出SD卡\n");
}
break;
}
default:
break;
}

7,657

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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