亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:17:27
字體:
來源:轉載
供稿:網友

  這幾天想做個文件監控服務,看了一下網上的關于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);
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日本国产在线| 成人精品视频99在线观看免费| 成人夜晚看av| 美女精品视频一区| 欧美一区二区三区四区在线| 精品国产欧美一区二区五十路| 中文日韩在线视频| 亚洲xxxxx性| 国产手机视频精品| 亚洲无限乱码一二三四麻| 欧美日韩成人在线观看| 国产精品自拍偷拍| 亚洲人成在线观看| 久久久久一本一区二区青青蜜月| 欧美精品电影免费在线观看| 国产精品美乳在线观看| 51久久精品夜色国产麻豆| 高清一区二区三区四区五区| 久久综合色88| 韩国欧美亚洲国产| 91国内精品久久| 午夜伦理精品一区| 69久久夜色精品国产7777| 青青久久aⅴ北条麻妃| 色99之美女主播在线视频| 欧美成人精品一区二区| 欧美午夜久久久| 日韩欧美有码在线| 狠狠久久亚洲欧美专区| 国产精品va在线| 亚洲黄色av女优在线观看| 色综合影院在线| 国产欧美va欧美va香蕉在线| 国产成人涩涩涩视频在线观看| 91久久夜色精品国产网站| 成人h猎奇视频网站| 亚洲精品短视频| 精品日本美女福利在线观看| 国产精品美女www爽爽爽视频| 亚洲成色777777女色窝| 中文字幕一精品亚洲无线一区| 色婷婷亚洲mv天堂mv在影片| 日韩av在线免费| 欧美最顶级丰满的aⅴ艳星| 最近2019年中文视频免费在线观看| 欧美中文在线免费| 欧美一区二区三区精品电影| 欧美国产日韩精品| 精品久久久香蕉免费精品视频| 亚洲字幕一区二区| 92版电视剧仙鹤神针在线观看| 国产精品久久久久影院日本| 91高清在线免费观看| 最近更新的2019中文字幕| 亚洲伊人久久大香线蕉av| 九九视频这里只有精品| 国产精品黄色av| 国产91在线播放| 一本色道久久综合亚洲精品小说| 亚洲成人在线网| 在线视频一区二区| 国产欧美日韩中文字幕| 日韩三级成人av网| 久久久久久国产免费| 久久精品成人一区二区三区| 久久99久久亚洲国产| 91牛牛免费视频| 热久久这里只有精品| 欧美日韩在线视频首页| 成人www视频在线观看| 欧美香蕉大胸在线视频观看| 日韩在线观看免费全集电视剧网站| 91欧美精品午夜性色福利在线| 国产精品视频内| 亚洲第一色中文字幕| 亚洲色无码播放| 国产亚洲人成网站在线观看| 久久久视频精品| 成人激情免费在线| 欧美性极品xxxx娇小| 在线视频欧美日韩| …久久精品99久久香蕉国产| 亚洲aⅴ男人的天堂在线观看| 亚洲a∨日韩av高清在线观看| 91精品国产91久久久久久不卡| 亚洲国产成人一区| 亚洲第一网站男人都懂| 国产日韩视频在线观看| 欧美精品国产精品日韩精品| 国产69精品久久久久9999| 欧美怡红院视频一区二区三区| 一区二区在线免费视频| 国产亚洲欧美一区| 92福利视频午夜1000合集在线观看| 国产精品女主播视频| 欧美精品九九久久| 成人国产精品一区二区| 91视频8mav| 91中文在线观看| 欧美日韩国产综合视频在线观看中文| 亚洲国产精品中文| 亚洲视频在线视频| 欧美日韩一区二区在线播放| 久久夜色撩人精品| 国内精品久久久久久久久| 日韩精品极品视频| 欧美国产在线视频| 久久久噜噜噜久久中文字免| 国产精品99久久久久久久久| 国产亚洲免费的视频看| 国产亚洲精品久久久久久| 26uuu日韩精品一区二区| 国产精品久久久久久搜索| 在线视频精品一| 亚洲 日韩 国产第一| 国产精品av在线| 超碰精品一区二区三区乱码| 国产伦精品免费视频| 国内精品久久久久影院 日本资源| 中文字幕欧美亚洲| 精品少妇v888av| 91免费人成网站在线观看18| 人人澡人人澡人人看欧美| 77777亚洲午夜久久多人| 2019最新中文字幕| 亚洲视频在线免费观看| 久久久久北条麻妃免费看| 久久影院资源站| 538国产精品一区二区在线| 日韩精品久久久久久久玫瑰园| 欧美精品情趣视频| 欧美电影在线观看完整版| 国产精品黄页免费高清在线观看| 亚洲国产日韩一区| 亚洲综合中文字幕在线观看| 亚洲精品国产精品久久清纯直播| 亚洲最大的av网站| 久久精品99久久香蕉国产色戒| 国产精品一久久香蕉国产线看观看| 中文字幕成人在线| 91在线观看欧美日韩| 欧美精品在线第一页| 亚洲精品久久7777777| 国产精品久久99久久| 国产美女被下药99| 国产精品欧美激情在线播放| 久久亚洲精品中文字幕冲田杏梨| 国产精品久久久久免费a∨| 一区二区三区 在线观看视| 午夜精品久久久久久久男人的天堂| 国产福利成人在线| 国产精品久久91| 亚洲精品视频网上网址在线观看| 欧美裸体xxxx| 国产精品18久久久久久麻辣| 日韩欧亚中文在线| 国产自摸综合网| 日韩不卡在线观看| 91久久久久久久久久久| 九九热这里只有精品免费看| 国产偷亚洲偷欧美偷精品| 国产一区av在线| 久久精品一偷一偷国产| 亚洲视频在线观看免费|