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;
    }
}
相关推荐
qq_466302451 天前
vs2008 Hotlink实时数据读取
c++·qt
我是唐青枫1 天前
C#.NET 索引器完全解析:语法、场景与最佳实践
c#·.net
代码or搬砖1 天前
String字符串
android·java·开发语言
阿达King哥1 天前
关于C++中的typedef typename的含义
c++
leo__5201 天前
基于两步成像算法的聚束模式SAR MATLAB实现
开发语言·算法·matlab
Macbethad1 天前
自动化测试技术报告
开发语言·lua
不会画画的画师1 天前
Go开发指南:io/ioutil包应用和迁移指南
开发语言·后端·golang
2503_928411561 天前
12.22 wxml语法
开发语言·前端·javascript
咔咔咔的1 天前
3652. 按策略买卖股票的最佳时机
c++
5980354151 天前
【java工具类】小数、整数转中文大写
android·java·开发语言