有没有办法在 C# 中捕获 windows 通知事件?

Is there a way to catch a windows notification event in c#?

你好,我正在尝试用 c# 构建一个程序,该程序在后台运行并在你收到 windows 中的通知(如邮件或电报消息)时激活,有没有办法捕获该事件?

Windows 服务只不过是一个由服务控制管理器 (SCM) 启动的 Windows 程序。可以手动启动服务或安排 SCM 在用户登录后立即启动服务。如果您不熟悉它们,可以在 MSDN 上获得更多信息。

我已经在 Visual Studio 2008 Professional SP1、.NET 3.5 SP1、Windows XP SP3 中测试了代码。它应该适用于 2.0 以上的任何框架,并且它可能适用于 1.1。我建议您在阅读文本时仔细阅读代码,因为它对您来说会变得更加清晰。

服务有一个控制处理程序,它接收来自 Windows 的所有消息。这些可能包括停止或暂停服务的代码,或者在我们的例子中,包括设备事件。托管服务将抽象此控制处理程序并只为您提供 OnStart, OnStop 等方法,您可以实施这些方法以实现所需的功能。然而,我们需要注册我们自己的服务处理程序,这样我们才能捕获设备事件。请注意,这将禁用所有回调,如 OnStop 除了 OnStart,它在我们告诉 Windows 使用我们的处理程序之前被调用。

Windows API 函数是 RegisterServiceCtrlHandlerEx,它接受一个服务名称和一个回调函数,以便在收到消息时调用。我们将在我们服务的 OnStart 函数中调用它。托管版本 returns 一个 IntPtr 是一个 service handle,但我们已经有一个 class 的 属性 称为 ServiceHandle,因此我们不需要保存它。

服务控制处理程序的签名是这样的:

隐藏复制代码

public delegate int ServiceControlHandlerEx(int control, 
                int eventType, IntPtr eventData, IntPtr context);

现在,我们可以通过捕获 SERVICE_CONTROL_STOP 事件来实现我们的“OnStop”回调,该事件在处理程序的“control”参数中接收。但是,为了处理 SERVICE_CONTROL_DEVICEEVENT,我们需要做一些其他事情。

enter link description here