當我們在window下編寫自己的程序時,也可以讓自己編寫的程序在電腦開機時自動運行,這主要是修改windows裏的註冊表信息,所有開機自動啓動的程序的一些信息都放在註冊表中的某一文件夾下。我們只需在特定的文件夾下寫入我們的程序信息即可。
關於註冊表 我們可以在鍵盤上同時按下 win+r 鍵,在運行串口中輸regedit 回車即可看到註冊表(可以理解爲一個大樹,記錄着系統中的信息),我們點擊左邊文件夾,點擊順序爲:Software\\Microsoft\\Windows\\CurrentVersion\\Run,在這個文件夾中存放的便是隨機啓動的 程序的信息。舉個例子:當我們使用某個電腦優化軟件進行電腦優化時,他會檢測到需要開機優化的項目,即有些軟件不必要開機就啓動,修改的就是這個文件中的一些信息。
首先我們解釋下所用到的函數的含義:
一
RegOpenKeyEx()
函數功能描述:打開一個指定的註冊表鍵
原型
LONG RegOpenKeyEx( HKEY hKey, // 需要打開的主鍵的名稱 LPCTSTR lpSubKey, //需要打開的子鍵的名稱 DWORD ulOptions, // 保留,設爲0 REGSAM samDesired, // 安全訪問標記,也就是權限 PHKEY phkResult // 得到的將要打開鍵的句柄 ) |
Parameters
參數:
hKey
入參,標識當前被 RegCreateKeyEx 或RegOpenKeyEx打開的註冊表鍵的句柄,或者是以下預定義的句柄
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
lpSubKey
入參,該參數指向一個字符串,該字符串用來保存將要打開的註冊表名稱。如果這個參數是空,或者是一個指向空串的指針,該函數將會打開一個由hKey所定義的鍵,在此種情況下,該函數不會關閉舷牆已經打開的句柄。
ulOptions
入參,保留,設置爲0
samDesired
入參。標識打開註冊表的權力,如果該參數的安全描述符不容許當前進程訪問註冊表,則該函數會返回失敗。此程序中我們使用寫入參數即:KEY_WRITE (0x20006)。
phkResult
出參,指向一個變量的指針,該變量用來保存打開註冊表鍵的句柄。如果不再使用返回的句柄,則調用RegCloseKey來關閉它。
返回值:
ERROR_SUCCESS表示該函數執行成功,非零值表示該函數執行失敗。想要獲得錯誤描述,調用FormatMessage函數,並傳入FORMAT_MESSAGE_FROM_SYSTEM參數。
二:
GetModuleFileName(NULL,pFileName, MAX_PATH);
函數原型獲取當前進程已加載模塊的文件的完整路徑,該模塊必須由當前進程加載。)
1 2 3 4 5 |
DWORDGetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); |
HMODULE hModule: 裝載一個程序實例的句柄。如果該參數爲NULL,該函數返回該當前應用程序的全路徑。
lpFileName: 是你存放返回的名字的內存塊的指針,是一個輸出參數。
DWORD nSize:裝載到緩衝區lpFileName的最大值。
注意:如果想獲得某個正在運行的EXE或者DLL的全路徑可以這樣寫代碼
GetModuleFileNameEx(hProcess,hInst,lpFile,MAX_PATH);//注意下緩衝區就行了。
三:
RegSetValueEx():想要設置的註冊表項下不是默認值,即有名稱值的數據和類型時,可以調用RegSetValueEx函數,該函數將在註冊表項下設置指定值的數據和類型。
LONG RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
CONST BYTE *lpData,
DWORD cbData
);
hKey: 一個已打開項的句柄
lpValueName:指向一個字符串的指針,該字符串包含了欲設置值的名稱。若擁有該值名稱的值並不存在於指定的註冊表項中,則此函數將其加入到該項。
Reserved:保留值,必須強制爲0
dwType: 指定將被存儲的數據類型
lpData: 指向一個緩衝區,該緩衝區包含了欲爲指定值名稱存儲的數據。
cbData:指定由lpData參數所指向的數據的大小,單位是字節。
以下代碼時實現讓本程序開機自啓的方法.
我們建立個對話框程序,在對話框上放一個button,然後在其消息響應函數中寫如下代碼:
void CSetAutoRunDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知處理程序代碼
HKEY hKey; //可以理解爲操作註冊表的句柄
//找到系統的啓動項 ,長指針類型是const char * 類型
LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
//打開啓動項Key
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
if(lRet == ERROR_SUCCESS) //打開成功
{
char pFileName[MAX_PATH] = {0}; //定義數組存放路徑
//得到程序自身的全路徑
DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
//添加一個子Key,並設置值 // 下面的"test"是應用程序名字(不加後綴.exe)
lRet = RegSetValueEx(hKey, "SetAutoRun", 0, REG_SZ, (BYTE *)pFileName, dwRet);
//關閉註冊表
RegCloseKey(hKey);
if(lRet != ERROR_SUCCESS)
{
MessageBox("系統參數錯誤,不能完成開機啓動設置");
}
else
{
MessageBox("打開開機啓動成功");
}
// isrun = 1;
}
}
點擊運行後,出現"啓動成功"對話框,重啓電腦後,軟件開機啓動(當運行程序時,有的殺毒軟件可能會發出注冊表修改的警告,那正是我們的程序在修改註冊表)