簡體   English   中英

有沒有辦法在 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等方法,您可以實現這些方法以實現所需的功能。 但是,我們需要注冊我們自己的服務處理程序,以便我們可以捕獲設備事件。 請注意,這將禁用除OnStart之外的所有回調,如OnStop ,它在我們告訴 Windows 使用我們的處理程序之前調用。

Windows API 函數是RegisterServiceCtrlHandlerEx ,它接受服務名稱和在收到消息時調用的回調函數。 我們將在我們服務的OnStart函數中調用它。 托管版本返回一個IntPtr ,它是一個service handle ,但我們已經有一個名為 ServiceHandle 的類的屬性,所以我們不需要保存它。

服務控制處理程序的簽名是這樣的:

隱藏復制代碼

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

現在,我們可以通過捕獲SERVICE_CONTROL_STOP事件來實現我們的“ OnStop ”回調,該事件在處理程序的“ control ”參數中接收。 但是,為了處理SERVICE_CONTROL_DEVICEEVENT ,我們需要做一些其他的事情。

在此處輸入鏈接描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM