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

7 篇文章 0 订阅
4 篇文章 0 订阅
出處 : 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函數了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc DefFrameProc DefMDIChildProc DefWindowProc DispatchMessage GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx TranslateMessage UnhookWindowsHookEx WaitMessage Window Information AnyPopup ChildWindowFromPoint ChildWindowFromPointEx EnableWindow EnumChildWindows EnumPropsEx EnumThreadWindows EnumWindows FindWindow FindWindowEx GetClassInfoEx GetClassLong GetClassName GetClientRect GetDesktopWindow GetFocus GetForegroundWindow GetNextWindow GetParent GetProp GetTopWindow GetWindow GetWindowLong GetWindowRect GetWindowText GetWindowTextLength IsChild IsIconic IsWindow IsWindowEnabled IsWindowUnicode IsWindowVisible IsZoomed RemoveProp SetActiveWindow SetClassLong SetFocus SetForegroundWindow SetParent SetProp SetWindowLong SetWindowText WindowFromPoint Processes and Threads CreateEvent CreateMutex CreateProcess CreateSemaphore CreateThread DeleteCriticalSection DuplicateHandle EnterCriticalSection ExitProcess ExitThread GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetExitCodeProcess GetExitCodeThread GetPriorityClass GetThreadPriority GetWindowThreadProcessId InitializeCriticalSection InterlockedDecrement InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread SetEvent SetPr

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值