C#避免程序二次启动并接收参数

本文介绍了一种使用互斥锁防止Windows应用程序多次启动的方法,并通过示例代码展示了如何检测当前程序是否已在运行,并将已运行实例置为前台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Reflection;

namespace gis
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //如果有参数,执行以下内容
            if (args.Length > 0)
            {
                MessageBox.Show(args[0]);
            }
            bool createdNew;
            //系统能够识别有名称的互斥,因此可以使用它禁止应用程序启动两次
            //第二个参数可以设置为产品的名称:Application.ProductName
            //每次启动应用程序,都会验证名称为Gis的互斥是否存在
            Mutex mutex = new Mutex(false, "Gis", out createdNew);
            //如果已运行,则在前端显示
            //createdNew == false,说明程序已运行
            if (!createdNew)
            {
                Process instance = GetExistProcess();
                if (instance != null)
                {
                    SetForegroud(instance);
                    Application.Exit();
                    return;
                }
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (args.Length == 0)
                Application.Run(new Form1());
            else
                Application.Run(new Form1(args));
        }

        /// <summary>
        /// 查看程序是否已经运行
        /// </summary>
        /// <returns></returns>
        private static Process GetExistProcess()
        {
            Process currentProcess = Process.GetCurrentProcess();
            foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
            {
                if ((process.Id != currentProcess.Id) &&
                (Assembly.GetExecutingAssembly().Location == currentProcess.MainModule.FileName))
                {
                    return process;
                }
            }
            return null;
        }

        /// <summary>
        /// 使程序前端显示
        /// </summary>
        /// <param name="instance"></param>
        private static void SetForegroud(Process instance)
        {
            IntPtr mainFormHandle = instance.MainWindowHandle;
            if (mainFormHandle != IntPtr.Zero)
            {
                ShowWindowAsync(mainFormHandle, 1);
                SetForegroundWindow(mainFormHandle);
            }
        }

        [DllImport("User32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        [DllImport("User32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

    }
}

### 关于C#语言进行海康威视设备或软件二次开发 海康威视SDK为开发者提供了多种编程语言的支持,其中C# SDK通过.NET封装,能够方便地集成到C#项目中[^1]。为了帮助开发者快速上手,以下是一个简单的C#示例代码,展示如何使用海康威视SDK进行设备登录和实时视频预览。 #### 示例代码:C# 海康威视SDK 登录与预览 ```csharp using System; using HIKVISION.SDK; // 引用海康威视SDK库 class Program { static void Main(string[] args) { CHCNetSDK hcNetSdk = new CHCNetSDK(); // 初始化SDK对象 int lLoginHandle = -1; // 设置回调函数 hcNetSdk.fRealDataCallBack_V30 = RealDataCallBack; // 登录设备 string ip = "192.168.1.64"; // 设备IP地址 int port = 8000; // 端口号 string username = "admin"; // 用户名 string password = "12345"; // 密码 NET_DVR_USER_LOGIN_INFO loginInfo = new NET_DVR_USER_LOGIN_INFO(); NET_DVR_DEVICEINFO_V40 deviceInfo = new NET_DVR_DEVICEINFO_V40(); loginInfo.bUseAsynLogin = 0; loginInfo.sDeviceAddress = ip; loginInfo.wPort = (ushort)port; loginInfo.sUserName = username; loginInfo.sPassword = password; lLoginHandle = hcNetSdk.NET_DVR_Login_V40(ref loginInfo, ref deviceInfo); if (lLoginHandle < 0) { Console.WriteLine("登录失败,错误码:" + hcNetSdk.NET_DVR_GetLastError()); return; } Console.WriteLine("登录成功"); // 开始实时预览 int lRealHandle = hcNetSdk.NET_DVR_RealPlay_V40(lLoginHandle, IntPtr.Zero, null, 0); if (lRealHandle < 0) { Console.WriteLine("预览失败,错误码:" + hcNetSdk.NET_DVR_GetLastError()); return; } Console.WriteLine("实时预览已启动,按任意键退出..."); Console.ReadKey(); // 停止实时预览 hcNetSdk.NET_DVR_StopRealPlay(lRealHandle); // 登出设备 hcNetSdk.NET_DVR_Logout(lLoginHandle); Console.WriteLine("登出成功"); } private static void RealDataCallBack(int lRealHandle, IntPtr pBuf, uint dwBufLen, IntPtr dwUser) { // 实时数据回调函数 Console.WriteLine("接收到实时数据,长度:" + dwBufLen); } } ``` 上述代码展示了如何通过C#调用海康威视SDK完成设备登录、实时预览以及资源释放的操作。开发者需要确保在项目中正确引用了海康威视提供的SDK库,根据实际需求调整参数设置。 此外,海康威视还提供了一个包含完整DEMO及说明文档的项目,位于以下地址:https://gitcode.com/Universal-Tool/88437。该项目包含了详细的源码实例和接口调用说明,有助于开发者快速理解运用SDK实现定制化功能[^2]。 ### 技术架构与开发建议 在进行海康威视SDK的二次开发时,开发者应关注以下几个方面: - **环境配置**:确保开发环境满足要求,包括安装正确的.NET框架版本以及配置好SDK库路径[^4]。 - **接口调用**:熟悉SDK提供的各类接口及其参数定义,合理使用回调函数处理实时数据。 - **异常处理**:在实际开发中加入完善的错误处理机制,避免因网络或其他因素导致程序崩溃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值