使用WndProc覆盖来检测USB何时连接或分离

本文关键字:何时 连接 分离 USB 检测 WndProc 覆盖 使用 | 更新日期: 2023-09-27 18:26:42

这个问题让我走到了现在的位置;WM_DEVICECHANGE';在当前上下文中不存在

但当正确的消息发生时,我在检测它们时遇到了问题,我不确定我使用的消息代码是否错误,或者我是否在其他地方犯了错误,但我只想知道如何使用重写方法来检测ONLY USB连接或分离,或者是否有更具结论性的文章可以明确地向我展示WM_DEVICECHANGE中的每个代码是什么?

    private const int WM_DEVICECHANGE = 0x0219;
    private const int DBT_DEVICEARRIVAL = 0x8000; // system detected a new device
    private const int DBT_DEVICEREMOVECOMPLETE = 0x8004; //device was removed
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    protected override void WndProc(ref Message m) {
        base.WndProc(ref m);
        switch (m.Msg) {
            case WM_DEVICECHANGE:
                if (m.WParam.ToInt64() == DBT_DEVICEARRIVAL)
                    MessageBox.Show("TEST");
                if (m.WParam.ToInt64() == DBT_DEVICEREMOVECOMPLETE)
                    MessageBox.Show("DETACHED");
                break;
        }
    }

我的问题是,如果我试图按照上面问题中的示例进行操作,我会得到一个错误"运算符'=='不能应用于'System.IntPtr'和'int'类型的操作数",但如果我将其保留为示例代码中所示,则它不会触发,因为WParam中的数字永远不会与DBT_DEVICEARIVAL或DBT_DEVICEREMOVECOMPLETE 中的数值匹配

使用WndProc覆盖来检测USB何时连接或分离

ToInt64()只会将地址(或句柄)作为整数返回。我相信你想检索存储在那里的值,在这种情况下,你会做

if(Marshal.ReadInt64(m.wParam) == DBT_DEVICEARRIVAL)
//and so on

Marshal位于System.Runtime.InteropServices命名空间中。

还要确保这是应该提取值的地方,即可以是高字或低字或其他什么,而不是所有的64/32位。