0

这个问题让我到了现在的位置当前上下文中不存在名称“WM_DEVICECHANGE”

但我在检测正确消息时遇到问题,我不确定我使用的消息代码是否错误,或者我是否在其他地方犯了错误,但我只想知道如何使用覆盖的方法来检测只有 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 中的数字匹配

4

1 回答 1

0

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

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

Marshal 在System.Runtime.InteropServices命名空间中。

还要确保应该从中提取值,即可能是高位字或低位字或其他东西,而不是全部 64/32 位。

于 2013-08-06T18:36:04.950 回答