Delphi自帶的API函數/控件和Windows API【菜鳥必知!】

出處 : http://hi.baidu.com/flow0214/item/8c8dfa094bc8ece2f45ba641


什麼是API函數
  Win32 API即為Windows應用程序編程接口(Application Programming Interface)。所有在Win32平台上運行的
應用程序都可以調用這些函數。
  早期的PC機內存非常少,Windows的設計者們不僅要把大量的代碼和資源放入,而且還要留出足夠的空間讓應用程
序運行,解決這種矛盾的方法就是通過讓多個程序共享常用的代碼來實現,這些被共享的代碼就是今天所說的API函數
  隨著軟件技術的不斷發展,在Windows平台上出現了很多優秀的可視化編程環境,程序員可以採用“所見即所得”
的編程方式來開發具有精美用戶界面和功能的應用程序。這些可視化編程環境操作簡便、界面友好,比如:Visual
C++、Delphi和Visual Basic等。在這些工具中提供了大量的控件,實現了API的部分功能,加速了Windows應用程序的
開發。但程序員要想開發出更靈活、更實用、更具效率的應用程序,必然要涉及到直接使用API​​函數。
  API函數的分類
基本管理//分類以下的以此類推
windows //單元
操作系統的基本功能,提供分配內存、 //功能及庫文件
管理任務、裝入資源、文件操作等
shell例程
shellapi 
win32提供的外殼例程,
如加載其它程序、管理登錄等
mci接口
mmsystem 
多媒體mci編程接口(winmm.dll)
註冊表管理
regstr 
win32系統中註冊表的管理
消息傳送接口
mapi 
微軟消息傳送系統的編程接口(mapi32.dll)
winsocket 
winsock 
winsocket網絡編程接口(wsock32.dll)
標準對話框
comdlg 
win32的標準對話框,如打開文件、
打印等(comdlg32.dll)
activex 
activex 
對象連接與嵌入ole函數
win32外殼擴展
shlobj 
針對系統外殼的編程接口,
對資源管理器的某些功能或對象進行擴展
       API函數按不同功能被存放在不同的動態鏈接庫文件中,這些動態鏈接庫文件一般是以DLL為擴展名。在表1中,列
舉出了編程時較常用的幾大類API函數及其主要功能、庫文件名和對應的Delphi單元。
  Delphi調用API函數實例
  Delphi中定義了相應單元,給出了所有Win32 API函數的接口。Delphi調用API函數非常簡單,甚至不需要聲明外
部引用,只需將使用的單元名放在Uses子句中就可以,其它的工作全部由系統定義的單元完成。下面,我們給出幾個
Delphi中使用API​​函數的實例,幫助大家理解。
  1、在“文檔”菜單中添加新項及清空項目
  在Windows的開始菜單中有一個文檔菜單,保存了最近處理過的文檔信息,如何增加新項或將其清空呢?我們可以
利用API函數SHAddtoRecentDocs()來實現,它定義在Shlobj單元中,使用前要先在Uses中加以說明。下面為處理方法
  uses shlobj;
  procedure TForm1.Button1Click(Sender: TObject);
  begin
   SHAddtoRecentDocs(SHARD_PATH, Pchar('c:\mydir\aaa.txt')); //增加新的一項
  end;
  procedure TForm1.Button2Click(Sender: TObject);
  begin
   SHAddtoRecentDocs(SHARD_PATH, nil); //清空文檔菜單
  end;
  2、使窗口標題欄閃爍
  在Windows中,常用窗口標題欄的閃爍來提醒用戶,向你的程序中加入這一功能一定很有意思。API函數Flash
Windows( )可以使一個特定的窗口閃動一次,如果將其放在計時器中調用,標題欄閃爍就很容易實現。
  procedure TForm1.Button1Click(Sender: TObject);
  begin
   Timer1.Interval:=500; //計時器的間隔時間,每500毫秒觸發一次
   Timer1.Enabled:=Not Timer1.Enabled; //切換計時器的激活或停止狀態
  end;
  procedure TForm1.Timer1Timer(Sender: TObject);
  begin
   FlashWindow(Form1.Handle,TRUE); //閃爍標題欄
  end;
  FlashWindows()有兩個參數:第一個參數指明窗口的句柄;第二個參數指定窗口是閃動還是恢復始狀態。這個函
數定義在Windows單元中,是Delphi的缺省單元,故不必再用Uses子句進行說明。
  3、在程序中播放WAV聲音文件
  Windows啟動時那聲嘹亮的號角聲是否讓你感到振奮。OK!讓我們在自己的程序中來實現它。僅僅播放一個WAV聲
音文件,當然不需要勞駕MediaPlayer構件,API函數SndPlaySound()就可以很好地完成這一工作。它定義在MMSystem
單元中,有兩個參數:第一個指明WAV文件的路徑、文件名;第二個指明播放方式。實例如下:
  uses MMSystem;
  procedure TForm1.FormCreate(Sender: TObject);
  begin
   SndPlaySound('c:\windows\media\tada.wav',SND_ASYNC)
  end;
  API函數數量眾多,在平時的學習使用中不斷積累,加深理解,編程水平一定會有一個大的提高。
