全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1506
推到 Plurk!
推到 Facebook!

自己定義Windows如何重新啟動

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-25 19:33:27 IP:61.218.xxx.xxx 未訂閱

自己定義Windows如何重新啟動

作者:黑山老妖 www.ccrun.com 主要內容:本文運用Windows API函數和C Builder 的類實現了有選擇的重新啟動系統。 關鍵字:API 註冊表 鍵 TRegIniFile類 一 前言 我們安裝程序時經常遇到重新啟動的情況,安裝程序並且經常詢問你如何啟動,有的詢問是否每次啟動都要運行,而有一些情況是在安裝時需要重新啟動系統,保留現在正在運行的程序的狀態,重新啟動後依然運行,並且只運行一次。實際這些看似高深的現象,我們自己在程序中也能實現。現在向眾位讀者介紹具體如何實現。 二 基本原理 筆者是運用Windows API 和C Builder 自帶的類實現的,具體用到的函數和類有:API函數ExitWindowsEx,C Builder的類TRegIniFile。 1 ExitwindowsEx函數 函數原型: ExitwindowsEx(UINT uFlags,DWORD dwReserved); 函數功能: 該函數註銷當前用戶,關閉系統;或者關閉並重新啟動系統。此函數發送WM_QUERYENDSESSION消息給應用程序來確定它們是否能被終止。 參數介紹: uFlags;指定關機類型。此參數必須包括下列值之一:EWX_LOGOFF,EWX_POWEROFF,EWX_REBOOT,EWX_SHUTDOWN。還包括EWX_FORCE,EWX_FORCEIFHUNG兩個可選值。現在只簡單介紹一下本文程序中用到的參數,其它參數可參考本文的參考文獻。 EWX_LOGOFF:關閉所有調用函數ExitWindowsEx的進程的安全環境裡運行的進程,然後註銷用戶。 EWX_REBOOT:關閉系統並重新啟動系統。 EWX_SHUTDOWN:關閉系統使之能完全關閉電源,所有文件緩衝區都被清洗到磁盤,所有的運行的進程都停止。 2 TRegIniFile類 TRegIniFile提供了一個對系統註冊表操作的接口,隱藏了註冊表 低層結構的操作,把Win9x/NT的註冊表當作Ini文件處理,這是因為雖然它從TRegistry類繼承而來,但它增加了好多TIniFile類的方法和屬性。現在把程序中用到的方法和屬性介紹如下: 屬性RootKey:規定了TRegIniFile類所能訪問到的根鍵。默認情況下,RootKey在TRegIniFile創建時為HKEY_CURRENT_USER。 方法TRegInifile: __fastcall TRegIniFile(const AnsiString FileName); 它為應用程序創建一個TRegIniFile對象,其參數指定了對象所要更新或創建的鍵。 方法WriteString: HIDESBASE void __fastcall WriteString(const AnsiString Section, const AnsiString Ident, const AnsiString value); 其功能是把字符串寫到與特定鍵有關的數據域內。第一個參數是信息所在的域名,第二個參數表示保存屬性的鍵值,第三個參數是在註冊表中保存的屬性值。如果域名或鍵值沒有出現在註冊表中,那麼它就自動創建一個域。如果域名或剪紙已經出現在了註冊表中,它就更新對象的屬性值。 方法Free: __fastcall Free(); 釋放為該對像創建時分配的內存。 顯然,TRegIniFile對象可以用來很容易地在註冊表中添加項目。與Windows API相比較,它是一種減少代碼的複雜性並且使代碼可以被復用的方法,可以使複雜的工作變得非常簡單。 本文程序用TRegIniFile修改註冊表關鍵詞HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows\CurrentVersion\Run或HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce,使其值指定為某個程序的路徑,這樣每次啟動系統都運行該程序或者下次啟動使程序運行,程序運行後,此值就被從註冊表中自動清除,以後不再運行。 二 程序中實現自定義重新啟動系統 1 首先創建一個空工程文件,並將其存盤為restartp.bpr和restart.cpp。 2 在form1上放置兩個GroupBox,六個RadioButton,其Caption分別為:註銷、關機、重新啟動、每次啟動都運行、僅在下次啟動時運行,Name為logoff、shutdown、restart、run、runonce,一個Button,其Caption為關機,Name為Button1。主窗口如圖一。 圖一 3給Button1添加onClick事件句柄。增加以下代碼到Code Editor的事件句柄中。 首先定義程序中用到的變量: UINT flag; AnsiString s; 定義TRegIniFile對象,並設初值為空。 TRegIniFile *RegFile=new TRegIniFile(""); 注意使用TRegIniFile時務必在restart.cpp的頭部添加以下語句: #include #include 改變其RootKey的值(一般默認為HKEY_LOCAL_USER): RegFile->RootKey=HKEY_LOCAL_MACHINE; 判斷註銷、關機、重新啟動的選擇情況,設置flag的值:
   if(logoff->Checked)
    flag=EWX_LOGOFF;
   else if(shutdown->Checked)
    flag=EWX_SHUTDOWN;
   else if(restart->Checked)
   flag=EWX_REBOOT;
