日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

delphi调用windows api

發(fā)布時間:2024/4/11 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)用程序,可能需要進行關(guān)閉系統(tǒng)的操作,可以調(diào)用函數(shù)ExitWindows 或者ExitWindowsEx 來實現(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 。?

  例如,要實現(xiàn)注銷操作,只需要在適當?shù)奈恢脤懭肴缦抡Z句:?

  ExitWindows(0, 0);?

  執(zhí)行關(guān)閉計算機或重新啟動計算機的操作,可以通過調(diào)用函數(shù)ExitWindowsEx 來實現(xiàn)。?

  在Delphi中函數(shù)ExitWindowsEx 的語法如下:?

  function ExitWindowsEx(uFlags, dwReserved: Cardinal): LongBool;?

  如果調(diào)用該函數(shù)成功,則返回True,否則返回False ;其中的參數(shù)uFlags的不同將決定執(zhí)行不同的關(guān)閉操作:?

  EWX_FORCE 強制終止所有的進程。如果設(shè)置了此參數(shù),Windows 將不會向正在運行的應(yīng)用程序發(fā)送消息WM_QUERYENDSESSION和WM_ENDSESSION ,這將可能導(dǎo)致數(shù)據(jù)丟失。因此,除非特別緊急或特別的情況(如應(yīng)用程序死鎖或系統(tǒng)資源瀕臨崩潰等),不要使用該參數(shù)。?

  EWX_LOGOFF 關(guān)閉所有與當前調(diào)用函數(shù)ExitWindowsEx 相關(guān)的進程并注銷用戶。?

  EWX_POWEROFF關(guān)閉系統(tǒng)并關(guān)閉電源。其中,關(guān)閉電源要求系統(tǒng)應(yīng)支持power-off 特性。?

  EWX_REBOOT 關(guān)閉系統(tǒng)并重新啟動計算機。?

  EWX_SHUTDOWN在安全關(guān)閉電源后關(guān)閉系統(tǒng)。該操作將所有的緩存刷新到磁盤并停止所有正在運行的進程。?

  參數(shù)dwReserved被函數(shù)所忽略,可以是任意值。?

  例如,要強制注銷,可以通過如下語句實現(xiàn):?

  ExitWindowsEx(EWX_FORCE, 0);?

  再如,要重新啟動計算機,可以通過如下語句實現(xiàn):?

  ExitWindowsEx(EWX_REBOOT, 0);?

  需要提醒大家注意的是,在很多情況下,只有參數(shù)EWX_SHUTDOWN能夠成功關(guān)閉計算機電源。?

二、彈出模式化對話框?
  在Delphi中,提供模式化對話框的方法很多,現(xiàn)對幾種比較常用的方法做如下比較:?

  1) 直接調(diào)用Windows API 函數(shù)MessageBox?

  該方法一般情況下使用正常,而且根據(jù)不同的操作系統(tǒng)將顯示相應(yīng)的中文或英文按鈕標題。而在筆者曾經(jīng)開發(fā)的系統(tǒng)中,偶爾會出現(xiàn)該函數(shù)沒有鎖定Handle所指的窗口的情況。通過觀察發(fā)現(xiàn),當入口參數(shù)的窗口句柄是Application.MainForm的窗口句柄時,沒有出現(xiàn)類似情況。因此,建議大家甚用。?

  2) 調(diào)用Delphi提供的函數(shù)MessageDlg?

  該方法的不足之處是,對話框的按鈕標題是英文。?

  3) 調(diào)用Delphi提供的過程ShowMessage?

  該方法默認將應(yīng)用程序的標題作為對話框的標題,并且僅僅是信息提示框,不太靈活。?

  4) 調(diào)用函數(shù)Application.MessageBox?

  該方法是筆者強力推薦使用的方法。該方法的使用效果與Windows API 函數(shù)MessageBox完全相同,并且不會出現(xiàn)有時沒有鎖定當前活動窗口的情況。?

  例如:?

  Aplication.MessageBox(Handle, '這是一條警告信息。', '警告', MB_OK + MB_ICONEXCLAMATION);?

三、防止多次載入應(yīng)用程序?qū)嵗?
  某些應(yīng)用程序需要禁止用戶載入多次實例。比如,控制面板中的應(yīng)用程序,不管用戶打開多少次,同一應(yīng)用程序只有一個實例,而且每一次試圖重復(fù)打開都會自動激活已經(jīng)存在的實例。?

  Windows API 提供了函數(shù)FindWindow,可以是應(yīng)用程序在啟動時檢查自己是否已經(jīng)存在。?

  該函數(shù)在Delphi中的語法是:?

  function FindWindow(lpClassName: PChar, lpWindowName: PChar): HWND;?

  其中,參數(shù)lpCalssName 是要查找的窗口的類的名稱,參數(shù)lpWindowName是要查找的窗口的標題(Caption)。 如果找到了相應(yīng)的窗口實例,將返回一個非0 的該窗口句柄的整型值,否則返回0 。因此,只要判斷應(yīng)用程序的主窗口(或者伴隨著應(yīng)用程序存在而存在的窗口)是否存在就可以判斷是否已經(jīng)有實例存在了。?

  例如:?

  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 代替,是因為窗口的標題可能在應(yīng)用程序中是變化的。Windows API 函數(shù)SetActiveWindow 用于指定活動窗口。


實際測試

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。