首页 > 系统相关 >C#判断程序是由Windows服务启动还是用户启动

C#判断程序是由Windows服务启动还是用户启动

时间:2024-08-13 08:54:22浏览次数:9  
标签:窗口 启动 C# 应用程序 Windows 服务 控制台

      在Windows系统做网络开发,很多时候都是使用Windows服务的模式,但在调度阶段,我们更多的是使用控制台的模式。在开发程序的时候,我们在Program的Main入口进行判断。最初开始使用Environment.UserInteractive属性,在系统不系统服务的交互模式时,程序运行是正常的,但试过有Win7下,系统允许交互模式,结果在服务启动的时候,跳转到控制台的模式了,服务启动不起来。只能在服务的调用方式下带参数,然后在Main的参数中判断是否为服务方式。这在一般的情况下是可以解决问题的。

      后来有好几个项目,使用了开源的Socket框架,框架本身是通过配置来启动服务的,这样,就没有经过用户的Main方法了,启动带参数的方法不行了,如果为了判断启动模式而加单独的配置,不是很好的做法,通过Program加全局标识是可以解决程序自身启动同框架启动的判断,但服务如果是通过自身的Main启动,又只能靠加参数的方法了,整个实现感觉都是有点别扭。

      在几次的服务程序开发中,遇到一个写文件的路径问题,即取路径总是不对,通过分析,Windows服务启动时的环境默认路径是从System32目录,可能是Windows服务的宿主程序是从这开始的吧,这就有了解决如何判断启动模式的方法了。主要是通过宿主程序是程序集所在的目录来判断。具体如下 :

  string curPath = System.Environment.CurrentDirectory;
  string basePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);
  bool isRunWinService = (curPath != basePath);

如果两个路径不相同,我就认为是启动Windows服务了。我们只要在程序的开始做判断,这样Environment.CurrentDirectory的路径还是宿主程序,一般来说,开发人员很少去改动Environment.CurrentDirectory的。这样我们做好的Exe程序支持用户启动,服务启动,或框架自动的服务管理等模式了。

 

2024-08-13 08:52:01【出处】:https://www.cnblogs.com/Yjianyong/p/5560442.html

=======================================================================================

C# 当前进程是否为控制台窗口

WPF应用程序,在VS的项目属性中,可以设置输出类型:

那我们在代码中,如何判断应用的类型呢。有没有控制台?是否Windows应用程序还是控制台应用程序?

Kernel32下函数GetConsoleWindow可以解决这个问题:

[DllImport("kernel32.dll")]
private static extern IntPtr GetConsoleWindow();

复制代码
1     var consoleWindowHandle = GetConsoleWindow();
2     if (consoleWindowHandle == IntPtr.Zero)
3     {
4         Debug.WriteLine("输出类型为 Windows应用程序");
5     }
6     else
7     {
8         Debug.WriteLine("输出类型为 控制台应用程序");
9     }
复制代码

另外,如果需要判断控制台应用程序内,主窗口是否为控制台,可以根据窗口句柄来确认:

复制代码
 1     var consoleWindowHandle = GetConsoleWindow();
 2     var mainWindowHandle = Process.GetCurrentProcess().MainWindowHandle;
 3 
 4     if (consoleWindowHandle == IntPtr.Zero)
 5     {
 6         Debug.WriteLine("输出类型为 Windows应用程序");
 7     }
 8     else if (consoleWindowHandle == mainWindowHandle)
 9     {
10         Debug.WriteLine("输出类型为 控制台应用程序,主窗口也是控制台窗口");
11     }
12     else
13     {
14         Debug.WriteLine("输出类型为 控制台应用程序,但主窗口为Windows窗口");
15     }
复制代码

我们设置输出类型为控制台应用,并在ShowMainWindow前后,输出结果,验证okay:

注:这里输出到VS控制台,是因为使用了Debug类型。如果是Console.Write,程序会优先输出到控制台窗口内。

 

如果需要在Windows应用程序下,使用控制台窗口输出日志。可以使用AllocConsole:

    [DllImport("kernel32.dll")]
    static extern bool AllocConsole();

