Windows 的API 函 数 是 应 用 程 序 开 发 的 有 力 辅 助 工 具, 对 它 们 的 恰 当 使 用, 可 大 大 增 强 和 改 进 应 用 程 序 与 系 统 打 交 道 的 能 力, 使 自 己 的 程 序 真 正 具 有 底 层 操 作 功 能。 作 为RAD 工 具 的 基 础 代 表,BORLAND DELPHI 虽 然 本 身 也 已 提 供 了 大 量 强 有 力 的 函 数 和 过 程, 但 在 某 些 场 合、 要 求 下, 使 用API 函 数 将 使 你 的 程 序 进 一 步 得 到 改 善, 并 可 拓 宽 范 围, 简 化 程 序 代 码。
---- 在DELPHI 中 引 用API 函 数, 和 使 用DELPHI 本 身 的 函 数、 过 程 几 乎 没 有 区 别。 在DELPHI 目 录 下 有 一 个WINDOWS.PAS 文 件, 凡 是 在 其 中 声 明 过 的API 函 数, 都 可 在 编 程 时 直 接 引 用 而 无 须 另 加 说 明。 只 是 要 注 意, 标 准API 函 数 都 是 以C 或C++ 为 标 准 进 行 数 据 结 构 定 义 的, 而DELPHI 使 用 的 是OBJECT PASCAL 语 言, 因 此 在 引 用 时 应 特 别 注 意 参 数 和 函 数 本 身 的 数 据 类 型。 如 一 个API 函 数 若 为 布 尔 值, 则 在DELPHI 中 就 应 以TRUE、FALSE 而 不 能 用0、 非0 来 对 返 回 值 进 行 判 断。
---- 下 面 以 三 个 小 例 子 来 说 明API 函 数 在DELPHI 中 的 使 用。
---- 一、 本 地 化 消 息 框
---- 想 让 自 己 的 消 息 框 显 示“OK”、“Cancel” 还 是“ 确 定”、“ 取 消” ? 如 果 想 使 程 序 彻 底 本 地 化, 那 么 还 是 放 弃MessageDlg 和ShowMessage 吧 — — 都 怪DELPHI 没 有。 用MessageBox 这 个API 函 数 照 样 方 便。
---- 使 用 语 法 为:
MessageBox (HWND:hWND,lpMessage:
PChar,lpCaption:PChar,uType:Cardinal);
---- 各 参 数 中, 第 一 个 为 消 息 框 所 属 的 窗 口 句 柄, 第 二 个 为 要 显 示 的 消 息, 第 三 个 为 消 息 框 的 标 题, 第 四 个 为 消 息 框 的 类 型, 函 数 返 回 值 为 整 型 数。
---- 为 使 消 息 框 有 所 归 属, 第 一 个 参 数 设 为 当 前 窗 口, 获 取 其 句 柄 的 方 法 是 使 用 另 一 个API 函 数:GetActiveWindows( ), 且 不 需 任 何 参 数。
---- 例1)Message box 示 例:
---- 1 . 主 要 构 件 及 属 性 的 设 置:
form1:caption : messagebox示例
bordericons : biMaximize和biHelp设为false
panel1:caption :文字部分 Alignment : taLeftJustify
panel2:caption :图象部分 Alignment : taLeftJustify
button1~button12 : caption分别为:确定、确定取消、
确定帮助取消、是否、重试取消、终止重试取消、
信息、提问、系统图标、警告、停止、组合方式
bitbtn1:kind : bkClose
---- 如 图 一 所 示:
---- 2 . 事 件 说 明:( 详 见 源 程 序, 下 仅 举 两 例)
{文字部分以button2click( )为例}
procedure TForm1.Button2Click(Sender: TObject);
begin
case messagebox(getactivewindow(),
'显示确定、取消框','例子',
mb_okcancel)
of idok:messagebox(getactivewindow(),
'您按下的是“确定”按钮',
'结果',mb_ok);
idcancel:messagebox(getactivewindow(),
'您按下的是“取消”按钮',
'结果',mb_ok);
end;
end;
{图象部分以button8click( )为例}
procedure TForm1.Button8Click(Sender: TObject);
begin
messagebox(getactivewindow(),'显示警告图标','例子',
mb_iconwarning)
end;
---- 二、 改 进Windows 9x 的 系 统 登 录 的 安 全 性:
---- Win 9x 的“ 用 户 登 录” 窗 口 可 谓 来 者 不 拒, 密 码 不 对 照 样 可 以“ 登 堂 入 室”, 系 统 为 用 户 保 留 的 个 人 设 置 等 信 息 也 就 毫 无 保 密 性 可 言, 通 过 查 看Profiles 目 录, 可 轻 松 地 将 其 复 制 或 删 除。 虽 然Win95、Win98 的 应 用 对 象 是 个 人 用 户, 但 在 某 些 场 合 下, 还 是 让 登 录 窗 口 起 点 作 用 的 好。
---- 要 使 系 统 登 录 具 有 安 全 性, 对 非 法 使 用 者 真 正 能 拒 之 门 外, 不 妨 用 两 个API 函 数 来 实 现 此 目 的。
---- 例 二) 系 统 登 录 检 查
---- 1 . 主 要 构 件 及 属 性 设 置:
form1:caption:CheckUser
height、width: 设 为 最 小 值
---- 2 . 事 件 说 明:
//定义变量
private
size:cardinal;
name:pchar;
entry:boolean;{ Private declarations }
procedure TCheckUser.FormShow(Sender: TObject);
begin
size:=64;
name:=StrAlloc(64) ;
{检查用户名,判断是按了“取消”按钮还是键入了新用户名}
if GetUsername(name,size)
then if name=’wj’ //‘wj’为笔者机器的登录用户名
{在此,若允许的合法使用者不止一个,还可利用关系运算指定
一个以上的用户进入。
如:if (name=’computer1’) or (name=’computer2’)
}
then entry:=true;
close;
end;
procedure TCheckUser.FormClose
(Sender: TObject; var Action: TCloseAction);
begin
if not entry
then ExitWindowsEx(EWX_REBOOT,32);
//若用户名不对,则重新启动Windows
end;
procedure TCheckUser.FormCreate(Sender: TObject);
begin
entry:=false;//设定初始值
end;
---- 编 译 完 毕 后, 生 成EXE 文 件, 然 后 打 开 注 册 表 — — 使 用Regedit, 找 到HKEY_LOCAL_MACHINE\SOFTWARE\Micr\Windows\ CurrentVersion\RUN 行, 添 加 键 值 名( 如:CheckUser) 及 键 值(EXE 文 件 所 在 的 完 整 路 径)。 如 图 所 示:
---- 好 了, 重 新 启 动 一 次, 没 有 正 确 的 密 码 还 能 进 入 吗 ?
---- 三 . 没 有“ 媒 体 播 放 器” 的 声 音 播 放
---- 日 前 做 了 一 个 小 程 序, 想 在“ 关 于” 窗 口 加 上 一 段 声 音 说 明, 但 小 小 的“ 关 于”FORM 放 上 一 个 长 长 的、Visible 属 性 需 为False 的MediaPlayer 构 件 实 在 别 扭。 东 查 西 找 之 下, 还 是 靠API 函 数SNDPLAYSOUND() 解 决 了 问 题 — — 从 而 摆 脱 了MediaPlayer 的“ 束 缚”。 例 三) 使 用API 函 数 控 制 声 音 文 件 的 播 放:( 部 分 代 码)
procedure TaboutBox.FormShow(Sender: TObject);
begin
// 播 放 当 前 目 录 下 的welcome.wav 文 件
sndplaysound(‘welcome.wav’,snd_async)
end;
procedure TAboutBox.FormClick(Sender: TObject);
begin
// 停 止 播 放
sndplaysound(‘’,snd_async);
end;
---- 别 忘 了, 在USES 子 句 中 加 入mmsystem 单 元。 如 果 只 需 要 播 放 声 音, 那 么 一 条API 函 数 就 能 实 现 功 能 的 还 用 得 着MediaPlaye吗?