C#WPF ManagementObjectSearcher.Get()引发异常
我需要检测USB设备更改事件并更新对WPF窗口的更改。这是我的密码C#WPF ManagementObjectSearcher.Get()引发异常,c#,wpf,wmi,C#,Wpf,Wmi,我需要检测USB设备更改事件并更新对WPF窗口的更改。这是我的密码 public MainWindow() { InitializeComponent(); SourceInitialized += (sender, e) => { HwndSource source = PresentationSource.FromVisual(this) as HwndSource; sou
public MainWindow()
{
InitializeComponent();
SourceInitialized += (sender, e) =>
{
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
source.AddHook(WndProc);
};
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == 0x219) // Device Changed
{
UpdateSerialPortDict();
}
return IntPtr.Zero;
}
private void UpdateSerialPortDict()
{
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"^[\S\s]+\((COM([0-9])+)\)$");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity"))
{
foreach (ManagementObject obj in searcher.Get())
{
if ((string)obj["PNPClass"] == "Ports")
{
string key = obj["Name"] as string;
var mat = reg.Match(key);
if (mat.Success)
{
var val = mat.Groups[1].Value;
_comDictionary.Add(key, val);
}
}
}
}
}
调用
searcher.Get()
时,程序将崩溃。如果我使用一个按钮触发UpdateSerialPortDict(),它可以正常工作。但我会通过检测设备更改事件自动更新它。尝试使用dispatcher:
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == 0x219) // Device Changed
{
Dispatcher.BeginInvoke(new Action(() => UpdateSerialPortDict()),
System.Windows.Threading.DispatcherPriority.Background);
}
return IntPtr.Zero;
}
听着,顺便说一句,如果你没能抓住它,这就是代码崩溃的原因:托管调试助手'DisconnectedContext'消息=托管调试助手'DisconnectedContext':'转换到此RuntimeCallableWrapper的COM上下文0x14b4f08失败,错误如下:由于应用程序正在调度输入同步调用,无法进行传出调用。(来自HRESULT的异常:0x8001010D(RPC_E_CANTCALLOUT_ININPUTSYNCCALL))。这通常是因为创建此RuntimeCallableWrapper的COM上下文0x14b4f08已断开连接,或者它正忙于执行其他操作,无法处理上下文转换。不会使用代理为COM组件上的请求提供服务,并且将直接调用COM组件。这可能会导致损坏或数据丢失。为了避免这个问题,请确保所有COM上下文/单元/线程都保持活动状态,并可用于上下文转换,直到应用程序完全使用RuntimeCallableWrapper完成,该Wrapper表示存在于它们内部的COM组件。值得回答@jsanalytics,即使它是dup,但为什么?WndProc是否在另一个线程或searcher.Get()上运行?