用于C#从操作系统队列中删除消息的C库
我一直在用c#开发一个应用程序,我想在插入USB大容量存储器时进行一些验证 问题是,在验证过程中,我想从消息队列中取出大容量存储的消息 一个家伙告诉我,你不能用C语言做这件事,只能用C语言用汇编语言 你们能帮我找到一个C库,我可以用它从C#中提取操作系统消息队列中的消息吗用于C#从操作系统队列中删除消息的C库,c#,c,C#,C,我一直在用c#开发一个应用程序,我想在插入USB大容量存储器时进行一些验证 问题是,在验证过程中,我想从消息队列中取出大容量存储的消息 一个家伙告诉我,你不能用C语言做这件事,只能用C语言用汇编语言 你们能帮我找到一个C库,我可以用它从C#中提取操作系统消息队列中的消息吗 protected override void WndProc(ref Message m) { switch (m.Msg) {
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case Win32.WM_DEVICECHANGE:
//OnDeviceChange(ref m);
break;
}
base.WndProc(ref m);
}
void OnDeviceChange(ref Message msg)
{
int wParam = (int)msg.WParam;
if (wParam == Win32.DBT_DEVICEARRIVAL)
{
label1.Text = "Arrival";
//MessageBox.Show("" + wParam);
//msg = Message.Create(new IntPtr(),1,new IntPtr(),new IntPtr());
}
else if (wParam == Win32.DBT_DEVICEREMOVECOMPLETE) label1.Text =
"Remove";
}
我已经这么做了,但它只是告诉你发生了什么
我想删除该消息,这样操作系统就不会知道该设备,然后在验证有效的情况下再次打开该消息。操作系统不依赖于
WM\u DEVICECHANGE
来了解设备,因此阻止该消息不会有任何用处
您要求执行的操作非常困难,因为必须加载操作系统驱动程序和文件系统,才能访问设备并执行验证,但听起来您好像想阻止任何其他程序使用它。即使是在内核中实现的防病毒软件也不能阻止设备在扫描之前出现
您可能会实现一个文件系统筛选器驱动程序,该驱动程序会报告设备上没有文件,直到扫描完成,但这将严重混淆看到设备出现的软件,但这些文件直到稍后才可用。而C#对于实现Windows驱动程序没有用处。即使是“C库要在C#中使用”(我想你指的是p/invoke)。C代码与内核内部的环境不兼容。不会发生的,伙计。当您收到Win32
WM_DEVICECHANGE
消息时,设备已经加载了很多。内核已经意识到设备、加载的驱动程序,在本例中,作为大容量存储设备,已经创建了一个卷。这就是所有(大部分)内核模式活动。然后Win32(用户模式)将此消息广播到所有顶级窗口。在Win32级别,您根本无法用任何语言进行此操作,这是一种WM_DEVICECHANGE
机制
为此,您必须编写一个设备驱动程序。这些都是用C编写的,在内核模式下运行,实现起来比简单的C#app要复杂得多。我建议您寻找其他解决方案来完成您正在尝试的工作。这是。。。什么,顺便问一下
“否则它将丢弃该消息,以便操作系统不知道该消息”
对不起,你完全没有抓住要点
WM_DEVICECHANGE
从操作系统(即Win32子系统)发送到所有顶级窗口。这只是一个通知,没有与此消息关联的控件WM_DEVICECHANGE
对您阻止访问设备的目标没有帮助。正如我所说,为此您需要一个设备驱动程序,很可能是一个文件系统过滤器驱动程序。您将向该驱动程序发送一个IOCTL(从用户模式),允许访问该设备。我想做的是,当插入大容量存储设备时,如果密码正确,它会要求输入密码。。。它将消息转发给操作系统,否则它会对消息进行dicard,这样操作系统就不会知道消息了…(所有这些都是在窗口服务中完成的…)