用于 C# 的 C 库,用于从操作系统队列中删除消息

本文关键字:用于 队列 删除 消息 操作系统 | 更新日期: 2023-09-27 18:35:18

我一直在用 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";
        }

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

我想拉出消息,以便操作系统不会知道设备旁边,然后在验证验证后再次打开消息。

用于 C# 的 C 库,用于从操作系统队列中删除消息

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

为此,您必须编写设备驱动程序。这些是用 C 编写的,在内核模式下运行,并且比简单的 C# 应用程序更难实现。我建议您寻找其他解决方案来完成您正在尝试做的事情。顺便问一下,什么?

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

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

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

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

在扫描完成之前,你可以实现一个文件系统筛选器驱动程序,该驱动程序报告设备上没有文件,但这会严重混淆看到设备出现的软件,但文件直到以后才可用。 C#对于实现Windows驱动程序没有用。 甚至没有"在 C# 中使用的 C 库"(我假设你的意思是 p/invoke)。 C# 代码与内核中的环境不兼容。