范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

c编写windows服务的应用实例

  昨天,我研究了一下如何用c#编写windows服务,如果有兄弟不知道怎么弄,可以去看一下,因为我昨天晚上研究了它的应用,今天准备和大家分享一下。
  昨天的文章在这里:彻底搞懂如何用c#编写windows服务
  c#编写windows服务,这个链接第一次用,不太知道怎么弄。
  昨天安装了一个啥也没干的windows服务,我就在想,这个东西能做什么呢?最后我决定制作一个守护程序,功能就是监测另一个程序,看它有没有启动,没有的话就启动它。制作一个简单的程序,我们就来监测它是不是启动了,程序文件名:text.exe。
  切换到service的代码视图
  整体代码如下,,这里我用LOG文件做了日志:using System; using System.IO; using System.ServiceProcess; using System.Windows.Forms;  namespace A_Fw {     public partial class TheService : ServiceBase     {         //定义一个timer         public System.Timers.Timer timer = new System.Timers.Timer();         //运行路径         string thepath = Application.StartupPath;         //日志文件路径         string logfile = "log.txt";          //被监控程序的进程名,用来检查它是不是已经运行         string jinchengming = "test";         //被监控程序的文件名         string runfilename = "test.exe";         public TheService()         {             InitializeComponent();              //定义timer事件             timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);             timer.Interval = 1000; //时间间隔         }         //timer启动后,每隔一段时间检测下被监视程序是否运行,如果没有就运行它         void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)         {             //根据进程名得到被监测程序的进程对象             System.Diagnostics.Process[] myproc = System.Diagnostics.Process.GetProcessesByName(jinchengming);             int isrun = myproc.Length;              //如果没有进程,说明这个程序没有运行             if (isrun == 0)             {                 try                 {                     Log("程序未运行,准备运行...");                     //运行被监控程序                     System.Diagnostics.Process.Start(thepath + runfilename);                     Log("程序已经启动...");                 }                 catch (Exception ex)                 {                     Log("启动程序时发现错误:" + ex.ToString());                     Application.Exit();                 }             }             else             {                 Log("程序正在运行");             }         }         protected override void OnStart(string[] args)         {             //服务启动时的事件,timer开始工作             timer.Enabled = true;             timer.Start();             Log("服务启动...");         }          protected override void OnStop()         {             //服务停止时的事件,timer停止工作             timer.Enabled = false;             timer.Stop();             Log("服务停止...");         }         void Log(string logcontent)   //记录日志         {             using (FileStream st = new FileStream(thepath + logfile, FileMode.Append))             {                 using (StreamWriter wr = new StreamWriter(st))                 {                     wr.WriteLine(#34;{DateTime.Now.ToLongTimeString()},{logcontent}");                 }             }         }     } }出现以下情况
  是因为我们写的不是windows窗体服务,添加一下system.windows.Forms.dll,
  再引用一下 using System.Windows.Forms; 就可以了。
  重新生成解决方案,因为我程序中都是用的应该程序根目录,这样方便调试,所以这次需要把3个文件放在同一目录下
  G:x>installUtil.exe A_Fw.exe 安装服务,然后启动服务
  运行后,test.exe并未弹出
  但查看日志文件没有发现问题
  查看进程,发现已经有了test进程,杀死后,还会出现这个进程,说明服务程序没有问题。但需要注意的是,此时test进程为"后台进程"
  这是什么原因呢?给服务加上与桌面交互选项也是不行的
  查了些资料,确定原因出现在这句:
  System.Diagnostics.Process.Start(thepath + runfilename);
  我不知道是什么原因,用它启动text.exe就是后台进程,解决方法如下:新建一个文件(我并不知道为啥,这个是网上抄的)
  这个文件直接照抄就行了。using System; using System.Runtime.InteropServices;  namespace RFW {     public class WinAPI_Interop     {         public static IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;         ///          /// 服务程序执行消息提示,前台MessageBox.Show         ///          /// 消息内容         /// 标题         public static void ShowServiceMessage(string message, string title)         {             int resp = 0;             WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, WTSGetActiveConsoleSessionId(), title, title.Length, message, message.Length, 0, 0, out resp, false);         }          [DllImport("kernel32.dll", SetLastError = true)]         public static extern int WTSGetActiveConsoleSessionId();          [DllImport("wtsapi32.dll", SetLastError = true)]         public static extern bool WTSSendMessage(IntPtr hServer, int SessionId, String pTitle, int TitleLength, String pMessage, int MessageLength, int Style, int Timeout, out int pResponse, bool bWait);         #region P/Invoke WTS APIs         private enum WTS_CONNECTSTATE_CLASS         {             WTSActive,             WTSConnected,             WTSConnectQuery,             WTSShadow,             WTSDisconnected,             WTSIdle,             WTSListen,             WTSReset,             WTSDown,             WTSInit         }          [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]         private struct WTS_SESSION_INFO         {             public UInt32 SessionID;             public string pWinStationName;             public WTS_CONNECTSTATE_CLASS State;         }          [DllImport("WTSAPI32.DLL", SetLastError = true, CharSet = CharSet.Auto)]         static extern bool WTSEnumerateSessions(             IntPtr hServer,             [MarshalAs(UnmanagedType.U4)] UInt32 Reserved,             [MarshalAs(UnmanagedType.U4)] UInt32 Version,             ref IntPtr ppSessionInfo,             [MarshalAs(UnmanagedType.U4)] ref UInt32 pSessionInfoCount             );          [DllImport("WTSAPI32.DLL", SetLastError = true, CharSet = CharSet.Auto)]         static extern void WTSFreeMemory(IntPtr pMemory);          [DllImport("WTSAPI32.DLL", SetLastError = true, CharSet = CharSet.Auto)]         static extern bool WTSQueryUserToken(UInt32 sessionId, out IntPtr Token);         #endregion          #region P/Invoke CreateProcessAsUser         ///           /// Struct, Enum and P/Invoke Declarations for CreateProcessAsUser.          ///           ///            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]         struct STARTUPINFO         {             public Int32 cb;             public string lpReserved;             public string lpDesktop;             public string lpTitle;             public Int32 dwX;             public Int32 dwY;             public Int32 dwXSize;             public Int32 dwYSize;             public Int32 dwXCountChars;             public Int32 dwYCountChars;             public Int32 dwFillAttribute;             public Int32 dwFlags;             public Int16 wShowWindow;             public Int16 cbReserved2;             public IntPtr lpReserved2;             public IntPtr hStdInput;             public IntPtr hStdOutput;             public IntPtr hStdError;         }          [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]         struct PROCESS_INFORMATION         {             public IntPtr hProcess;             public IntPtr hThread;             public int dwProcessId;             public int dwThreadId;         }          ///          /// 以当前登录的windows用户(角色权限)运行指定程序进程         ///          ///          /// 指定程序(全路径)         /// 参数         /// 进程属性         /// 线程属性         ///          ///          ///          ///          /// 程序启动属性         /// 最后返回的进程信息         /// 是否调用成功         [DllImport("ADVAPI32.DLL", SetLastError = true, CharSet = CharSet.Auto)]         static extern bool CreateProcessAsUser(IntPtr hToken, string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes,                                                       bool bInheritHandles, uint dwCreationFlags, string lpEnvironment, string lpCurrentDirectory,                                                       ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);          [DllImport("KERNEL32.DLL", SetLastError = true, CharSet = CharSet.Auto)]         static extern bool CloseHandle(IntPtr hHandle);         #endregion          ///          /// 以当前登录系统的用户角色权限启动指定的进程         ///          /// 指定的进程(全路径)         public static void CreateProcess(string ChildProcName)         {             IntPtr ppSessionInfo = IntPtr.Zero;             UInt32 SessionCount = 0;             if (WTSEnumerateSessions(                                     (IntPtr)WTS_CURRENT_SERVER_HANDLE,  // Current RD Session Host Server handle would be zero.                                      0,  // This reserved parameter must be zero.                                      1,  // The version of the enumeration request must be 1.                                      ref ppSessionInfo, // This would point to an array of session info.                                      ref SessionCount  // This would indicate the length of the above array.                                     ))             {                 for (int nCount = 0; nCount < SessionCount; nCount++)                 {                     WTS_SESSION_INFO tSessionInfo = (WTS_SESSION_INFO)Marshal.PtrToStructure(ppSessionInfo + nCount * Marshal.SizeOf(typeof(WTS_SESSION_INFO)), typeof(WTS_SESSION_INFO));                     if (WTS_CONNECTSTATE_CLASS.WTSActive == tSessionInfo.State)                     {                         IntPtr hToken = IntPtr.Zero;                         if (WTSQueryUserToken(tSessionInfo.SessionID, out hToken))                         {                             PROCESS_INFORMATION tProcessInfo;                             STARTUPINFO tStartUpInfo = new STARTUPINFO();                             tStartUpInfo.cb = Marshal.SizeOf(typeof(STARTUPINFO));                             bool ChildProcStarted = CreateProcessAsUser(                                                                         hToken,             // Token of the logged-on user.                                                                          ChildProcName,      // Name of the process to be started.                                                                          null,               // Any command line arguments to be passed.                                                                          IntPtr.Zero,        // Default Process" attributes.                                                                          IntPtr.Zero,        // Default Thread"s attributes.                                                                          false,              // Does NOT inherit parent"s handles.                                                                          0,                  // No any specific creation flag.                                                                          null,               // Default environment path.                                                                          null,               // Default current directory.                                                                          ref tStartUpInfo,   // Process Startup Info.                                                                           out tProcessInfo    // Process information to be returned.                                                       );                             if (ChildProcStarted)                             {                                 CloseHandle(tProcessInfo.hThread);                                 CloseHandle(tProcessInfo.hProcess);                             }                             else                             {                                 int err = Marshal.GetLastWin32Error();                                 ShowServiceMessage("CreateProcessAsUser失败:" + err.ToString(), "CreateProcess");                             }                             CloseHandle(hToken);                             break;                         }                     }                 }                 WTSFreeMemory(ppSessionInfo);             }         }     } }将打开文件那句改成:try {     Log("程序未运行,准备运行...");     //运行被监控程序,下面这句不行     //System.Diagnostics.Process.Start(thepath + runfilename);                  //用这句才可以打开应用进程     RFW.WinAPI_Interop.CreateProcess(thepath + @runfilename);     Log("程序已经启动..."); }重新安装服务,运行效果如下:
  明天再来研究,用其它程序来控制这个服务的安装与卸载
  如果看得上的话,需要源码可以联系我。

世嘉经典街机复活CSmashVRS公布登陆PSVR2此前我们曾报道过世嘉上线了神秘网站,暗示其经典街机游戏宇宙不意打或将复活。日前该作已经正式公布,名为CSmashVRS,确认由WolfWood与世嘉合作开发,RapidEyeMov巨屏电视成为主流,但建议别乱买,这两款产品好评如潮!随着消费者对生活品质的提升,巨屏电视的需求量也变得越加强烈了,十年前购买电视的主流尺寸还维持在50英寸左右,平均尺寸为39。9英寸,但十年后结果已明显不同。来自奥维云网的数据显示,iPhonevivo持续领跑中国5G手机市场华为经典耐用Hinova成黑马作者林斐来源IT时报2022年中国智能手机市场面临了巨大挑战。专业的数据智能服务商每日互动(股票代码300766)利用大数据从市场激活设备角度洞察发现,在宏观环境影响下,2022年鹤城区第二幼儿园用红色经典激发孩子的爱国情红网时刻怀化2月14日讯(通讯员庄小林)革命军人个个要牢记,三大纪律八项注意,第一一切行动听指挥,步调一致才能得胜利,第二不拿群众一针线,群众对我拥护又喜欢,第三一切缴获要归公,努现金流异常产品曾上质量黑榜,CBD家居IPO胜算几何?远超智慧最终能否成功登陆资本市场,一切皆是未知数。。来源经理人传媒旗下经理人杂志全媒体记者何雯雯来源官网近日,深圳远超智慧生活股份有限公司(以下简称远超智慧)再次更新了招股书,拟在手机厂商开年大战产品升维价格降维,国内大盘可否超越去年?21世纪经济报道记者骆轶琪深圳报道开年过后,安卓阵营陆续开启了新机发布竞跑。或许一部分受上游芯片产品的高库存降价带动,年初发布的部分手机新品将存储配置推到了罕见的1T,且整体内存配支持八个人一起玩?玩家团队正在打造霍格沃茨遗产多人模组头条创作挑战赛提起近期的人气游戏,那自然就是哈利波特主题大作霍格沃茨遗产(也叫霍格沃茨之遗)了。游戏正式上架后,在Steam平台上的好评率高达93,最高玩家同时在线人数一度突破87说说单元楼道的那点事头条创作挑战赛不知道大家见过这个大缸吗?腌菜大缸在杭州这样的城市里,在小区单元楼道里,看到这个缸,也不算什么稀奇事。毕竟60岁靠上年龄的人都好一口冬腌菜。自己会腌制,以前也买过大缸东莞血案,主管扣掉三千六,三条人命每人平均一千二,成本太高了头条创作挑战赛2月13日,在广东东莞发生了一起重大刑事案件。一个贵州籍男子,为讨要4000元务工工钱,丧失理智,丧心病狂,泯灭人性,用刀具连捅三人。这是继浙江平阳宅基地纠纷连杀六人惠普新款暗影精灵9Plus高能版游戏本开启预售酷睿i7RTX4070,价格10999元今天惠普的OMEN暗影精灵9Plus高能版游戏笔记本电脑已开启了预售,采用了英特尔酷睿i713700HX处理器,搭配英伟达GeForceRTX4070移动显卡,目前预售价格为109聊一款今年或将强势复出的游戏本还记得在2022年的笔吧年度总结评级报告中,我们将一款看似不错的游戏本评为D级,那就是联想拯救者Y7000P2022。从工业设计制造的角度评价,这款游戏本并没有什么问题,但它的配置
vivoX90Pro来了,网友华为Mate50Pro买早了最近vivoX90Pro发布后,吸引了很多人的目光,看到其配置和价格后,不少网友表示华为Mate50Pro买早了。那么是不是如此呢?二者有哪些差异?性能方面,vivoX90Pro采老铁好,这款华为Mate40是我最好用的一款智能手机华为Mate40是两年前的一款5G智能手机,我就买了一款,那我就介绍这款手机的特点。手机屏幕与处理器华为Mate40屏幕是6。5英寸的68度曲面屏,它的屏幕类型是全面屏(左上挖孔屏华为鸿蒙心比天高,命比纸薄编辑于斌出品潮起网于见专栏混沌初开,鸿蒙肇始。按照汉典网的解释,古人认为天地开辟之前是一团混沌的元气,这种自然的元气就叫做鸿蒙。而华为自主研发的操作系统以此命名,寓意堪称唯美而深刻华为Mate40pro已经使用300天,和大家聊一下将近一年的使用体验其实我之前一直都是果粉,直到去年才换了华为mate40pro,作为自己的主力机,到今天正好300天,并且今年的工作机也换了华为P50,我这大半年的体验总体来说非常爽!特别是每次出停湖南科技学院举行学习新思想奋进新征程微宣讲比赛红网时刻新闻11月25日讯(通讯员刘琴李乐彭芸摄影阳欢)为推动全校师生深入学习宣传贯彻党的二十大精神,引导师生在学习领悟中坚定理想信念,在奋发有为中践行初心使命。11月22日下午,杭州萧山加快推进新经济企业党建工作,助力企业高质量发展11月23日,浙江东南网架集团党委成立二十周年庆祝大会暨东南创新学校成立大会举行。现场,东南网架集团红领东南网架天下党建品牌正式发布。作为党建工作的有力载体,东南创新学校当日成立,丰田油电混动车型在华累计销量突破200万辆今日(11月24日),丰田中国宣布旗下油电混动车型在华累计销量突破200万辆,在官方话术中,我们可以看到其向广大车主表达了感谢,未来也将全方位发展电动化阵容,持续助力碳中和。早在1安缦吉沃,印度尼西亚项目标签设计公司EdTuttle位置印度尼西亚类型建筑材料石材木材标签令人愉悦的浴室安缦爪哇分类休闲娱乐商业建筑度假区酒店分享农村建筑那些事Amanjiwo度假村坐落在梭罗(Sol字节跳动基于数据湖技术的近实时场景实践导读本讲嘉宾是来自抖音电商实时数仓团队的大数据工程师马汶园,分享主题为基于数据湖技术的近实时场景实践。主要包括以下几部分内容数据湖技术的特性近实时技术的架构电商数仓实践未来的挑战与汽车产业技术发展的新需求和新使命头条创作挑战赛当前我国汽车产业总体上处于产业周期性回落和技术变革的叠加交汇期,尽管增速下滑,在新冠疫情影响下甚至出现明显的负增长,但中国汽车产业发展韧性十足,潜力巨大,前景广阔。我史上最难求职季一天4套笔试做到凌晨,名校毕业生像白菜被挑选这可能是史上最难的一次秋招。2022年,中国应届大学毕业生人数首次突破千万,达到1076万人,而2023年大学毕业生数量将继续增加,预计达到1158万人。2022届还没找到工作的毕