許多軟件都有自動(dòng)關(guān)機功能,特別是在長(cháng)時(shí)間下載的時(shí)候,這個(gè)功能可是使你不用以守候在計算機前面,而電腦卻能按照您事先的設定自動(dòng)關(guān)閉?,F在我們用visual C#來(lái)編寫(xiě)一個(gè)多功能的關(guān)機程序。該程序具有:定時(shí)關(guān)機、倒計時(shí)關(guān)機、關(guān)機提醒、系統信息獲取等四項功能, 可設定關(guān)機時(shí)間精確到秒。并且讓你很快掌握Visual C#中對API的操作程序。
一. 設計關(guān)閉Windows窗體
1. 界面的設計
新建一個(gè)標準工程,向工程中增加一個(gè)Windows窗體并向窗體中添加如下控件,并分別設置其屬性:
控件名 類(lèi)別 Text 控件名 類(lèi)別 Text
CheckBox1 CheckBox 自動(dòng)關(guān)機 GroupBox1 GroupBox 當前系統時(shí)間
CheckBox1 CheckBox 倒計時(shí)執行操作 GroupBox2 GroupBox 設定時(shí)間
CheckBox1 CheckBox 定時(shí)報警 TxtTime TextBox
ButCancle Button 取消 SetupTime DateTimePicker
ButReOpen Button 重新啟動(dòng) SetupDate DateTimePicker
ButClose Button 關(guān)機 Timer1 Timer 100
ButSysInto Button 系統信息 ButReLogin Button 注消
Windows窗體界面:
將窗體屬性中的caption設置為"關(guān)閉windows",名稱(chēng)設置為"frmmain"。
2. 在窗體類(lèi)中引用API函數
API函數是構筑Windows應用程序的基石,是Windows編程的必備利器。每一種Windows應用程序開(kāi)發(fā)工具都提供了間接或直接調用了Windows API函數的方法,或者是調用Windows API函數的接口,也就是說(shuō)具備調用動(dòng)態(tài)連接庫的能力。Visual C#和其它開(kāi)發(fā)工具一樣也能夠調用動(dòng)態(tài)鏈接庫的API函數。
在Visual C#中調用API的基本過(guò)程:
首先,在調用API之前,你必須先導入System.Runtime.InteropServices這個(gè)名稱(chēng)空間。該名稱(chēng)空間包含了在Visual C#中調用API的一些必要集合,具體的方法如下:
using System.Runtime.InteropServices ;
using System.Text ;
在導入了名稱(chēng)空間后,我們要聲明在程序中所要用到的API函數。我們的程序主要是獲取系統的相關(guān)信息,所以用到的API函數都是返回系統信息的。先給出在Visual C#中聲明API的方法:
[ DllImport("user32") ]
public static extern long SetWindowPos(long hwnd , long hWndInsertAfter, long X , long y , long cx, long cy, long wFlagslong) ;
其中,"DllImport"屬性用來(lái)從不可控代碼中調用一個(gè)方法,它指定了DLL的位置,該DLL中包含調用的外部方法;"kernel32"設定了類(lèi)庫名;"public"指明函數的訪(fǎng)問(wèn)類(lèi)型為公有的;"static"修飾符聲明一個(gè)靜態(tài)元素,而該元素屬于類(lèi)型本身而不是指定的對象;"extern"表示該方法將在工程外部執行,同時(shí)使用DllImport導入的方法必須使用"extern"修飾符;最后GetWindowsDirectory函數包含了兩個(gè)參數,一個(gè)為StringBuilder類(lèi)型的,另一個(gè)為int類(lèi)型的,該方法返回的內容存在于StringBuilder類(lèi)型的參數中。同時(shí),因為我們在這里使用到了StringBuilder類(lèi),所以在程序的開(kāi)始處,我們還得添加System.Text這個(gè)名稱(chēng)空間,方法同上。
聲明其它的在程序中所要用到的API函數:
[ DllImport("user32") ]
public static extern long ExitWindowsEx(long uFlags, long dwReserved ) ;
[ DllImport("shell32") ]
public static extern long ShellAbout(long uFlags, long dwReserved ) ;
3. 增加窗體類(lèi)的變量
long dwReserved ;
const int SHUTDOWN = 1 ;
const int REBOOT = 2 ;
const int LOGOFF = 0 ;
long sh ;
int counter , n ;
4. 編寫(xiě)窗體類(lèi)的方法
在窗體的Load(事件過(guò)程中編寫(xiě)如下代碼:
private void frmmain1_Load(object sender, System.EventArgs e )
{
file://用系統時(shí)間初始化組件
Time.Text = System.DateTime.Today.ToShortDateString( ) + " "+ System.DateTime.Today.ToLongTimeString( ) ;
}
在組件Timer1的OnTimer事件過(guò)程中編寫(xiě)如下代碼:
/ / 在組件Timer1的OnTimer事件過(guò)程中編寫(xiě)如下代碼:
private void Timer1_Timer(object sender, System.EventArgs e )
{
file://接收當前日期和時(shí)間,用于即時(shí)顯示
string CurrDate=System.DateTime.Today.ToShortDateString( ) ;
string CurrTime=System.DateTime.Today.ToShortTimeString( ) ;
file://隨時(shí)檢測設定的關(guān)機日期和時(shí)間是否有效
if( this.CheckBox1.Checked == true )
{
if(CurrDate== SetupDate.ToString( ) && CurrTime==SetupTime.ToString( ) )
ColseComputer( ) ;
}
}
private void ColseComputer( )
{ sh = ExitWindowsEx(SHUTDOWN, dwReserved) ; }
private void button1_Click(object sender, System.EventArgs e )
{
Form2 frm=new Form2( ) ;
frm.Show( ) ;
}
private void ButReOpen_Click(object sender, System.EventArgs e )
{ sh = ExitWindowsEx(REBOOT, dwReserved) ; }
private void ButReLogin_Click(object sender, System.EventArgs e )
{ sh = ExitWindowsEx(LOGOFF, dwReserved) ; }
private void ButCancle_Click(object sender, System.EventArgs e )
{ this.Close( ) ; }
private void ButClose_Click_1(object sender, System.EventArgs e )
{ sh = ExitWindowsEx(REBOOT, dwReserved) ; }