我想构建一个程序来检测是否插入了usb(或两个或更多)(并将所有内容复制到硬盘上的任何文件夹)
有任何想法吗?我有这个,
using System.Runtime.InteropServices;
Run Code Online (Sandbox Code Playgroud)
但这不是简单的方法(我相信).我想要一些简单的事情
我有另一个想法(如果(文件夹存在)然后复制) - 但可能有一个问题,我想要一个很好的解决方案.
可能还有一个名为SerialPort的工具; 我可以用吗?如果是这样,我该如何使用它?
如何在PC中获取所有驱动器.和每个驱动器的类型和每个的自由空间
即系统驱动器,CD驱动器,DVD驱动器,可拆卸,......等
如果系统附带新驱动器可能是笔式驱动器或外部硬盘.
如何在附件时检测到它们?
我无法获得以下用于检测 USB 设备插入的代码,以便在使用 Python 3.7 的 Windows 10(64 位)计算机上运行。
import win32serviceutil
import win32service
import win32event
import servicemanager
import win32gui
import win32gui_struct
struct = win32gui_struct.struct
pywintypes = win32gui_struct.pywintypes
import win32con
GUID_DEVINTERFACE_USB_DEVICE = "{A5DCBF10-6530-11D2-901F-00C04FB951ED}"
DBT_DEVICEARRIVAL = 0x8000
DBT_DEVICEREMOVECOMPLETE = 0x8004
import ctypes
#
# Cut-down clone of UnpackDEV_BROADCAST from win32gui_struct, to be
# used for monkey-patching said module with correct handling
# of the "name" param of DBT_DEVTYPE_DEVICEINTERFACE
#
def _UnpackDEV_BROADCAST (lparam):
if lparam == 0: return None
hdr_format = …Run Code Online (Sandbox Code Playgroud) 我在工作中需要挂钩 WPF 应用程序的 Windows 事件。我需要监听 USB 事件。我发现了分散且不完整的答案,因此我想在一个统一的位置记录我的方法。
我最初的问题发生在尝试复制此处的代码示例时:
/sf/answers/1360502111/
我能够挂钩 Windows 事件并接收设备通知,但它们非常通用,没有为我提供太多可用于我的应用程序的信息。
对该页面的进一步阅读使我在同一页面上得到了不同的答案,该答案直接挂接到窗口句柄中以监视事件:
https ://stackoverflow.com/a/620179/1683999
这个答案提供了链接: https:
//www.codeproject.com/Articles/3946/Trapping-windows-messages
通过按照 codeproject 教程进行一些修改以挂钩 WPF 的窗口句柄,我能够获取 WM_DEVICECHANGE 消息,但在解码 wParam 时,我只收到 DBT_DEVNODES_CHANGED,因为我没有注册监听 USB 事件。通过 Google 快速搜索,我找到了一篇旧的 MSDN 论坛帖子: https:
//social.msdn.microsoft.com/Forums/vstudio/en-US/983dc1ee-6208-4036-903f-3fd5674a1efb/registerdevicenotification-in-wpf ?forum =wpf
在这个帖子中,我找到了我正在寻找的答案。我没有注册 Window 来专门查找 USB 事件,因此我从 Windows 获取了通用事件代码。进一步的研究让我回到了 StackOverflow:
/sf/answers/1137213101/
最后的答案为我解决了这个难题。我提供了一些代码片段,概述了通过挂钩到 WPF 窗口然后创建一个注册该窗口以侦听 USB 事件的侦听器来侦听 Windows 事件所需的内容。
我需要跟踪C#应用程序中的USB插入和移除事件,因此我根据SO上的其他问题提出了以下想法。
我不能用这种方法
var drives = DriveInfo.GetDrives()
.Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable).ToList();
Run Code Online (Sandbox Code Playgroud)
因为当您需要区分已连接和已断开连接的设备时,这可能会带来很多麻烦(新设备的驱动器号和名称可以与先前缓存的驱动器号和名称相同)。
因此,我决定使用WMI解决此问题,但是我发现无法通过Win32_USBHub类获取指定USB设备的驱动器号。然后我以为我可以执行这样的另一个查询
foreach (ManagementObject device in new ManagementObjectSearcher(@"SELECT * FROM Win32_USBHub").Get())
{
string deviceID = (string)device.GetPropertyValue("DeviceID");
Console.WriteLine("{0}", deviceID);
string query = string.Format("SELECT * FROM Win32_LogicalDisk WHERE DeviceID='{0}'", deviceID);
foreach (ManagementObject o in new ManagementObjectSearcher(query).Get())
{
string name = (string)o.GetPropertyValue("Name");
Console.WriteLine("{0}", name);
}
Console.WriteLine("==================================");
}
Run Code Online (Sandbox Code Playgroud)
但它根本不起作用-每当我尝试执行与Win32_LogicalDisk表兼容的查询时,都会收到“无效查询”的异常。
为什么?我究竟做错了什么?我该如何解决?也许有更好的方法来解决这个问题?
提前致谢。