.net - 检测何时安装驱动器或更改状态(WPF 的 WM_DEVICECHANGE)?

标签 .net wpf

我正在为 WPF 编写一个目录选择器控件,我想在目录树中添加/删除一个驱动器,当它被安装或卸载时或者当它准备好或未准备好时(例如,用户插入或删除 CD ).我正在寻找类似于 WM_DEVICECHANGE 的系统事件。

康斯坦丁

最佳答案

即使您使用的是 WPF,您仍然可以拦截 WM_DEVICECHANGE。您可以使用 WPF 回调方法附加到现有的窗口过程,或者您可以使用 System.Windows.Forms.NativeWindow(我的首选方法,更容易控制,但您确实需要添加一个对 System.Windows.Forms.dll 的引用)

// in your window's code behind
private static int WM_DEVICECHANGE = 0x0219;

protected override void OnSourceInitialized(EventArgs e)
{
    WindowInteropHelper helper = new WindowInteropHelper(this);
    SystemEventIntercept intercept = new SystemEventIntercept(helper.Handle);
    base.OnSourceInitialized(e);
}

class SystemEventIntercept : System.Windows.Forms.NativeWindow
{
    public SystemEventIntercept(IntPtr handle)
    {
        this.AssignHandle(handle);
    }

    protected override void WndProc(ref Winforms.Message m)
    {
        if (m.Msg == WM_DEVICECHANGE)
        {
            // do something
        }

        base.WndProc(ref m);
    }
}

关于.net - 检测何时安装驱动器或更改状态(WPF 的 WM_DEVICECHANGE)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3772337/

相关文章:

c# - .net 4 及更高版本中的数组边界检查效率

.net - 从 JSON Schema 生成 C# 类

c# - 如何计算 ExpandoObject 的属性

wpf - 如何绑定(bind)到类型 Window 作为 DataTemplate

.net - 是否可以共享 DataTrigger?

c# - 中等信任共享环境上的 MySql Connectors 6.7.4

c# - 如何使用事件和委托(delegate)在表单之间发送数据?

c# - 为什么 GeometryDrawing 显示在带有裁剪坐标的 Canvas 上?

wpf - 如何仅覆盖自定义控件中的 ItemTemplate

c# - 如果两个文本框中的任何一个为空,则禁用按钮