Delphi中调用API函数经验点滴

Delphi中调用API函数经验点滴

  在Delphi中调用Windows API 函数十分方便,只需在单元的uses段加入Windows 单元名即可(对于由Delphi自动创建的单元,该项工作已经完成)。单元Windows.pas 已经由Delphi编写并直接提供开发者引用。笔者在开发Windows 应用时对于几个特别的API 函数总结了一些经验供大家参考。

一、关闭系统

  对于某些特殊的应用程序,可能需要进行关闭系统的操作,可以调用函数ExitWindows 或者ExitWindowsEx 来实现。

  在Delphi中函数ExitWindows 的语法如下:

  function ExitWindows(dwReserved: Cardinal; Code: Word): LongBool;

  如果调用该函数成功,则返回True,否则返回False ;成功调用该函数将执行“关闭所有程序并以其他身份登录(Windows 95)”或“注销(Windows 98)”操作。其中的参数dwReserved和参数Code都必须是0 。

  例如,要实现注销操作,只需要在适当的位置写入如下语句:

  ExitWindows(0, 0);

  执行关闭计算机或重新启动计算机的操作,可以通过调用函数ExitWindowsEx 来实现。

  在Delphi中函数ExitWindowsEx 的语法如下:

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

  如果调用该函数成功,则返回True,否则返回False ;其中的参数uFlags的不同将决定执行不同的关闭操作:

  EWX_FORCE 强制终止所有的进程。如果设置了此参数,Windows 将不会向正在运行的应用程序发送消息WM_QUERYENDSESSION和WM_ENDSESSION ,这将可能导致数据丢失。因此,除非特别紧急或特别的情况(如应用程序死锁或系统资源濒临崩溃等),不要使用该参数。

  EWX_LOGOFF 关闭所有与当前调用函数ExitWindowsEx 相关的进程并注销用户。

  EWX_POWEROFF关闭系统并关闭电源。其中,关闭电源要求系统应支持power-off 特性。

  EWX_REBOOT 关闭系统并重新启动计算机。

  EWX_SHUTDOWN在安全关闭电源后关闭系统。该操作将所有的缓存刷新到磁盘并停止所有正在运行的进程。

  参数dwReserved被函数所忽略,可以是任意值。

  例如,要强制注销,可以通过如下语句实现:

  ExitWindowsEx(EWX_FORCE, 0);

  再如,要重新启动计算机,可以通过如下语句实现:

  ExitWindowsEx(EWX_REBOOT, 0);

  需要提醒大家注意的是,在很多情况下,只有参数EWX_SHUTDOWN能够成功关闭计算机电源。

二、弹出模式化对话框

  在Delphi中,提供模式化对话框的方法很多,现对几种比较常用的方法做如下比较:

  1) 直接调用Windows API 函数MessageBox

  该方法一般情况下使用正常,而且根据不同的操作系统将显示相应的中文或英文按钮标题。而在笔者曾经开发的系统中,偶尔会出现该函数没有锁定Handle所指的窗口的情况。通过观察发现,当入口参数的窗口句柄是Application.MainForm的窗口句柄时,没有出现类似情况。因此,建议大家甚用。

  2) 调用Delphi提供的函数MessageDlg

  该方法的不足之处是,对话框的按钮标题是英文。

  3) 调用Delphi提供的过程ShowMessage

  该方法默认将应用程序的标题作为对话框的标题,并且仅仅是信息提示框,不太灵活。

  4) 调用函数Application.MessageBox

  该方法是笔者强力推荐使用的方法。该方法的使用效果与Windows API 函数MessageBox完全相同,并且不会出现有时没有锁定当前活动窗口的情况。

  例如:

  Aplication.MessageBox(Handle, ‘这是一条警告信息。’, ‘警告’, MB_OK + MB_ICONEXCLAMATION);

三、防止多次载入应用程序实例

  某些应用程序需要禁止用户载入多次实例。比如,控制面板中的应用程序,不管用户打开多少次,同一应用程序只有一个实例,而且每一次试图重复打开都会自动激活已经存在的实例。

  Windows API 提供了函数FindWindow,可以是应用程序在启动时检查自己是否已经存在。

  该函数在Delphi中的语法是:

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

  其中,参数lpCalssName 是要查找的窗口的类的名称,参数lpWindowName是要查找的窗口的标题(Caption)。 如果找到了相应的窗口实例,将返回一个非0 的该窗口句柄的整型值,否则返回0 。因此,只要判断应用程序的主窗口(或者伴随着应用程序存在而存在的窗口)是否存在就可以判断是否已经有实例存在了。

  例如:

  H := FindWindow(‘TForm1’, nil);

  if H = 0 then begin

   ShowMessage(‘没有发现相同的应用程序实例。’);

   //加入加载应用程序的语句

   //…

  end else begin

   ShowMessage(‘应用程序已经加载。’);

   SetActiveWindow(H);

  end;

  其中,参数lpWindowName的位置以Delphi保留字nil 代替,是因为窗口的标题可能在应用程序中是变化的。Windows API 函数SetActiveWindow 用于指定活动窗口。

转载于:https://www.cnblogs.com/myamanda/articles/1630445.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110826.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Android注册表_手机注册表文件在哪里

    Android注册表_手机注册表文件在哪里/data/system/packages.plist com.google.android.ears100430/data/data/com.google.android.earsdefault3003,1028,1015com.qualcomm.timeservice100680/data/data/com.qualcomm.timeserviceplatformno

    2022年10月15日
  • 字节转换_1MB等于多少字节?

    字节转换_1MB等于多少字节?字节:计算机中最小的存储单位就是字节,所有的存储数据都以bit为形式存储;以下简单介绍关于bit相关的单位运算规则;8bit(比特)=1B-Byte(字节)1024B-Byte(字节)

  • 图像滤镜艺术—保留细节的磨皮滤镜之PS实现

    图像滤镜艺术—保留细节的磨皮滤镜之PS实现本文介绍了一种极为简单的PS磨皮实现过程,这个过程将有对应的程序实现,效果也将一模一样,这里跟大家分享一下!

  • 素数算法总结

    素数算法总结素数算法总结转载自:_Wilbert在平时做题目或者进行预算的时候,素数的出现次数总是十分频繁。今天我们就来一点一点的说一说关于素数的一些算法。素数算法总结朴素判断素数算法Miller_Rabin素性测试筛选法容斥原理Meissel-Lehmer算法朴素判断素数算法就判断素数而言,事实上是非常简单的了。根据定义,判断一个整数n是否是素数,只需要去判断在整数区间[2,n-1]之内

  • 如何找到字符串中的最长回文子串?「建议收藏」

    如何找到字符串中的最长回文子串?「建议收藏」作者|channingbreeze责编|胡巍巍小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司。可是努…

  • 算法的时间与空间复杂度(一看就懂)

    算法的时间与空间复杂度(一看就懂)算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的「时间」和「空间」两个维度去考量。 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号