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;
    }
}
相关推荐
樱木Plus4 小时前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
晨星shine20 小时前
GC、Dispose、Unmanaged Resource 和 Managed Resource
后端·c#
用户298698530141 天前
.NET 文档自动化:Spire.Doc 设置奇偶页页眉/页脚的最佳实践
后端·c#·.net
用户3667462526741 天前
接口文档汇总 - 2.设备状态管理
c#
用户3667462526741 天前
接口文档汇总 - 3.PLC通信管理
c#
blasit2 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
Ray Liang2 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
肆忆_3 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星3 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛5 天前
delete又未完全delete
c++