C# c++ 实现程序开机自启动

C# c++ 实现程序开机自启动

1、C#

1、使用注册表

cpp 复制代码
using Microsoft.Win32;

public static void SetAutoStart(bool enable)
{
    RegistryKey rk = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
    if (enable)
    {
        rk.SetValue("MyApp", Application.ExecutablePath);
    }
    else
    {
        rk.DeleteValue("MyApp", false);
    }
    rk.Close();
}

2、使用启动文件夹

cpp 复制代码
using System;
using System.IO;
using IWshRuntimeLibrary;

public static void SetAutoStartByStartupFolder(bool enable)
{
    string startupFolder = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
    string shortcutPath = Path.Combine(startupFolder, "MyApp.lnk");

    if (enable)
    {
        // 创建快捷方式
        WshShell shell = new WshShell();
        IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutPath);
        shortcut.TargetPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
        shortcut.WorkingDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        shortcut.Description = "My Application";
        shortcut.Save();
    }
    else
    {
        // 删除快捷方式
        if (File.Exists(shortcutPath))
        {
            File.Delete(shortcutPath);
        }
    }
}

2、C++

1、使用注册表

cpp 复制代码
#include <Windows.h>
#include <string>

bool SetAutoStart(bool enable) {
    HKEY hKey;
    LPCTSTR lpSubKey = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
    LONG lResult = RegOpenKeyEx(HKEY_CURRENT_USER, lpSubKey, 0, KEY_SET_VALUE, &hKey);
    if (lResult != ERROR_SUCCESS) {
        return false;
    }

    TCHAR szExePath[MAX_PATH];
    GetModuleFileName(NULL, szExePath, MAX_PATH);

    if (enable) {
        // 设置注册表值,程序路径
        lResult = RegSetValueEx(hKey, TEXT("MyApp"), 0, REG_SZ, (BYTE*)szExePath, (lstrlen(szExePath) + 1) * sizeof(TCHAR));
    } else {
        // 删除注册表值
        lResult = RegDeleteValue(hKey, TEXT("MyApp"));
    }

    RegCloseKey(hKey);
    return lResult == ERROR_SUCCESS;
}

2、使用启动文件夹

cpp 复制代码
#include <Windows.h>
#include <ShlObj.h>
#include <string>

bool SetAutoStartByStartupFolder(bool enable) {
    TCHAR szStartupPath[MAX_PATH];
    TCHAR szExePath[MAX_PATH];
    TCHAR szLinkPath[MAX_PATH];

    // 获取启动文件夹路径
    if (FAILED(SHGetFolderPath(NULL, CSIDL_STARTUP, NULL, 0, szStartupPath))) {
        return false;
    }

    // 获取当前程序路径
    GetModuleFileName(NULL, szExePath, MAX_PATH);

    // 构造快捷方式路径
    _stprintf_s(szLinkPath, MAX_PATH, TEXT("%s\\MyApp.lnk"), szStartupPath);

    if (enable) {
        // 创建快捷方式
        // 使用Shell API创建快捷方式
        HRESULT hres;
        IShellLink* pShellLink = NULL;
        IPersistFile* pPersistFile = NULL;

        hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&pShellLink);
        if (SUCCEEDED(hres)) {
            pShellLink->SetPath(szExePath);
            pShellLink->SetDescription(TEXT("My Application"));

            hres = pShellLink->QueryInterface(IID_IPersistFile, (LPVOID*)&pPersistFile);
            if (SUCCEEDED(hres)) {
                pPersistFile->Save(szLinkPath, TRUE);
                pPersistFile->Release();
            }
            pShellLink->Release();
        }
        return SUCCEEDED(hres);
    } else {
        // 删除快捷方式
        return DeleteFile(szLinkPath) != 0;
    }
}
相关推荐
知南x1 分钟前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
忆~遂愿3 分钟前
GE 引擎与算子版本控制:确保前向兼容性与图重写策略的稳定性
大数据·开发语言·docker
Ro Jace29 分钟前
计算机专业基础教材
java·开发语言
代码游侠1 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
devmoon1 小时前
运行时(Runtime)是什么?为什么 Polkadot 的 Runtime 可以被“像搭积木一样”定制
开发语言·区块链·智能合约·polkadot·runtmie
时艰.1 小时前
Java 并发编程 — 并发容器 + CPU 缓存 + Disruptor
java·开发语言·缓存
忆~遂愿1 小时前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
沐知全栈开发1 小时前
API 类别 - 交互
开发语言
MZ_ZXD0011 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
wfserial1 小时前
c#使用微软自带speech选择男声仍然是女声的一种原因
microsoft·c#·speech