當前位置:首頁 > 芯聞號 > 充電吧
[導讀]C++ (MFC)開機自啟動源碼(修改注冊表) 分類: 2010-01-14 10:28 287人閱讀 評論(0) 收藏 舉報 CString?? str; //添加注冊表路徑 //WCHAR*???

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);?

?

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