AllocConsole,可以创建控制台窗口。bool返回值,true表示之前没有控制台窗口、创建成功,false表示已经有控制台窗口、创建失败。

 

 

2024-08-13 08:52:30【出处】:https://www.cnblogs.com/kybs0/p/17273872.html

=======================================================================================

标签:窗口,启动,C#,应用程序,Windows,服务,控制台
From: https://www.cnblogs.com/mq0036/p/18356149

相关文章

  • P9520 [JOISC2022] 监狱
    P9520[JOISC2022]监狱题目描述有一棵\(N\)个节点的树,有\(M\)个囚犯,要从\(S_i\)走到\(T_i\)。每一时刻可以发布一个命令让一名囚犯走到相邻的节点,要求任意时刻囚犯不能走到同一个节点上,求是否可以令每一个囚犯从\(S_i\)走到\(T_i\)。做法解析首先我们可以发现一个......
  • CF896E Welcome home, Chtholly
    [题目通道](Welcomehome,Chtholly-洛谷)#include<iostream>#pragmaGCCoptimize(1)#pragmaGCCoptimize(2)#pragmaGCCoptimize(3)#pragmaGCCtarget("avx")#pragmaGCCoptimize("Ofast")#pragmaGCCoptimize("inline")#pra......
  • 成都City walk
    目录8-1成都啊我来了8-2&8-3成都成都8-4青城山|都江堰8-5成都博物馆下一次要体验的《成都的细节》张丰8-1成都啊我来了市区->西安北18:10-19:30西安北->成都东19:52-23:278-2&8-3成都成都成都大熊猫繁育研究基地–要看花花的话要6点起床哦......
  • Windows PE 安装
    下载并安装WindowsADK和WinPE加载项安装WindowsADK:安装WinPE加载项:打开终端(管理员)cd"C:\ProgramFiles(x86)\WindowsKits\10\AssessmentandDeploymentKit\DeploymentTools".\DandISetEnv.batcd"..\WindowsPreinstallationEnvironment\amd64......
  • [图文直播]使用EasyOCR识别图片上的文字
    安装EasyOCRC:\Users\Administrator>pipinstalleasyocrCollectingeasyocrDownloadingeasyocr-1.7.1-py3-none-any.whl.metadata(11kB)Collectingtorch(fromeasyocr)Downloadingtorch-2.4.0-cp312-cp312-win_amd64.whl.metadata(27kB)Collectingtor......
  • windows 终端美化
    效果图:1.安装windowsterminal打开windows自带的应用商店,安装windowsterminal1.1设置windowsterminal✨注意:以下设置完成后要点击”保存”1.1.1设置启动快捷方式将windowsterminal创建一个桌面快捷方式右键点开「属性」修改快捷方式为ctrl+alt+......
  • TypeScript 入门
    0x01概述TypeScript官网TypeScript是一种基于JavaScript构建的强类型编程语言JavaScript的超集,即JavaScript是TypeScript的子集JavaScript类型化,即在JavaScript基础上添加类型系统优势:提供可读性和可维护性在编译阶段检查并报错环境:安装NodeJ......
  • RT-Patch学习
    RT是什么在标准的Linux内核中,内核不是完全可抢占的(notfullypreemptible)。虽然Linux内核支持一些程度的抢占(如在用户空间任务之间的抢占),但在内核态执行关键代码(如持有锁时),内核通常是不可抢占的。这意味着在某些情况下,特别是在处理复杂内核任务时,高优先级的任务可能不得不等......
  • 在 windows 上部署 django
    环境Django4.1.7python3.11.2Apache2.4.461:安装配置Apache1.1:下载ApacheApache官方下载链接按照系统版本选择对应的,以下是64位操作系统的选择1.2:解压Apache下载完成后,解压到你要部署服务器的文件夹。建议在你要部署服务器的电脑磁盘下建立一个英文目录,如E:\pen......
  • cats的二分答案
    可以证明在k次二分后区间长度最多只有两种,且差最多为1(符合直觉的结论)可以将二分视为对数的划分,而与l和r的取值无关用unordered_map时常会出现奇怪的问题,改成map就好了点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlongK;map<longlong,longlong>q[1......