DELPHI的文章已經很多了,大家是不是被它強大的開發功能所折服?可視化編程的出現,使很多朋友圓了程序夢。的確,幾個控件的搭配再加上幾條語句,也許一個軟件就出來了。但是,你是否已不滿足使用別人的元件?想更深入的了解windows的編程?更換的掌握DELPHI?OK,請繼續往下看。
DOS下的INT21H對於開發DOS程序很重要,而對於在WINDOWS下開發程序,了解api函數是很有必要的。元件就像招式,而API函數就好比內功心法,有了高深的內力,那麼學習招式就易如反掌啦。所以,掌握的API函數越多,你就越可能成為DELPHI高手,甚至WINDOWS編程高手。所以,無論是C++,VB還是DELPHI都無一例外的支持API函數的調用,C++和DELPHI是全面支持API函數,而VB僅支持部分API函數(部分也不少了,已經有幾百條之多),尤其是DELPHI調用API函數最方便,已經達到與API函數合二為一的境界,調用API函數和使用自身的函數幾乎一樣。下面我將為大家詳細講解API函數在DELPHI中的使用,每條語句我都會寫個小例子,讓大家更能明白其是如何使用的。如果你認真看完本文後,相信大家一定會對DELPHI編程有更深的了解。但是千萬不要半途而廢,畏難怕繁,記住:欲練神功,必下苦功!學編程,可不是玩遊戲,不能弄個FPE啥作弊的。
(一)控件與消息函數
①語法:AnyPopup: BOOL; 
單元:windows.pas(該單元DELPHI會自行在USES裡加上,下同)
作用:判斷屏幕上是否存在任何彈出式窗口
返回值:BOOL,如存在彈出式菜單,則返回TRUE 
註解:對該函數來說,彈出式菜單包含所有可見的包容頂級窗口,無論彈出式還是重疊窗口
示例:
procedure TForm1.Button1Click(Sender: Tobject); 
begin 
if (AnyPopup) then 
Label1.Caption:='Pop-ups found: TRUE' 
else 
Label1.Caption:='Pop-ups found: FALSE'; 
end; 
②語法:EnableWindow(hWnd: HWND; bEnable: BOOL): BOOL;單元:windows .pas 
作用:指定的窗口裡允許或禁止所有鼠標及鍵盤輸入
返回值:BOOL,如果返回真,WINDOWS已經禁止,否則返回假
示例:
procedure TForm1.Button1Click(Sender: TObject); 
begin 
if (IsWindowEnabled(Edit1 .Handle)) then 
begin 
EnableWindow(Edit1.Handle,FALSE); 
Button1.Caption:='Enable Window'; 
Edit1.Text:='This window is disabled'; 
end 
else 
begin 
EnableWindow(Edit1.Handle,TRUE); 
Button1 .Caption:='Disable Window'; 
Edit1.Text:='This window is enabled'; 
end; 
end; 
③語法:FlashWindow(hWnd: HWND; bInvert: BOOL): BOOL; 
單元:windows.pas 
作用:閃爍顯示指定窗口。這意味著窗口的標題和說明文字會發生變化,似乎從活動切換到非活動狀態、或反向切換。通常對不活動的窗口應用這個函數,引起用戶的注意
返回值:BOOL,如窗口在調用前處於活動狀態,則返回TRUE 
註解:該函數通常與一個計數器組合使用,生成連續的閃爍效果。
在windows NT及windowsfor workgroup中,bInvert參數會被忽略。
但在windows 95中不會忽略
示例:
procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
FlashWindow(Form1.Handle, TRUE); 
FlashWindow(Application.handle, TRUE); 
end;
④語法:SetWindowText(hWnd: HWND;lpString: PChar): BOOL; 
單元:windows.pas 
作用:設置窗口的標題文字或控件的內容
返回值:設置成功返回TRUE,否則返回FALSE 
示例:
procedure TForm1.Button1Click( Sender: TObject); 
var 
TheText: PChar; 
TextLen: Integer; 
begin 
TextLen:=GetWindowTextLength(Form1.Handle); 
GetMem(TheText,TextLen); 
GetWindowText(Form1.Handle,TheText,TextLen+1); 
Edit1.Text:=string( TheText); 
FreeMem(TheText); 
end; 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
SetWindowText(Form1.Handle, PChar(Edit1.Text)); 
end; 
⑤語法:IsWindow(hWnd: HWND): BOOL; 
單元:windows.pas 
作用:判斷一個窗口句柄是否有效
返回值:有效返回TRUE,否則返回FALSE 
示例:
procedure TForm1.Button1Click(Sender: TObject); 
begin 
if (IsWindow(Button1.Handle)) then 
Button1.Caption:= 'TRUE' 
else 
Button1.Caption:='FALSE'; 
end; 
怎麼樣,還過癮吧?今天是第一次,就介紹些較容易接受的函數,否則朋友們肯定會喊吃不消。不知道朋友們對這樣的編排形式能夠接受嗎?還有,我會按照API函數的分類(控件與消息函數/硬件與系統函數/菜單函數/文本和字體函數/打印函數等等)分別介紹,但我不會介紹全部的API函數,否則大有騙稿費之嫌疑,而且本人的水平也難做到每個語句都有示例,只介紹平常用得上的,本人經常使用的函數,有時也會介紹一下比較隱秘但卻非常有用的API函數。
附tips(DELPHI技巧)一個:
如果有這樣一個目錄:
c:windowsmediatempabcsoundchime.wav 
我希望它能縮短成:
c:windows..soundchime.wav 
如何寫程序呢?
回答:
用下面的過程試試:
function shortenfilename(s : string) : string; 
var drive,curdrive : string[2]; 
dir,curdir : string[80]; 
name : string[20]; 
ext : string[5 ]; 
i : byte; 
begin 
for i:=1 to length(s) do s[i]:=upcase(s[i]); 
s:=fexpand(s); 
fsplit(s,dir,name,ext) ; 
drive:=copy(dir,1,2); 
dir:=copy(dir,4,length(dir)-3); 
getdir(0,curdir); 
curdrive:=copy(curdir,1,2); 
curdir :=copy(curdir,4,length(curdir)-3)+''; 
if drive=curdrive then begin 
if copy(dir,1,length(curdir))=curdir then begin 
i:=length(curdir); 
if length(dir)<>i then dir:=dir+''; 
shortenfilename:=copy(dir,i+1,length(dir)-i-1)+name+ext; 
end else shortenfilename:=copy(s,3,length(s) -2); 
end else shortenfilename:=s; 
end; 
注:本文只為提高DELPHI能力的朋友所寫,非一般入門級的教程,所以文中所有DELPHI的自身函數和一些基本技巧不再說明,請朋友查閱DELPHI的聯機幫助手冊。
為了能在Windows下快速開發應用程序,Delphi對Windows的控件都進行了很好的封裝,這樣,我們就可以直接使用Delphi的控件​​來編寫程序,而不用使用格式、調用控制複雜的API來進行開發,為我們節省了大量的開發時間。
  可有時候這些控件解決不了我們的問題,這個時候我們就不得不使用API​​了,也就是Windows的應用程序接口。這樣,問題也就隨之而來了,API是用C++語言編寫的,而Delphi的腳本語言是PASCAL,兩者使用的數據類型是不兼容了。那麼,如何在Delphi中調用數據類型不兼容的API呢,這就是本文中我為大家介紹的內容了。
  我們在Delphi中最常用到的一個數據類型是String類型,可API並不支持,那麼當我們需要從API中得到一個string類型的值時該如何去做呢?看看下面的程序:
