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

用于C#从操作系统队列中删除消息的C库,c#,c,C#,C,我一直在用c#开发一个应用程序,我想在插入USB大容量存储器时进行一些验证 问题是,在验证过程中,我想从消息队列中取出大容量存储的消息 一个家伙告诉我,你不能用C语言做这件事,只能用C语言用汇编语言 你们能帮我找到一个C库,我可以用它从C#中提取操作系统消息队列中的消息吗 protected override void WndProc(ref Message m) { switch (m.Msg) {

我一直在用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";
        }
我已经这么做了,但它只是告诉你发生了什么


我想删除该消息,这样操作系统就不会知道该设备,然后在验证有效的情况下再次打开该消息。

操作系统不依赖于
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,这样操作系统就不会知道消息了…(所有这些都是在窗口服务中完成的…)