c++ 讓程序開機(jī)自動(dòng)啟動(dòng)的方法
當(dāng)我們?cè)趙indow下編寫自己的程序時(shí),也可以讓自己編寫的程序在電腦開機(jī)時(shí)自動(dòng)運(yùn)行,這主要是修改windows里的注冊(cè)表信息,所有開機(jī)自動(dòng)啟動(dòng)的程序的一些信息都放在注冊(cè)表中的某一文件夾下。我們只需在特定的文件夾下寫入我們的程序信息即可。
關(guān)于注冊(cè)表 我們可以在鍵盤上同時(shí)按下 win+r 鍵,在運(yùn)行串口中輸regedit 回車即可看到注冊(cè)表(可以理解為一個(gè)大樹,記錄著系統(tǒng)中的信息),我們點(diǎn)擊左邊文件夾,點(diǎn)擊順序?yàn)椋篠oftware\\Microsoft\\Windows\\CurrentVersion\\Run,在這個(gè)文件夾中存放的便是隨機(jī)啟動(dòng)的 程序的信息。舉個(gè)例子:當(dāng)我們使用某個(gè)電腦優(yōu)化軟件進(jìn)行電腦優(yōu)化時(shí),他會(huì)檢測(cè)到需要開機(jī)優(yōu)化的項(xiàng)目,即有些軟件不必要開機(jī)就啟動(dòng),修改的就是這個(gè)文件中的一些信息。
首先我們解釋下所用到的函數(shù)的含義:
RegOpenKeyEx()
函數(shù)功能描述:打開一個(gè)指定的注冊(cè)表鍵
原型
LONG RegOpenKeyEx(
HKEY hKey, // 需要打開的主鍵的名稱
LPCTSTR lpSubKey, //需要打開的子鍵的名稱
DWORD ulOptions, // 保留,設(shè)為0
REGSAM samDesired, // 安全訪問(wèn)標(biāo)記,也就是權(quán)限
PHKEY phkResult // 得到的將要打開鍵的句柄
)
Parameters
參數(shù):
hKey
入?yún)ⅲ瑯?biāo)識(shí)當(dāng)前被 RegCreateKeyEx 或RegOpenKeyEx打開的注冊(cè)表鍵的句柄,或者是以下預(yù)定義的句柄
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
lpSubKey
入?yún)?,該參?shù)指向一個(gè)字符串,該字符串用來(lái)保存將要打開的注冊(cè)表名稱。如果這個(gè)參數(shù)是空,或者是一個(gè)指向空串的指針,該函數(shù)將會(huì)打開一個(gè)由hKey所定義的鍵,在此種情況下,該函數(shù)不會(huì)關(guān)閉舷墻已經(jīng)打開的句柄。
ulOptions
入?yún)ⅲA?,設(shè)置為0
samDesired
入?yún)ⅰ?biāo)識(shí)打開注冊(cè)表的權(quán)力,如果該參數(shù)的安全描述符不容許當(dāng)前進(jìn)程訪問(wèn)注冊(cè)表,則該函數(shù)會(huì)返回失敗。此程序中我們使用寫入?yún)?shù)即:KEY_WRITE (0x20006)。
phkResult
出參,指向一個(gè)變量的指針,該變量用來(lái)保存打開注冊(cè)表鍵的句柄。如果不再使用返回的句柄,則調(diào)用RegCloseKey來(lái)關(guān)閉它。
返回值:
ERROR_SUCCESS表示該函數(shù)執(zhí)行成功,非零值表示該函數(shù)執(zhí)行失敗。想要獲得錯(cuò)誤描述,調(diào)用FormatMessage函數(shù),并傳入FORMAT_MESSAGE_FROM_SYSTEM參數(shù)。
二:
GetModuleFileName(NULL,pFileName, MAX_PATH);
函數(shù)原型獲取當(dāng)前進(jìn)程已加載模塊的文件的完整路徑,該模塊必須由當(dāng)前進(jìn)程加載。)
DWORDGetModuleFileName(
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize
);
HMODULE hModule: 裝載一個(gè)程序?qū)嵗木浔?。如果該參?shù)為NULL,該函數(shù)返回該當(dāng)前應(yīng)用程序的全路徑。
lpFileName: 是你存放返回的名字的內(nèi)存塊的指針,是一個(gè)輸出參數(shù)。
DWORD nSize:裝載到緩沖區(qū)lpFileName的最大值。
注意:如果想獲得某個(gè)正在運(yùn)行的EXE或者DLL的全路徑可以這樣寫代碼
GetModuleFileNameEx(hProcess,hInst,lpFile,MAX_PATH);//注意下緩沖區(qū)就行了。
三:
RegSetValueEx():想要設(shè)置的注冊(cè)表項(xiàng)下不是默認(rèn)值,即有名稱值的數(shù)據(jù)和類型時(shí),可以調(diào)用RegSetValueEx函數(shù),該函數(shù)將在注冊(cè)表項(xiàng)下設(shè)置指定值的數(shù)據(jù)和類型。
LONG RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
CONST BYTE *lpData,
DWORD cbData
);
hKey: 一個(gè)已打開項(xiàng)的句柄
lpValueName:指向一個(gè)字符串的指針,該字符串包含了欲設(shè)置值的名稱。若擁有該值名稱的值并不存在于指定的注冊(cè)表項(xiàng)中,則此函數(shù)將其加入到該項(xiàng)。
Reserved:保留值,必須強(qiáng)制為0
dwType: 指定將被存儲(chǔ)的數(shù)據(jù)類型
lpData: 指向一個(gè)緩沖區(qū),該緩沖區(qū)包含了欲為指定值名稱存儲(chǔ)的數(shù)據(jù)。
cbData:指定由lpData參數(shù)所指向的數(shù)據(jù)的大小,單位是字節(jié)。
以下代碼時(shí)實(shí)現(xiàn)讓本程序開機(jī)自啟的方法.
我們建立個(gè)對(duì)話框程序,在對(duì)話框上放一個(gè)button,然后在其消息響應(yīng)函數(shù)中寫如下代碼:
void CSetAutoRunDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 HKEY hKey; //可以理解為操作注冊(cè)表的句柄 //找到系統(tǒng)的啟動(dòng)項(xiàng) ,長(zhǎng)指針類型是const char * 類型 LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run"; //打開啟動(dòng)項(xiàng)Key long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey); if(lRet == ERROR_SUCCESS) //打開成功 { char pFileName[MAX_PATH] = {0}; //定義數(shù)組存放路徑 //得到程序自身的全路徑 DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH); //添加一個(gè)子Key,并設(shè)置值 // 下面的"test"是應(yīng)用程序名字(不加后綴.exe) lRet = RegSetValueEx(hKey, "SetAutoRun", 0, REG_SZ, (BYTE *)pFileName, dwRet); //關(guān)閉注冊(cè)表 RegCloseKey(hKey); if(lRet != ERROR_SUCCESS) { MessageBox("系統(tǒng)參數(shù)錯(cuò)誤,不能完成開機(jī)啟動(dòng)設(shè)置"); } else { MessageBox("打開開機(jī)啟動(dòng)成功"); } // isrun = 1; } }
點(diǎn)擊運(yùn)行后,出現(xiàn)"啟動(dòng)成功"對(duì)話框,重啟電腦后,軟件開機(jī)啟動(dòng)(當(dāng)運(yùn)行程序時(shí),有的殺毒軟件可能會(huì)發(fā)出注冊(cè)表修改的警告,那正是我們的程序在修改注冊(cè)表)
上一篇:C語(yǔ)言中無(wú)符號(hào)數(shù)和有符號(hào)數(shù)之間的運(yùn)算
欄 目:C語(yǔ)言
下一篇:C++ 異常的詳細(xì)介紹
本文標(biāo)題:c++ 讓程序開機(jī)自動(dòng)啟動(dòng)的方法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1185.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載