C# I';我在使用系统时仍然收到空异常。管理层可以';我不明白为什么
这个异常并不是每次我试图让它再次发生时都会发生,只是在我一次又一次点击按钮启动观察器后,就像连续4-5次一样。。。然后关闭我的程序,出现异常 这是一个新的类,我正在使用管理。只有在我在新类中启动了watcher之后关闭程序时才会发生: 我试着试着接球,但没有一个停下来C# I';我在使用系统时仍然收到空异常。管理层可以';我不明白为什么,c#,.net,winforms,C#,.net,Winforms,这个异常并不是每次我试图让它再次发生时都会发生,只是在我一次又一次点击按钮启动观察器后,就像连续4-5次一样。。。然后关闭我的程序,出现异常 这是一个新的类,我正在使用管理。只有在我在新类中启动了watcher之后关闭程序时才会发生: 我试着试着接球,但没有一个停下来 using System; using System.Collections.Generic; using System.Text; using System.Management; using System.Diagnostic
using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace MinimizeCapture
{
class WatchForWindow
{
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
private const int SW_SHOWNORMAL = 1;
private const int SW_SHOWMINIMIZED = 2;
private const int SW_SHOWMAXIMIZED = 3;
private static ManagementEventWatcher watcher = null;
public static void StartWatching()
{
try
{
WqlEventQuery query = new WqlEventQuery("Select * From __InstanceCreationEvent Within 2 Where TargetInstance Isa 'Win32_Process'");
watcher = new ManagementEventWatcher(query);
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Start();
}
catch (Exception err)
{
string t = "err " + err.ToString();
}
}
public static void StopWatching()
{
try
{
if (watcher != null)
{
watcher.Stop();
}
}
catch (Exception err)
{
string t = "err " + err.ToString();
}
}
private static void watcher_EventArrived(object sender, EventArrivedEventArgs e)
{
try
{
ManagementBaseObject obj = (ManagementBaseObject)e.NewEvent["TargetInstance"];
string t = obj["Name"].ToString();
GetHWND(t);
}
catch (Exception err)
{
string t = "err " + err.ToString();
}
}
private static void GetHWND(string wName)
{
try
{
IntPtr hWnd = FindWindow("Chrome_WidgetWin_1 for Chrome", "Untitled - Notepad");
}
catch (Exception err)
{
string t = "err " + err.ToString();
}
}
}
}
这是我在这门课上唯一使用system.management的地方
昨天,我确信问题是当我关闭程序时,我需要关闭watcher,所以我在类中添加了一个名为StopWatching的方法
在表格1中,我是如何在课堂上启动观察者的:
private void buttonSnap_Click(object sender, EventArgs e)
{
WatchForWindow.StartWatching();
}
我就是这样阻止它的:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
WatchForWindow.StopWatching();
}
这是异常消息:
System.NullReferenceException was unhandled
Message=Object reference not set to an instance of an object.
Source=System.Management
StackTrace:
at System.Management.IWbemServices.CancelAsyncCall_(IWbemObjectSink pSink)
at System.Management.SinkForEventQuery.Cancel()
at System.Management.ManagementEventWatcher.Stop()
at System.Management.ManagementEventWatcher.Finalize()
InnerException:
这是我得到的带有异常消息的窗口:
System.NullReferenceException was unhandled
Message=Object reference not set to an instance of an object.
Source=System.Management
StackTrace:
at System.Management.IWbemServices.CancelAsyncCall_(IWbemObjectSink pSink)
at System.Management.SinkForEventQuery.Cancel()
at System.Management.ManagementEventWatcher.Stop()
at System.Management.ManagementEventWatcher.Finalize()
InnerException:
我还不知道什么东西有时会变空?为什么?以及如何解决这个问题
public static void StartWatching()
{
StopWatching(); //add this line
try
{
WqlEventQuery query = new WqlEventQuery("Select * From __InstanceCreationEvent Within 2 Where TargetInstance Isa 'Win32_Process'");
watcher = new ManagementEventWatcher(query);
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Start();
}
catch (Exception err)
{
string t = "err " + err.ToString();
}
}
出现问题的原因是您创建了多个EventWatcher,而没有清理旧的EventWatcher。如果您进行我建议的单行更改,您应该不会再有问题。您将无法轻松捕获此异常,因为它发生在ManagementEventWatcher的终结器中。在删除对对象的所有引用后,.NET垃圾收集器将调用此方法。您可以通过始终确保退出前已停止观察程序来避免此问题。出现此问题的原因是您没有干净地处理观察程序。在StartWatching()中,只需在第一行调用StopWatching()。