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

时间:2013-08-06 18:17:30

标签: c# .net usb windows-messages

这个问题让我到了现在的The name 'WM_DEVICECHANGE' does not exist in the current context

但是在发生错误时检测到正确的消息时我遇到了问题,我不确定消息代码是否使用错误或者我是否在别处犯了错误,但我只是想知道如何使用被覆盖的消息只检测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_DEVICEARRIVAL或DBT_DEVICEREMOVECOMPLETE中的数字

1 个答案:

答案 0 :(得分:0)

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

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

Marshal位于System.Runtime.InteropServices名称空间。

还要确保该值应该从中拉出,即可能是高字或低字或其他东西,而不是所有64/32位。