delphi调用windows api
生活随笔
收集整理的這篇文章主要介紹了
delphi调用windows api
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在Delphi中調(diào)用Windows API 函數(shù)十分方便,只需在單元的uses段加入Windows 單元名即可(對于由Delphi自動創(chuàng)建的單元,該項工作已經(jīng)完成)。單元Windows.pas 已經(jīng)由Delphi編寫并直接提供開發(fā)者引用。筆者在開發(fā)Windows 應(yīng)用時對于幾個特別的API 函數(shù)總結(jié)了一些經(jīng)驗供大家參考。以下開發(fā)經(jīng)驗均在Windows 9x中適用。?
Delphi已經(jīng)封裝了copyfile,在windows.pas中.(uses Windows就是引用windows.pas)
一、關(guān)閉系統(tǒng)?
對于某些特殊的應(yīng)用程序,可能需要進(jìn)行關(guān)閉系統(tǒng)的操作,可以調(diào)用函數(shù)ExitWindows 或者ExitWindowsEx 來實(shí)現(xiàn)。?
在Delphi中函數(shù)ExitWindows 的語法如下:?
function ExitWindows(dwReserved: Cardinal; Code: Word): LongBool;?
如果調(diào)用該函數(shù)成功,則返回True,否則返回False ;成功調(diào)用該函數(shù)將執(zhí)行“關(guān)閉所有程序并以其他身份登錄(Windows 95)”或“注銷(Windows 98)”操作。其中的參數(shù)dwReserved和參數(shù)Code都必須是0 。?
例如,要實(shí)現(xiàn)注銷操作,只需要在適當(dāng)?shù)奈恢脤懭肴缦抡Z句:?
ExitWindows(0, 0);?
執(zhí)行關(guān)閉計算機(jī)或重新啟動計算機(jī)的操作,可以通過調(diào)用函數(shù)ExitWindowsEx 來實(shí)現(xiàn)。?
在Delphi中函數(shù)ExitWindowsEx 的語法如下:?
function ExitWindowsEx(uFlags, dwReserved: Cardinal): LongBool;?
如果調(diào)用該函數(shù)成功,則返回True,否則返回False ;其中的參數(shù)uFlags的不同將決定執(zhí)行不同的關(guān)閉操作:?
EWX_FORCE 強(qiáng)制終止所有的進(jìn)程。如果設(shè)置了此參數(shù),Windows 將不會向正在運(yùn)行的應(yīng)用程序發(fā)送消息WM_QUERYENDSESSION和WM_ENDSESSION ,這將可能導(dǎo)致數(shù)據(jù)丟失。因此,除非特別緊急或特別的情況(如應(yīng)用程序死鎖或系統(tǒng)資源瀕臨崩潰等),不要使用該參數(shù)。?
EWX_LOGOFF 關(guān)閉所有與當(dāng)前調(diào)用函數(shù)ExitWindowsEx 相關(guān)的進(jìn)程并注銷用戶。?
EWX_POWEROFF關(guān)閉系統(tǒng)并關(guān)閉電源。其中,關(guān)閉電源要求系統(tǒng)應(yīng)支持power-off 特性。?
EWX_REBOOT 關(guān)閉系統(tǒng)并重新啟動計算機(jī)。?
EWX_SHUTDOWN在安全關(guān)閉電源后關(guān)閉系統(tǒng)。該操作將所有的緩存刷新到磁盤并停止所有正在運(yùn)行的進(jìn)程。?
參數(shù)dwReserved被函數(shù)所忽略,可以是任意值。?
例如,要強(qiáng)制注銷,可以通過如下語句實(shí)現(xiàn):?
ExitWindowsEx(EWX_FORCE, 0);?
再如,要重新啟動計算機(jī),可以通過如下語句實(shí)現(xiàn):?
ExitWindowsEx(EWX_REBOOT, 0);?
需要提醒大家注意的是,在很多情況下,只有參數(shù)EWX_SHUTDOWN能夠成功關(guān)閉計算機(jī)電源。?
二、彈出模式化對話框?
在Delphi中,提供模式化對話框的方法很多,現(xiàn)對幾種比較常用的方法做如下比較:?
1) 直接調(diào)用Windows API 函數(shù)MessageBox?
該方法一般情況下使用正常,而且根據(jù)不同的操作系統(tǒng)將顯示相應(yīng)的中文或英文按鈕標(biāo)題。而在筆者曾經(jīng)開發(fā)的系統(tǒng)中,偶爾會出現(xiàn)該函數(shù)沒有鎖定Handle所指的窗口的情況。通過觀察發(fā)現(xiàn),當(dāng)入口參數(shù)的窗口句柄是Application.MainForm的窗口句柄時,沒有出現(xiàn)類似情況。因此,建議大家甚用。?
2) 調(diào)用Delphi提供的函數(shù)MessageDlg?
該方法的不足之處是,對話框的按鈕標(biāo)題是英文。?
3) 調(diào)用Delphi提供的過程ShowMessage?
該方法默認(rèn)將應(yīng)用程序的標(biāo)題作為對話框的標(biāo)題,并且僅僅是信息提示框,不太靈活。?
4) 調(diào)用函數(shù)Application.MessageBox?
該方法是筆者強(qiáng)力推薦使用的方法。該方法的使用效果與Windows API 函數(shù)MessageBox完全相同,并且不會出現(xiàn)有時沒有鎖定當(dāng)前活動窗口的情況。?
例如:?
Aplication.MessageBox(Handle, '這是一條警告信息。', '警告', MB_OK + MB_ICONEXCLAMATION);?
三、防止多次載入應(yīng)用程序?qū)嵗?
某些應(yīng)用程序需要禁止用戶載入多次實(shí)例。比如,控制面板中的應(yīng)用程序,不管用戶打開多少次,同一應(yīng)用程序只有一個實(shí)例,而且每一次試圖重復(fù)打開都會自動激活已經(jīng)存在的實(shí)例。?
Windows API 提供了函數(shù)FindWindow,可以是應(yīng)用程序在啟動時檢查自己是否已經(jīng)存在。?
該函數(shù)在Delphi中的語法是:?
function FindWindow(lpClassName: PChar, lpWindowName: PChar): HWND;?
其中,參數(shù)lpCalssName 是要查找的窗口的類的名稱,參數(shù)lpWindowName是要查找的窗口的標(biāo)題(Caption)。 如果找到了相應(yīng)的窗口實(shí)例,將返回一個非0 的該窗口句柄的整型值,否則返回0 。因此,只要判斷應(yīng)用程序的主窗口(或者伴隨著應(yīng)用程序存在而存在的窗口)是否存在就可以判斷是否已經(jīng)有實(shí)例存在了。?
例如:?
H := FindWindow('TForm1', nil);?
if H = 0 then begin?
ShowMessage('沒有發(fā)現(xiàn)相同的應(yīng)用程序?qū)嵗?#39;);?
//加入加載應(yīng)用程序的語句?
//...?
end else begin?
ShowMessage('應(yīng)用程序已經(jīng)加載。');?
SetActiveWindow(H);?
end;?
其中,參數(shù)lpWindowName的位置以Delphi保留字nil 代替,是因為窗口的標(biāo)題可能在應(yīng)用程序中是變化的。Windows API 函數(shù)SetActiveWindow 用于指定活動窗口。
實(shí)際測試
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject); begin//兩種方式都可以 //Windows.CopyFile('C:\1.txt','C:\2.txt',false); CopyFile('C:\1.txt','C:\2.txt',false);end;end.
總結(jié)
以上是生活随笔為你收集整理的delphi调用windows api的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DLL的编写和使用
- 下一篇: Delphi中String与PAnsiC