function GetSysPath: string; 
var 
sTmp: string; 
begin 
result := ''; 
//調用WindowsApi得到Windows的系統路徑
SetLength(sTmp,256); 
GetSystemDirectory(PChar(sTmp),256); //這是一個API函數
SetLength(sTmp,StrLen(PChar(sTmp))); 
result := sTmp + '\'; 
end;
在該函數中,調用了API函數GetSystemDirectory,它的第一個參數是一個指向以NULL結尾字符串的指針,在Delphi中,這種數據類型是PCHAR,所以這裡要進行數據類型轉換,要寫成PChar (sTmp)。我們再看另外一個例子:
procedure TForm1.ChangeAppIcon; 
var 
icon: TIcon ; 
begin 
icon := TIcon.Create; 
try 
icon.Handle := ExtractIcon(application.Handle,pchar('D:\WINNT\regedit.exe'),0); //這是一個API函數
if icon.Handle <> 0 then 
application.Icon := icon; 
finally 
icon.Free; 
end; 
end;
  該過程通過API函數得到一​​個應用程序的圖標,來動態改變當前程序的圖標。API函數ExtractIcon返回的是一個HICON類型,是一個指向圖標的指針,如果寫成application.Icon = ExtractIcon(application.Handle, pchar('D:\WINNT\regedit.exe'), 0); 編譯肯定不通過,數據類型不一致嗎!application.Icon屬性是Ticon類型的,我們可以創建一個Ticon,把API的返回值賦給Ticon.Handle,最後將ICON賦值給application.Icon,就解決了我們的問題。
  通過上面的例子,我們可以看到,Delphi並不直接支持Windows中的數據類型,只能通過封裝的形式來支持。要熟練地調用API函數,我們一定要熟悉Delphi的封裝機制,多看、多寫,多去實踐,那麼,我們就能夠隨心所欲的調用API函數了。

你可能感兴趣的:(基礎,Windows,API,Delphi)