1,178
社区成员
发帖
与我相关
我的任务
分享
/*
实现程序自动运行
filename为要运行的文件名
stat为运行状态
若stat为0,则设置开机不运行
若stat为非0值,则设置程序开机运行
*/
#pragma hdrstop
#include <Registry.hpp>
#include <vcl.h>
#include "regrun.h"
#pragma package(smart_init)
void setregrun(AnsiString filename, int stat)
{
AnsiString fname;
TRegistry *myrun = new TRegistry;
fname = ExtractFileName(filename);
fname = fname.SubString(0, fname.Pos(ExtractFileExt(fname))-1);
myrun->RootKey = HKEY_LOCAL_MACHINE;
if (myrun->OpenKey("Software//Microsoft//Windows//Current/Version//Run", true))
{
if (stat)
{
myrun->WriteString(fname, filename);
}
else
{
myrun->DeleteValue(fname);
}
myrun->CloseKey();
}
delete myrun;
}
regrun.h的内容如下
#ifndef regrunH
#define regrunH
//filename
//stat:0 for norun,others for run
void setregrun(AnsiString filename, int stat);
#endif
在程序中,可以通过Application变量获得程序所在的路径与文件名,然后作为参数传递给regun函数,例如:
setregrun(Application->ExeName, 1); //设置自动运行
setregrun(Application->ExeName, 0); //取消自动运行
///////////////////////////////////////////
// SelfRun.cpp文件
#include <stdio.h>
#include <windows.h>
int main(int argc, char* argv[]) // 09 SelfRun工程下
{
// 根键、子键名称、和到子键的句柄
HKEY hRoot = HKEY_LOCAL_MACHINE;
char*szSubKey ="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
HKEY hKey;
// 打开指定子键
DWORD dwDisposition = REG_OPENED_EXISTING_KEY; // 如果不存在不创建
LONG lRet = ::RegCreateKeyEx(hRoot, szSubKey, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
if(lRet != ERROR_SUCCESS)
return-1;
// 得到当前执行文件的文件名(包含路径)
char szModule[MAX_PATH] ;
::GetModuleFileName (NULL, szModule, MAX_PATH);
// 创建一个新的键值,设置键值数据为文件名
lRet = ::RegSetValueEx(hKey, "SelfRunDemo", 0, REG_SZ, (BYTE*)szModule, strlen(szModule));
if(lRet == ERROR_SUCCESS)
{
printf(" 自动启动设置成功!\n");
}
// 关闭子键句柄
::RegCloseKey(hKey);
getchar();
return0;
}