1

我一直在用 c# 开发一个应用程序,我想在插入 USB 大容量存储时进行一些验证。

问题是,在验证过程中,我想从消息队列中取出大容量存储的消息。

一个人告诉我,你不能在 C# 中做到这一点,而只能在 C 中使用汇编语言。

你们能帮我找到一个 C 库,我可以从 C# 中使用它来从操作系统消息队列中提取消息吗?

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";
        }

我已经这样做了,但它只是告诉你发生了什么。

我想关闭消息,以便操作系统不会知道与设备相邻,然后在验证通过时再次打开消息。

4

2 回答 2

2

不会发生的,伙计。当您收到 Win32WM_DEVICECHANGE消息时,该设备已经非常加载。内核已经意识到设备、加载的驱动程序,并且在这种情况下作为大容量存储设备,已经创建了一个卷。这就是所有(大部分)内核模式活动。然后 Win32(用户模式)将此消息广播到所有顶级窗口。您根本无法在 Win32 级别使用任何语言以及这种WM_DEVICECHANGE机制来执行此操作。

为此,您将不得不编写一个设备驱动程序。这些是用 C 编写的,在内核模式下运行,并且比简单的 C# 应用程序实现起来要复杂得多。我建议您寻找一些其他解决方案来完成您正在尝试做的事情。顺便说一句,这是……什么?

“否则它会丢弃消息,以便操作系统不会知道它”

对不起,但你完全没有抓住重点。WM_DEVICECHANGE操作系统(即 Win32 子系统)发送到所有顶层窗口。它只是一个通知,没有与此消息关联的控件。WM_DEVICECHANGE对您阻止访问设备的目标没有帮助。就像我说的,为此你需要一个设备驱动程序,很可能是一个文件系统过滤器驱动程序。您将向该驱动程序发送一个允许访问设备的 IOCTL(从用户模式)。

于 2012-05-24T15:05:30.750 回答
1

操作系统不依赖于WM_DEVICECHANGE了解设备,因此阻止消息不会做任何有用的事情。

您要求做的事情非常困难,因为必须加载操作系统驱动程序和文件系统才能访问设备并执行验证,但听起来您想阻止任何其他程序使用它。即使在内核中实现的防病毒软件也不会阻止设备在被扫描之前出现。

您可能会实现一个文件系统过滤器驱动程序,该驱动程序报告设备上没有文件,直到扫描完成,但这会严重混淆看到设备出现的软件,但文件直到稍后才可用。而且 C# 对于实现 Windows 驱动程序没有用处。甚至没有“要在 C# 中使用的 C 库”(我假设您的意思是 p/invoke)。C# 代码与内核内部的环境不兼容。

于 2012-05-24T15:04:33.283 回答