C++ (MFC)開機自啟動源碼(修改注冊表)
分類: 2010-01-14 10:28 287人閱讀 評論(0) 收藏 舉報
CString?? str; //添加注冊表路徑
//WCHAR*???? CurrentPath=(WCHAR*)malloc(sizeof(char)*100);//程序當前路徑
WCHAR*???? CurrentPath= new WCHAR[sizeof(WCHAR)*100];//程序當前路徑
HKEY?? hRegKey;?? //注冊key
BOOL?? bResult;?? //打開注冊表返回值
str=_T("Software//Microsoft//Windows//CurrentVersion//Run");//注冊表??
GetModuleFileName(NULL,CurrentPath,MAX_PATH); //獲得運用程序路徑
if(bResult=RegOpenKey(HKEY_LOCAL_MACHINE,?? str,?? &hRegKey)?? !=?? ERROR_SUCCESS)//打開注冊表????
{??
?? //free(CurrentPath); //打開不成功就釋放內存并返回
?? delete[] CurrentPath;
?? return;??
}??
if(bResult=::RegSetValueEx(hRegKey,_T("StarBySelf"),0,REG_SZ,??
?? (const?? unsigned?? char?? *)CurrentPath,??
?? MAX_PATH)!=?? ERROR_SUCCESS)?? //打開成功寫信息到注冊表
{?? //寫入失敗
?? RegCloseKey(hRegKey);?? //關閉注冊表key
//?? free(CurrentPath);?? //釋放內存資源
?? delete[] CurrentPath;
?? return;?? //返回
}??
//成功后執(zhí)行釋放內存
RegCloseKey(hRegKey);??
// free(CurrentPath);
delete[] CurrentPath;
?
?
?
?
?
?
(轉載) MFC 實現(xiàn)開機運行程序 以及 運行時隱藏
分類: C/C++ 程序開發(fā) 2010-08-01 17:52 346人閱讀 評論(0) 收藏 舉報
MFC怎樣編寫后臺運行的程序
---------------------------------------------------------------
http://www.codeproject.com/system/xservice.asp
---------------------------------------------------------------
以下為轉載---------
1、實現(xiàn)開機自運行
???? 我在csdn網站上經??吹接腥藛栠@樣的問題,其實要實現(xiàn)開機時就自動運行自己的程序并不難。在注冊表的HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Run鍵下可以看到有一系列鍵值,它們都是開機自動運行的軟件的路徑。那么我們要做的就是編程實現(xiàn)將我們的程序的路徑也添加到這個鍵值下,就搞定了。著名的“windows優(yōu)化大師”也就是用去掉不必要的開機運行軟件這個方法來實現(xiàn)開機速度優(yōu)化的。
???? 既然要讀寫注冊表,就要用到兩個重要的操作注冊表的函數(shù):RegOpenKey()和RegSetValueEx()。前者用于打開注冊表的鍵,后者則為打開的鍵設置鍵值,至于這兩個API函數(shù)的具體參數(shù),請參見MSDN。為了代碼重用的要求,我為此封裝了一個專門的函數(shù),如下所示:
BOOL SetAutoRun(CString strPath)//開機自動運行
{
??? CString str;
??? HKEY hRegKey;
??? BOOL bResult;
??? str=_T("Software//Microsoft//Windows//CurrentVersion//Run");
??? if(RegOpenKey(HKEY_LOCAL_MACHINE, str, &hRegKey) != ERROR_SUCCESS)
??????? bResult=FALSE;
??? else
??? {
??????? _splitpath(strPath.GetBuffer(0),NULL,NULL,str.GetBufferSetLength(MAX_PATH+1),NULL);
??????? strPath.ReleaseBuffer();
??????? str.ReleaseBuffer();
??????? if(::RegSetValueEx( hRegKey,
??????????????????????????? str,
??????????????????????????? 0,
??????????????????????????? REG_SZ,
??????????????????????????? (CONST BYTE *)strPath.GetBuffer(0),
??????????????????????????? strPath.GetLength() ) != ERROR_SUCCESS)
?????????? bResult=FALSE;
??????? else
?????????? bResult=TRUE;
??????? strPath.ReleaseBuffer();
??? }
??? return bResult;
}
???? 其中strPath參數(shù)表示要設置為自運行的程序的絕對路徑。當設置成功時返回true,否則返回false。
這里又帶來一個問題:既然需要本程序的絕對路徑,那么怎么得到它呢?總不能指定一個值吧,那么當本程序的路徑改變時就又要修改程序,太麻煩了??梢杂眠@個封裝的函數(shù)來實現(xiàn):
//得到程序文件本身的路徑(包括文件名)
CString GetMyPath()
{
??? CString strPath;
??? GetModuleFileName(NULL,strPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
??? strPath.ReleaseBuffer();
??? return strPath;
}
2、實現(xiàn)運行時自動隱藏
??? 這是一個很有趣很古老的話題,csdn上經常有人為此討論不休,提出不少方案,比如在對話框的OnInitDialog()中添加一句:ShowWindow(SW_HIDE);,或者在對話框屬性框中去掉對話框的Visible屬性;或者將對話框移到桌面以外的地方去;或者首先將對話框最小化,然后實現(xiàn)最小化時隱藏……有趣的是這些很容易想到的常規(guī)方法都不能解決這個問題,或者說解決的不夠好。我通過查找相關文章和多次修改代碼,找出了真正解決這個問題的辦法。
??? 之所以用ShowWindow()函數(shù)失效,我認為可能是對話框的DoModal()在作怪,這么一來就只能繞開DoModal(),那么就自然想到可以把對話框變成一個無模式對話框。無模式對話框平時我們用到的不多,它與模式對話框不同,是用Create方法Create出來的,而不是DoModal()創(chuàng)建的。
??? 假設建立一個VC.NET工程GetTime,首先在CGetTimeApp類中添加一個成員變量:CGetTimeDlg *dlg;然后在InitInstance()中將原來的:
???? int nResponse = dlg.DoModal();
???? if (nResponse == IDOK)
???? {
??????? // TODO: Place code here to handle when the dialog is
??????? //?? dismissed with OK
???? }
???? else if (nResponse == IDCANCEL)
???? {
??????? // TODO: Place code here to handle when the dialog is
??????? //?? dismissed with Cancel
???? }
以及return FALSE;全部刪除掉,改為:????? dlg=new CGetTimeDlg;
???? m_pMainWnd = dlg;
???? return dlg->Create(IDD_GETTIME_DIALOG);
??? 最后別忘了在ExitInstance()中加上一句:delete dlg;好了,這下把本程序的對話框變成了一個無模式對話框。不過既然是無模式對話框,就不能再用OnOK(),OnCancel()來退出了,要用DestroyWindow()。
??? 由于在上面的代碼中沒有將對話框設為可見,所以運行時就實現(xiàn)了隱藏,而且在Windows任務欄上也沒有顯示。至此,第二個問題得到完美解決。
?
?
?
?
?
?
?
一、當前用戶專有的啟動文件夾
這是許多應用軟件自動啟動的常用位置,Windows自動啟動放入該文件夾的所有快捷方式。用戶啟動文件夾一般在:/Documents and Settings/
二、對所有用戶有效的啟動文件夾
這是尋找自動啟動程序的第二個重要位置,不管用戶用什么身份登錄系統(tǒng),放入該文件夾的快捷方式總是自動啟動——這是它與用戶專有的啟動文件夾的區(qū)別所在。該文件夾一般在:/Documents and Settings/All Users/「開始」菜單/程序/啟動。
三、Load注冊鍵
介紹該注冊鍵的資料不多,實際上它也能夠自動啟動程序。位置:HKEY_CURRENT_USER/Software/Microsoft/WindowsNT/CurrentVersion/Windows/load。
四、Userinit注冊鍵
位置:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/Winlogon/Userinit。這里也能夠使系統(tǒng)啟動時自動初始化程序。通常該注冊鍵下面有一個userinit.exe,如圖一,但這個鍵允許指定用逗號分隔的多個程序,例如“userinit.exe,OSA.exe”(不含引號)。
五、Explorer/Run注冊鍵
和load、Userinit不同,Explorer/Run鍵在HKEY_CURRENT_USER和HKEY_LOCAL_MACHINE下都有,具體位置是:HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer/Run,和HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/Explorer/Run。
六、RunServicesOnce注冊鍵
RunServicesOnce注冊鍵用來啟動服務程序,啟動時間在用戶登錄之前,而且先于其他通過注冊鍵啟動的程序。RunServicesOnce注冊鍵的位置是:HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/RunServicesOnce,和HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunServicesOnce。
七、RunServices注冊鍵
RunServices注冊鍵指定的程序緊接RunServicesOnce指定的程序之后運行,但兩者都在用戶登錄之前。RunServices的位置是:HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/RunServices,和HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunServices。
八、RunOnce/Setup注冊鍵
RunOnce/Setup指定了用戶登錄之后運行的程序,它的位置是:HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/RunOnce/Setup,和HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnce/Setup。
九、RunOnce注冊鍵
安裝程序通常用RunOnce鍵自動運行程序,它的位置在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnce和HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/RunOnce。HKEY_LOCAL_MACHINE下面的RunOnce鍵會在用戶登錄之后立即運行程序,運行時機在其他Run鍵指定的程序之前。HKEY_CURRENT_USER下面的RunOnce鍵在操作系統(tǒng)處理其他Run鍵以及“啟動”文件夾的內容之后運行。如果是XP,你還需要檢查一下HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnceEx。
此
十、Run注冊鍵
Run是自動運行程序最常用的注冊鍵,位置在:HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Run,和HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run。HKEY_CURRENT_USER下面的Run鍵緊接HKEY_LOCAL_MACHINE下面的Run鍵運行,但兩者都在處理“啟動”文件夾之前。
下面使用的是第十方法,在Run下注冊鍵,在Run下寫入和刪除鍵值
1.如想在開機自動行C盤下的"測試.txt",可在注冊表中Run位置寫入鍵值
[c-sharp] view plaincopyprint?DWORD dwDisposition;?
??? HKEY hKey;?
??? LONG result = RegCreateKeyEx(?
??? HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows//CurrentVersion//Run",?
??? 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,?
??? NULL, &hKey, &dwDisposition);?
??? if(result != ERROR_SUCCESS)?
??? {?
??????? RegCloseKey(hKey);?
??? }?
??? char *path="c://測試.txt";?
??? char *key="test";?
??? result = RegSetValueEx(hKey, key, NULL, REG_SZ, (const unsigned char *)path, strlen(path)+1);?
??? if(result != ERROR_SUCCESS)?
??? {?
??????? RegCloseKey(hKey);?
??? }?
??? RegCloseKey(hKey);?
DWORD dwDisposition;
??? HKEY hKey;
??? LONG result = RegCreateKeyEx(
??? HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows//CurrentVersion//Run",
??? 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
??? NULL, &hKey, &dwDisposition);
??? if(result != ERROR_SUCCESS)
??? {
??RegCloseKey(hKey);
??? }
??? char *path="c://測試.txt";
??? char *key="test";
??? result = RegSetValueEx(hKey, key, NULL, REG_SZ, (const unsigned char *)path, strlen(path)+1);
??? if(result != ERROR_SUCCESS)
??? {
??RegCloseKey(hKey);
??? }
??? RegCloseKey(hKey);
2.在注冊表中Run位置刪除鍵值
[c-sharp] view plaincopyprint?HKEY hkResult;?
HKEY hKey=NULL;?
TCHAR lpFilename[MAX_PATH];?
int a=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software//Microsoft//Windows//CurrentVersion//Run",0,KEY_ENUMERATE_SUB_KEYS|KEY_QUERY_VALUE|KEY_SET_VALUE,&hKey);?
if(a==ERROR_SUCCESS)?
{?
??? int g=RegDeleteValue(hKey,"連接助手");//刪除一個鍵值項,切不可用其他函數(shù)??
//如RegDeleteKey或RegDeleteTree 及SHDeleteKey 函數(shù)??
??? RegCloseKey(hKey); //刪除后釋放??
??? if(g!=ERROR_SUCCESS) //執(zhí)行失敗獲取錯誤信息??
??? {?
?????? TCHAR* buffer;?
?????? ::FormatMessage(?
?????? FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,?
?????? NULL,?
?????? g,?
?????? 0,?
????? ( LPTSTR )&buffer,?
????? 0,?
????? NULL );?
????? ::MessageBox( NULL, buffer, NULL, 0 );//輸出錯誤信息??
????? LocalFree( buffer );?
??? }?
??? else?
??? {?
????? MessageBox(NULL,TEXT("成功關閉"),TEXT("警告!"),MB_OK);?
??? }?
}???
else?
{?
?? MessageBox(NULL,TEXT("無法解除自啟,嘗試關閉殺毒軟件以降低注冊表操作權限"),?
?? TEXT("警告!"),MB_OK);?
?? RegCloseKey(hKey);?
?