#include<iostream> #include <windows.h> #include <sys/types.h> #include <sys/stat.h> #include<string> using namespace std; string getFilePathByWindows(); //判断是否为文件 bool isFile(string path); //修改或者增长注册表 void createStringReg(HKEY hRoot,char *szSubKey,char* valueName,char *Data); //添加开机启动到注册表 void addToAuto(string filePath); //根据文件路径获取文件名称 string getFileNameByFilePath(string filePath); void show(string str); void showError(); int main(){ system("cls"); cout << "请选择您的操做(1:添加开机启动,2:退出):"; int choice; //选择的操做 cin >> choice; switch(choice){ case 1: { cout << "请输入您的exe路径(能够把exe文件直接拖入):"; string filePath = getFilePathByWindows();//要添加开机启动的文件路径 if(filePath == ""){ cin >> filePath; } if(!isFile(filePath)){ cout<<"文件地址无效"; break; } addToAuto(filePath); show("成功添加到开机启动√"); main(); } break; default: break; } return 0; } void show(string str){ //MessageBox(NULL, openFileName.lpstrFile, "", MB_OK); MessageBox(NULL, str.c_str(), "", MB_OK); } //判断是否为文件 bool isFile(string path){ struct _stat buf = {0}; _stat(path.c_str(), &buf); return buf.st_mode & _S_IFREG; } //打开文件对话框,获取选择的文件 string getFilePathByWindows(){ char szFileName[MAX_PATH] = {}; OPENFILENAMEA openFileName = {}; openFileName.lStructSize = sizeof(OPENFILENAMEW); openFileName.nMaxFile = MAX_PATH;//这个必须设置,不设置的话不会出现打开文件对话框 openFileName.lpstrFilter = "可执行文件(*.exe*)\0*.exe\0任何文件(*.*)\0*.*\0"; openFileName.lpstrFile = szFileName; openFileName.nFilterIndex = 1; openFileName.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetOpenFileName(&openFileName))// 若是保存则用GetSaveFileName() { return openFileName.lpstrFile; } return ""; } //添加开机启动到注册表 void addToAuto(string filePath){ string name = getFileNameByFilePath(filePath); createStringReg(HKEY_LOCAL_MACHINE, (char *)"Software\\Microsoft\\Windows\\CurrentVersion\\Run", (char *)name.c_str(), (char *)filePath.c_str()); } void createStringReg(HKEY hRoot,char *szSubKey,char* valueName,char *Data) { HKEY hKey; //打开注册表键,不存在则建立它 long lRet=RegCreateKeyEx(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL); if (lRet!=ERROR_SUCCESS) { show("RegCreateKeyEx error"); return ; } //修改注册表键值,没有则建立它 lRet=RegSetValueEx(hKey,valueName,0,REG_SZ,(BYTE*)Data,strlen(Data)); if (lRet!=ERROR_SUCCESS) { printf("RegSetValueEx error"); return ; } RegCloseKey(hKey); } //根据文件路径获取文件名称 string getFileNameByFilePath(string filePath){ int pos = filePath.find_last_of('\\'); return filePath.substr(pos + 1); } void showError() { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); // Process any inserts in lpMsgBuf. // ... // Display the string. MessageBox(NULL,(LPCTSTR)lpMsgBuf, ("Error"), MB_OK | MB_ICONINFORMATION ); // Free the buffer. LocalFree( lpMsgBuf ); }