<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在线视频app| 在线免费一区二区| AV在线亚洲男人的天堂| 亚洲v高清理论电影| 亚洲精品国产高清在线观看| 国产免费一区二区三区免费视频| **毛片免费观看久久精品| 免费观看美女裸体网站| 亚洲无删减国产精品一区| 亚洲国产欧美国产综合一区| 免费的涩涩视频在线播放| 国产一区二区三区亚洲综合| AAA日本高清在线播放免费观看| 成人黄色免费网址| 亚洲性久久久影院| 国产啪精品视频网站免费尤物| 久久精品亚洲精品国产色婷| 亚洲一级片免费看| 在线观看国产情趣免费视频| 久久亚洲中文字幕精品有坂深雪 | 国产成人高清亚洲一区久久| 国产免费黄色大片| 亚洲免费视频播放| 国内少妇偷人精品视频免费| 国产免费人视频在线观看免费| 在线播放免费人成视频网站| 99精品全国免费观看视频| 香蕉蕉亚亚洲aav综合| 久久www免费人成看片| 4480yy私人影院亚洲| a级片在线免费看| 久久久久国产成人精品亚洲午夜 | 免费大片黄手机在线观看| 亚洲一卡2卡4卡5卡6卡在线99| 无码av免费一区二区三区| 在线精品亚洲一区二区小说| 国产精品亚洲五月天高清| 亚洲va久久久噜噜噜久久狠狠 | 亚洲av日韩av永久无码电影|