• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    .NET實現可交互的WINDOWS服務的實例代碼

    來源:懂視網 責編:小采 時間:2020-11-27 22:41:35
    文檔

    .NET實現可交互的WINDOWS服務的實例代碼

    .NET實現可交互的WINDOWS服務的實例代碼: 這幾天想做個文件監控服務,看了一下網上的關于WINDOWS服務的文章,數量都不少,都只講了如何做一個最基本的服務,卻沒有講述如何與用戶進行交互。查看了MSDN,看一下關于服務的描述: Windows 服務應用程序在不同于登錄用戶的交互區域的窗口區域中運行。
    推薦度:
    導讀.NET實現可交互的WINDOWS服務的實例代碼: 這幾天想做個文件監控服務,看了一下網上的關于WINDOWS服務的文章,數量都不少,都只講了如何做一個最基本的服務,卻沒有講述如何與用戶進行交互。查看了MSDN,看一下關于服務的描述: Windows 服務應用程序在不同于登錄用戶的交互區域的窗口區域中運行。

      這幾天想做個文件監控服務,看了一下網上的關于WINDOWS服務的文章,數量都不少,都只講了如何做一個最基本的服務,卻沒有講述如何與用戶進行交互。查看了MSDN,看一下關于服務的描述:

       Windows 服務應用程序在不同于登錄用戶的交互區域的窗口區域中運行。窗口區域是包含剪貼板、一組全局原子和一組桌面對象的安全對象。由于 Windows 服務的區域不是交互區域,因此 Windows 服務應用程序中引發的對話框將是不可見的,并且可能導致程序停止響應。同樣,錯誤信息應記錄在 Windows 事件日志中,而不是在用戶界面中引發。

       .NET Framework 支持的 Windows 服務類不支持與交互區域(即登錄用戶)進行交互。同時,.NET Framework 不包含表示區域和桌面的類。如果 Windows 服務必須與其他區域進行交互,則需要訪問非托管的 Windows API。

      也就是說我們要實現可交互的服務(比如我們想給服務在運行時做一些參數設置等),那我們一定要using System.Runtime.InteropServices

      那么來看一下如果才能實現一個可交互的服務呢。步驟與實現基本的服務一樣(各位可自行參考MSDN或網上google一下).

      在實現OnStart時要注意,這里可不能彈出一個FORM什么的。這樣做是沒有任何反應的。我們可以在這個方法里運行一個線程。該線程需要訪問窗口區域對象或桌面對象,當然 framework里是沒有提供這些的,要訪問非托管代碼的。

      來看一下代碼,再運行試一下。

    代碼如下:
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.ServiceProcess;
    using System.Threading;
    using System.Runtime.InteropServices;
    namespace FileWatchService
    {
        publicclass Service1 : System.ServiceProcess.ServiceBase
        {
            ///
            /// 必需的設計器變量。
            ///
    private System.ComponentModel.Container components =null;
            Thread threadForm =null;
            public Service1()
            {
                // 該調用是 Windows.Forms 組件設計器所必需的。
                InitializeComponent();

                // TODO: 在 InitComponent 調用后添加任何初始化
            }

            #region 組件設計器生成的代碼
            ///
            /// 設計器支持所需的方法 - 不要使用代碼編輯器
            /// 修改此方法的內容。
            ///
    privatevoid InitializeComponent()
            {
                //
                // Service1
                //
    this.ServiceName ="JadeWatchService";

            }
            #endregion
            [STAThread]
            staticvoid Main()
            {
                System.ServiceProcess.ServiceBase.Run(new Service1());

            }
            ///
            /// 清理所有正在使用的資源。
            ///
    protectedoverridevoid Dispose(bool disposing)
            {
                if (disposing)
                {
                    if (components !=null)
                    {
                        components.Dispose();
                    }
                }
                base.Dispose(disposing);
            }

            ///
            /// 設置具體的操作,以便服務可以執行它的工作。
            ///
    protectedoverridevoid OnStart(string[] args)
            {
                threadForm =new Thread(new ThreadStart(FormShow));
                threadForm.Start();
            }

            ///
            /// 停止此服務。
            ///
    protectedoverridevoid OnStop()
            {
                if (threadForm !=null)
                {
                    if (threadForm.IsAlive)
                    {
                        threadForm.Abort();
                        threadForm =null;
                    }
                }
            }

            void FormShow()
            {

                GetDesktopWindow();
                IntPtr hwinstaSave = GetProcessWindowStation();
                IntPtr dwThreadId = GetCurrentThreadId();
                IntPtr hdeskSave = GetThreadDesktop(dwThreadId);
                IntPtr hwinstaUser = OpenWindowStation("WinSta0", false, 33554432);
                if (hwinstaUser == IntPtr.Zero)
                {
                    RpcRevertToSelf();
                    return;
                }
                SetProcessWindowStation(hwinstaUser);
                IntPtr hdeskUser = OpenDesktop("Default", 0, false, 33554432);
                RpcRevertToSelf();
                if (hdeskUser == IntPtr.Zero)
                {
                    SetProcessWindowStation(hwinstaSave);
                    CloseWindowStation(hwinstaUser);
                    return;
                }
                SetThreadDesktop(hdeskUser);

                IntPtr dwGuiThreadId = dwThreadId;

                Form1 f =new Form1(); //此FORM1可以帶notifyIcon,可以顯示在托盤里,用戶可點擊托盤圖標進行設置
                System.Windows.Forms.Application.Run(f);


                dwGuiThreadId = IntPtr.Zero;
                SetThreadDesktop(hdeskSave);
                SetProcessWindowStation(hwinstaSave);
                CloseDesktop(hdeskUser);
                CloseWindowStation(hwinstaUser);
            }

            [DllImport("user32.dll")]
            staticexternint GetDesktopWindow();

            [DllImport("user32.dll")]
            staticextern IntPtr GetProcessWindowStation();

            [DllImport("kernel32.dll")]
            staticextern IntPtr GetCurrentThreadId();

            [DllImport("user32.dll")]
            staticextern IntPtr GetThreadDesktop(IntPtr dwThread);

            [DllImport("user32.dll")]
            staticextern IntPtr OpenWindowStation(string a, bool b, int c);

            [DllImport("user32.dll")]
            staticextern IntPtr OpenDesktop(string lpszDesktop, uint dwFlags,
            bool fInherit, uint dwDesiredAccess);

            [DllImport("user32.dll")]
            staticextern IntPtr CloseDesktop(IntPtr p);

            [DllImport("rpcrt4.dll", SetLastError =true)]
            staticextern IntPtr RpcImpersonateClient(int i);


            [DllImport("rpcrt4.dll", SetLastError =true)]
            staticextern IntPtr RpcRevertToSelf();

            [DllImport("user32.dll")]
            staticextern IntPtr SetThreadDesktop(IntPtr a);

            [DllImport("user32.dll")]
            staticextern IntPtr SetProcessWindowStation(IntPtr a);
            [DllImport("user32.dll")]
            staticextern IntPtr CloseWindowStation(IntPtr a);
        }
    }

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    .NET實現可交互的WINDOWS服務的實例代碼

    .NET實現可交互的WINDOWS服務的實例代碼: 這幾天想做個文件監控服務,看了一下網上的關于WINDOWS服務的文章,數量都不少,都只講了如何做一個最基本的服務,卻沒有講述如何與用戶進行交互。查看了MSDN,看一下關于服務的描述: Windows 服務應用程序在不同于登錄用戶的交互區域的窗口區域中運行。
    推薦度:
    標簽: 可以 服務 代碼
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 成人精品一区二区三区中文字幕| 国产精品第一页在线| 久久这里只精品国产99热| 拍国产乱人伦偷精品视频| 99riav国产精品| 国产精品无码无需播放器| 亚洲爆乳精品无码一区二区| 国产成人精品久久综合| 国产成人精品亚洲日本在线| 中文字幕九七精品乱码 | 久久99久久99小草精品免视看| 国产精品欧美久久久久无广告 | 国产精品久久久久久久午夜片| 日本伊人精品一区二区三区| 久久亚洲精品无码观看不卡| 99RE8这里有精品热视频| 99精品视频在线观看re| 久久精品国产亚洲AV无码麻豆| 欧美日韩综合精品| 久久97久久97精品免视看| 国产精品99久久久久久www| 国内精品51视频在线观看| 国产精品亚洲成在人线| 久久久久人妻一区精品色| 亚洲精品国产精品乱码视色| 亚洲精品视频久久久| 合区精品中文字幕| 亚洲国产精品尤物YW在线观看| 久久久精品久久久久特色影视| 国产精品夜色视频一级区| 国产精品极品美女自在线观看免费| 91av国产精品| 国产精品电影在线| 精品国产亚洲一区二区在线观看| 国产乱人伦偷精品视频不卡| 国产精品免费久久久久影院| 91精品成人免费国产片| 国产精品免费久久久久电影网| 国产精品极品美女自在线观看免费| 国产手机在线精品| 久久久91人妻无码精品蜜桃HD |