判斷run、runonce的選擇情況,設置所要修改的註冊關鍵字:
if(run->Checked)
s="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
else if(runonce->Checked)
s="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce";
調用函數更新註冊表關鍵字的值,使其為畫筆程序,這樣重新啟動時就根據情況運行畫筆程序: RegFile->WriteString(s,"畫筆","C:\\Program files\\Accessories\\MSPAINT.EXE"); 釋放TRegIniFile對像: RegFile->Free(); 調用API函數,根據情況重新啟動系統: ExitWindowsEx(flag,0); 本程序在Windows98環境下,用C Builder 4.0調試通過。 四 源程序
1 restart.h
//-------------------------------------------------------------------------
#ifndef restartH
#define restartH
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <forms.hpp>
#include 
//---------------------------------------------------------------------------
class Tform1 : public Tform
{
__published: // IDE-managed Components
TButton *Button1;
TGroupBox *GroupBox1;
TRadioButton *logoff;
TRadioButton *shutdown;
TRadioButton *restart;
TGroupBox *GroupBox2;
TRadioButton *runonce;
TRadioButton *run;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall Tform1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE Tform1 *form1;
//---------------------------------------------------------------------------
#endif
2 restart.cpp
//---------------------------------------------------------------------------
#include 
//增加代碼開始 ------------
#include 
#include 
//增加代碼結束 -------------
#pragma hdrstop
#include "restart.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tform1 *form1;
//---------------------------------------------------------------------------
__fastcall Tform1::Tform1(TComponent* Owner)
: Tform(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall Tform1::Button1Click(TObject *Sender)
{
UINT flag;
AnsiString s;
TRegIniFile *RegFile=new TRegIniFile("");
RegFile->RootKey=HKEY_LOCAL_MACHINE;
if(logoff->Checked)
flag=EWX_LOGOFF;
else if(shutdown->Checked)
flag=EWX_SHUTDOWN;
else if(restart->Checked)
flag=EWX_REBOOT;
if(run->Checked)
s="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
else if(runonce->Checked)
s="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce";
RegFile->WriteString(s,"畫筆","C:\\Program Files\\Accessories\\MSPAINT.EXE");
RegFile->Free();
ExitWindowsEx(flag,0);
}
//--------------------------------------------------------------------------- 
五 後記 本程序如果在NT下運行,調用進程必須用函數AdjustTokenProvileges使SE_SHUTDOWN_NAME特權有效,相關內容可參閱本文參考文獻。 參考文獻: 1 《BORLAND® C BUILDERTM 編程指南》 [美]John Miano等著 郝傑等譯 2 《新編Windows API 參考大全》 朱友芹等編 3 C Builder 4.0的在線幫助 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
系統時間:2024-04-19 8:01:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!