<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        .NET實(shí)現(xiàn)可交互的WINDOWS服務(wù)的實(shí)例代碼

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:41:35
        文檔

        .NET實(shí)現(xiàn)可交互的WINDOWS服務(wù)的實(shí)例代碼

        .NET實(shí)現(xiàn)可交互的WINDOWS服務(wù)的實(shí)例代碼: 這幾天想做個(gè)文件監(jiān)控服務(wù),看了一下網(wǎng)上的關(guān)于WINDOWS服務(wù)的文章,數(shù)量都不少,都只講了如何做一個(gè)最基本的服務(wù),卻沒(méi)有講述如何與用戶進(jìn)行交互。查看了MSDN,看一下關(guān)于服務(wù)的描述: Windows 服務(wù)應(yīng)用程序在不同于登錄用戶的交互區(qū)域的窗口區(qū)域中運(yùn)行。
        推薦度:
        導(dǎo)讀.NET實(shí)現(xiàn)可交互的WINDOWS服務(wù)的實(shí)例代碼: 這幾天想做個(gè)文件監(jiān)控服務(wù),看了一下網(wǎng)上的關(guān)于WINDOWS服務(wù)的文章,數(shù)量都不少,都只講了如何做一個(gè)最基本的服務(wù),卻沒(méi)有講述如何與用戶進(jìn)行交互。查看了MSDN,看一下關(guān)于服務(wù)的描述: Windows 服務(wù)應(yīng)用程序在不同于登錄用戶的交互區(qū)域的窗口區(qū)域中運(yùn)行。

          這幾天想做個(gè)文件監(jiān)控服務(wù),看了一下網(wǎng)上的關(guān)于WINDOWS服務(wù)的文章,數(shù)量都不少,都只講了如何做一個(gè)最基本的服務(wù),卻沒(méi)有講述如何與用戶進(jìn)行交互。查看了MSDN,看一下關(guān)于服務(wù)的描述:

           Windows 服務(wù)應(yīng)用程序在不同于登錄用戶的交互區(qū)域的窗口區(qū)域中運(yùn)行。窗口區(qū)域是包含剪貼板、一組全局原子和一組桌面對(duì)象的安全對(duì)象。由于 Windows 服務(wù)的區(qū)域不是交互區(qū)域,因此 Windows 服務(wù)應(yīng)用程序中引發(fā)的對(duì)話框?qū)⑹遣豢梢?jiàn)的,并且可能導(dǎo)致程序停止響應(yīng)。同樣,錯(cuò)誤信息應(yīng)記錄在 Windows 事件日志中,而不是在用戶界面中引發(fā)。

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

          也就是說(shuō)我們要實(shí)現(xiàn)可交互的服務(wù)(比如我們想給服務(wù)在運(yùn)行時(shí)做一些參數(shù)設(shè)置等),那我們一定要using System.Runtime.InteropServices

          那么來(lái)看一下如果才能實(shí)現(xiàn)一個(gè)可交互的服務(wù)呢。步驟與實(shí)現(xiàn)基本的服務(wù)一樣(各位可自行參考MSDN或網(wǎng)上google一下).

          在實(shí)現(xiàn)OnStart時(shí)要注意,這里可不能彈出一個(gè)FORM什么的。這樣做是沒(méi)有任何反應(yīng)的。我們可以在這個(gè)方法里運(yùn)行一個(gè)線程。該線程需要訪問(wèn)窗口區(qū)域?qū)ο蠡蜃烂鎸?duì)象,當(dāng)然 framework里是沒(méi)有提供這些的,要訪問(wèn)非托管代碼的。

          來(lái)看一下代碼,再運(yùn)行試一下。

        代碼如下:
        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
            {
                ///
                /// 必需的設(shè)計(jì)器變量。
                ///
        private System.ComponentModel.Container components =null;
                Thread threadForm =null;
                public Service1()
                {
                    // 該調(diào)用是 Windows.Forms 組件設(shè)計(jì)器所必需的。
                    InitializeComponent();

                    // TODO: 在 InitComponent 調(diào)用后添加任何初始化
                }

                #region 組件設(shè)計(jì)器生成的代碼
                ///
                /// 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器
                /// 修改此方法的內(nèi)容。
                ///
        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);
                }

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

                ///
                /// 停止此服務(wù)。
                ///
        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,可以顯示在托盤里,用戶可點(diǎn)擊托盤圖標(biāo)進(jìn)行設(shè)置
                    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);
            }
        }

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        .NET實(shí)現(xiàn)可交互的WINDOWS服務(wù)的實(shí)例代碼

        .NET實(shí)現(xiàn)可交互的WINDOWS服務(wù)的實(shí)例代碼: 這幾天想做個(gè)文件監(jiān)控服務(wù),看了一下網(wǎng)上的關(guān)于WINDOWS服務(wù)的文章,數(shù)量都不少,都只講了如何做一個(gè)最基本的服務(wù),卻沒(méi)有講述如何與用戶進(jìn)行交互。查看了MSDN,看一下關(guān)于服務(wù)的描述: Windows 服務(wù)應(yīng)用程序在不同于登錄用戶的交互區(qū)域的窗口區(qū)域中運(yùn)行。
        推薦度:
        標(biāo)簽: 可以 服務(wù) 代碼
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲欧洲免费无码| a级毛片毛片免费观看久潮| 99在线精品视频观看免费| 亚洲高清国产拍精品26U| 中文字幕无码毛片免费看| 亚洲伊人久久成综合人影院| 黄色毛片免费观看| 一本久久综合亚洲鲁鲁五月天| 亚洲色大成WWW亚洲女子| 日本高清免费中文字幕不卡| 亚洲国产成人AV网站| 免费一级国产生活片| 国产免费区在线观看十分钟| a级亚洲片精品久久久久久久| 在线观看免费视频网站色| 亚洲精品国产精品乱码不卡√ | 成在线人视频免费视频| 一本色道久久综合亚洲精品| 日本免费中文视频| 丝袜足液精子免费视频| 亚洲成AV人片在线观看无码| 57pao一国产成永久免费| 国产成人精品亚洲2020| 午夜国产羞羞视频免费网站| 中文字幕在线免费播放| 97se亚洲综合在线| 午夜dj在线观看免费视频| 免费视频精品一区二区| 无码欧精品亚洲日韩一区| 台湾一级毛片永久免费| 日韩色日韩视频亚洲网站| 亚洲AV午夜成人片| 我想看一级毛片免费的| 国产裸体美女永久免费无遮挡| 亚洲欧洲第一a在线观看| 精品国产污污免费网站入口在线| 久久国产精品亚洲综合| 女人18毛片a级毛片免费| 中文字幕永久免费视频| 亚洲一区中文字幕| 97视频免费在线|