程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> WindowsAPI函數使用技巧

WindowsAPI函數使用技巧

編輯:Delphi

Windows API函數使用技巧
得到WINDOWS的SYSTEM路徑:
    方法:
             var
                  MySysPath : PCHAR ;
             begin
                     GetMem(MySysPath,255);
                     GetSystemDirectory(MySysPath,255);
             end;
    注:MySysPath為SYSTEM路徑

 
得到程序的路徑
  ExtractFileDir(Application.Exename);


 
察看文件是否存在
  FileExists(FileName:String):Boolean;


 
改變文件擴展名
  ChangeFileExt(FileName:String)


 
得到文件的擴展名
  ExtractFileExt(FileName:String):String;


 
如何取得Windows的臨時文件目錄?
適合版本:Delphi 3,2.0,1.0

Windows 95 & NT都指定了放置臨時文件的目錄,然而,用戶能改變臨時目錄的位置而不使用缺省的目錄。這篇文章的目的是告訴你如何得到Windows 95 & NT當前的臨時目錄位置。這個Windows API函數 GetTempPath就是解決這個問題的。其函數原形為:

DWORD GetTempPath(DWORD nBufferLength, LPTSTR lpBuffer);

下面的例子示范如何使用:

function GetTempDirectory: String;

var

TempDir: array[0..255] of Char;

begin

GetTempPath(255, @TempDir);

Result := StrPas(TempDir);

end;


備注:臨時目錄的確定原則:

1,如果有TMP環境變量則臨時目錄為TMP指定的目錄

2,如果沒有TMP環境變量而有TEMP環境變量,則為TEMP變量指定的目錄

3,如果TMP和TEMP都沒有定義,則取當前目錄為臨時目錄


 
程序不出現在任務欄

  一般Windows 95運行程序時都會在任務欄上出現按鈕,如果你的程序是一個監視程序,那麼出現按鈕就不是明智之舉了。要實現該功能就要在OnCreate事件裡利用到API函數SetWindowLong
procedure TForm1.FormCreate(sender:TObject);
begin
SetWindowLong(Application,Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
end;


 
改計算機名

改變計算機在網絡中的名字,重新啟動後才生效
SetComputerName(Hello World);

 
控制熱啟動

要使系統的熱啟動鍵(Ctrl+Alt+Del)失效,使用以下語句
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, 0, 0);
要恢復系統的熱啟動鍵(Ctrl+Alt+Del),使用以下語句
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, 0, 0);


 
臨時路徑

有時需要Windows的臨時路徑來做備份等工作,那麼就要知道路徑在哪,下面的程序幫你忙:
var aa:pchar;
begin
GetTempPath(20,aa); file://返回路徑名
edit1.text:=aa;
end;


 
返回程序執行參數

  有關 Delphi 傳入應用程式的命令列參數, 請參考以下的說明:
用ParamCount函數取得命令參數的個數:
呼叫 ParamStr(0), 傳回執行檔的檔名(含路徑)
呼叫 ParamStr(n), 傳回第n個參數的內容
procedure TForm1.FormCreate(Sender: TObject);
var
sFileName: string;
begin
if ParamCount > 0 then begin (* 有執行參數傳入 *)
sFileName := ParamStr(1); (* 取得參數內容 *)
if FileExists(sFileName) then
Memo1.Lines.LoadFromFile(sFileName)
else
Application.MessageBox(找不到指定的檔案, 訊息, 48);
end;
end;


 
關閉Windows

控制WINDOWS的開關:如關閉WINDOWS,重新啟動WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwReserved);是實現這一功能的API函數
首先定義常數
const
EWX_FORCE=4; file://關閉所有程序並以其他用戶身份登錄
EWX_LOGOFF=0; file://重新啟動計算機並切換到MS-DOS方式
EWX_REBOOT=2; file://重新啟動計算機
EWX_SHUTDOWN=1;//關閉計算機
運行時給How賦值,讓他等於EWX_SHUTDOWN或其他,調用以下語句
ExitWindowsEx(How,0);


 
關閉外部應用程序

如何在 Delphi 應用程序中, 去關閉外部已開啟的應用程序?
下面給出一段在 Delphi 中關閉“計算器”程序為例:
var
HWndCalculator : HWnd;
begin
// find the exist calculator window
HWndCalculator := Winprocs.FindWindow(nil, 計算器); // close the exist Calculator
if HWndCalculator <> 0 then
SendMessage(HWndCalculator, WM_CLOSE, 0, 0);
end;


 
得到執行程序的目錄

  SysUtils 單元中有 ExtractFileDir 與 ExtractFilePath兩個類似的函數, 用哪一個?沒有太大的關系。
  不過有以下的差別: ExtractFilePath 傳回值的最後一個字元是反斜槓“/”。
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(ExtractFileDir(Application.Exename));
// ie: c: emp
ShowMessage(ExtractFilePath(Application.Exename));
// ie: c: emp
end;
相同點: 如果執行文件在根目錄下(如:C:SAMPLE.EXE)的話, 兩者的傳回值相同, 且最後一個字符都是“/”。


 
使用GetFileVersionInfo 得到版本信息的例子 
Samples Using GetFileVersionInfo?

回答1:
  procedure GetBuildInfo(var V1, V2, V3, V4: Word);
  var
    VerInfoSize: DWORD;
    VerInfo: Pointer;
    VerValueSize: DWORD;
    VerValue: PVSFixedFileInfo;
    Dummy: DWORD;
  begin
  VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
  GetMem(VerInfo, VerInfoSize);
  GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
  VerQueryValue(VerInfo, , Pointer(VerValue), VerValueSize);
  with VerValue^ do
    begin
    V1 := dwFileVersionMS shr 16;
    V2 := dwFileVersionMS and $FFFF;
    V3 := dwFileVersionLS shr 16;
    V4 := dwFileVersionLS and $FFFF;
    end;
  FreeMem(VerInfo, VerInfoSize);
  end;
------------------------------------------
回答2
If you want a component, check out TVersionInfoResource at
delphi/">http://www.pobox.com/~bstowers/delphi/ in the My Stuff section. D1/D2/D3/C++B
compatible, freeware with full source code and a small demo.
And you can see the http://www.aye.net/~bstowers/delphi/
另一個component VersionInfo.zip


 
防止程序運行多個例程? 
More than one instance of program?

回答
 This is copied direct from my *.dpr file. You can work it for your own
use.

var
  hMutex : Thandle;
  WaitResult : word;
  BroadcastList : DWORD;
begin
     MessageID := RegisterWindowMessage(Check For Choice Previous Inst);
// register a message to use later on
     hMutex := createMutex(nil,false,pchar(App_Choice)); // grab a mutex
handle
     WaitResult := WaitForSingleObject(hMutex,10); // wait to see
if we can have exclusive use of the mutex
     if ( waitResult = WAIT_TIMEOUT ) then // if we cant then broadcast
the message to make the owner of the mutex respond
     { request that the running application takes focus }
       begin
          BroadcastList := BSM_APPLICATIONS;
          BroadcastSystemMessage(
BSF_POSTMESSAGE,@BroadcastList,MessageID,0,0); file://32 bit - broadcast the
message to all apps - only a prev inst will hear it.
       end
     else
&n

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved