C# 如何实现弹出U盘 30

实现点击button弹出U盘... 实现点击button弹出U盘 展开
 我来答
超人影视娱乐
高粉答主

2015-09-07 · 闲来无事的影评人-关注我把
超人影视娱乐
采纳数:7757 获赞数:60596

向TA提问 私信TA
展开全部
C# 实现弹出U盘代码:
ublic List<Device> Devices
{
get
{
if (_devices == null)
{
_devices = new List<Device>();
int index = 0;
while (true)
{
Native.SP_DEVICE_INTERFACE_DATA interfaceData = new Native.SP_DEVICE_INTERFACE_DATA();
interfaceData.cbSize = (UInt32)Marshal.SizeOf(interfaceData);

if (!Native.SetupDiEnumDeviceInterfaces(_deviceInfoSet, IntPtr.Zero, ref _classGuid, (UInt32)index, ref interfaceData))
{
int error = Marshal.GetLastWin32Error();
if (error != Native.ERROR_NO_MORE_ITEMS)
throw new Win32Exception(error);
break;
}
Native.SP_DEVINFO_DATA devData = new Native.SP_DEVINFO_DATA();
IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(devData));
Marshal.StructureToPtr(devData, p, true);
UInt32 size = 0;
if (!Native.SetupDiGetDeviceInterfaceDetail(_deviceInfoSet, ref interfaceData, IntPtr.Zero, 0, ref size, p))
{
int error = Marshal.GetLastWin32Error();
if (error != Native.ERROR_INSUFFICIENT_BUFFER)
throw new Win32Exception(error);
}
Native.SP_DEVICE_INTERFACE_DETAIL_DATA detailDataBuffer = new Native.SP_DEVICE_INTERFACE_DETAIL_DATA();
if (IntPtr.Size == 8) // for 64 bit operating systems
{
detailDataBuffer.cbSize = 8;
}
else
{
detailDataBuffer.cbSize = 4 + Marshal.SystemDefaultCharSize; // for 32 bit systems
}
IntPtr pBuf = Marshal.AllocHGlobal(Marshal.SizeOf(detailDataBuffer));

Marshal.StructureToPtr(detailDataBuffer, pBuf, true);

if (!Native.SetupDiGetDeviceInterfaceDetail(_deviceInfoSet, ref interfaceData, pBuf, size, ref size, p))
{
int error = Marshal.GetLastWin32Error();
if (error != Native.ERROR_INSUFFICIENT_BUFFER)
throw new Win32Exception(error);
}
devData = (Native.SP_DEVINFO_DATA)Marshal.PtrToStructure(p, typeof(Native.SP_DEVINFO_DATA));
Marshal.FreeHGlobal(p);
西三227
2010-06-20 · TA获得超过1168个赞
知道小有建树答主
回答量:473
采纳率:0%
帮助的人:342万
展开全部
这是CSDN上的一个帖子的内容,也许对你有帮助。
我已经利用网上搜索到的代码实现在软件中自动删除U盘,也就相当于在任务栏右端的图标上点击删除的效果。但是由于那个类不适应我写的程序,我只能查他的代码。最终锁定到一个API函数:
[DllImport("setupapi.dll", EntryPoint = "CM_Request_Device_Eject")]
internal static extern int CM_Request_Device_Eject_NoUi(
int dnDevInst,
IntPtr pVetoType,
StringBuilder pszVetoName,
int ulNameLength,
int ulFlags);

在这个函数的5个参数中,我仅仅关注第一个参数(剩下的解决了pVetoType=IntPtr.Zero, pszVetoName=null, ulNameLength=0, ulFlags=0)。我想知道第一个参数指的是什么。我去跟踪搜到的那个程序时发现dnDevInst指的可能是U盘的物理序列号,但是不确定。同时我想知道怎样获取这个数字(最好是WMI,因为盗用这段函数的代码是在一个遍历磁盘接口的基于wmi的循环之中)。请各位牛人帮忙看看。

以下是基于wmi的循环:
private void ScanUDisk()
{
while (true)
{
SelectQuery selectQuery = new SelectQuery("select * from win32_logicaldisk");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);
foreach (ManagementObject disk in searcher.Get())
{
if (disk["DriveType"].ToString() == "2")
{
CopyMain(disk["Name"].ToString()); //向U盘传送文件的函数
Thread.Sleep(500);
CM_Request_Device_Eject_NoUi(????, IntPtr.Zero, null, 0, 0);
}
}
}
}

从网上搜来的代码的链接在这里:
http://www.codeproject.com/KB/system/usbeject.aspx
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
depluin
2010-06-20 · TA获得超过3179个赞
知道大有可为答主
回答量:3378
采纳率:75%
帮助的人:2477万
展开全部
引用外部dll,向windows发送设备弹出消息
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式