Delphi中的Win32 API应用六例

Delphi 串口通讯 本文介绍了在Win32系统中使用Delphi实现串口通信的方法。由于Win32禁止直接访问硬件,作者采用API函数实现串口通讯,详细说明了关键API函数如CreateFile、ReadFile、WriteFile等的用途。文章重点阐述了多线程环境下串口通信的实现,包括自定义WM_COMMNOTIFY消息、同步事件处理等关键技术。作者还提供了完整的Delphi 5.0程序代码,展示了串口初始化、数据读写等具体实现过程。该程序在Windows 98环境下测试通过,可稳定运行于两台PC之间的串口通信。文中特别强调 阅读详情
1、刷新桌面
在使用计算机的过程中,经常会碰到在Windows桌面上残留有程序运行后的留下一些痕迹,这时我们往往在Windows桌面上单击鼠标右键,然后选择刷新,使桌面变得干净、整洁。其实自己编代码来实现这个功能也很简单,调用一个函数SHChangeNotify即可。首先,在Delphi的单元文件的Uses部分手动添加上ShlObj,然后在按钮点击事件中加上代码如下:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NiL, NiL);
end;
这行代码将刷新桌面,就象你在 Windows桌面上单击鼠标右键,然后选择刷新一样。
2、向一个WinControl发送按键或字符
有好几种方法可以向一个 WinControl 发送按键或字符。SetKeyboardState 函数需要对应的 control 具有焦点,它可以发送较多的(尤其是特殊的)按键。使用 WM_CHAR 消息,则只要我们获得这个 control 的句柄,就可以向它发送字符,即使它是隐藏的。
procedure SendText(const h: HWND; const s: string);
var
i: integer;
begin
if h = 0 then
Exit;
if Length(s) = 0 then
Exit;
for i:= 1 to Length(s) do
begin
if Ord(s[i]) in [9, 13, 32..254] then
SendMessage(h, WM_CHAR, Ord(s[i]), 0);
end;
end;
3、检查功能键状态
在很多软件中都有功能键的状态显示。如小键盘数字锁定,大小写锁定等等,可以调用函数 GetKeyState() 取得功能键状态信息。
function IsTheKeyOn(i:integer) : Boolean;
begin
Result := 0 <> (GetKeyState(i) and $01);
end;
调用自定义函数 IsTheKeyOn() 的例程如下:
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
//检查NumLock
if IsTheKeyOn(vk_numlock) then
showmessage('NumLock ON')
else
showmessage('NumLock OFF');
//检查CapsLock
if IsTheKeyOn(vk_capital) then
showmessage('CapsLock ON')
else
showmessage('CapsLock OFF');
//检查ScrollLock
if IsTheKeyOn(vk_scroll) then
showmessage('ScrollLock ON')
else
showmessage('ScrollLock OFF');
end;
4、改变计算机屏幕分辨率
函数 ChangeDisplaySettings 可以用来改变计算机屏幕分辨率。
function SetScreenResolution(width, height: integer): Longint;
var
DeviceMode: TDeviceMode;
begin
with DeviceMode do begin
dmSize := SizeOf(TDeviceMode);
dmPelsWidth :=width;
dmPelsHeight := height;
dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
end;
Result := ChangeDisplaySettings(DeviceMode, CDS_UPDATEREGISTRY);
end;
上面这个自定义函数的调用例程如下:
var
OldWidth, OldHeight: integer;
//先得到当前屏幕的分辨率,以备恢复使用,然后将分辨率设置为 800*600
procedure TForm1.Button1Click(Sender: TObject);
begin
OldWidth := GetSystemMetrics(SM_CXSCREEN);
OldHeight := GetSystemMetrics(SM_CYSCREEN);
SetScreenResolution(800, 600);
end;
//恢复到原来的分辨率。
procedure TForm1.Button2Click(Sender: TObject);
begin
SetScreenResolution(OldWidth, OldHeight);
end;
还可以利用 ChangeDisplaySettings 函数来改变系统的色彩深度和刷新频率,在 Win32 SDK中有详细的说明,不妨自己试试吧。
5、简单、有效的延时
在程序代码中有时要用到延时,在要求不高的情况下,有一个简单的API函数 Sleep() 可供使用,但问题是如果使用 Sleep(),则不仅你的程序,就连系统也被挂起了。所以我们要另想办法,这时想到了函数 GetTickCount() ,这个函数用于获取自 windows 启动以来经历的时间长度(毫秒) ,在这里我们变通一下就可以用了:
Procedure Delay (Msecs : Integer);
var
FirstTickCount : real;
begin
FirstTickCount := GetTickCount;
Repeat
Application.ProcessMessages;
Until ((GetTickCount - FirstTickCount) >= LongInt (Msecs));
end;
在你的程序中调用上面这个自定义过程,和 Sleep() 比较一下,那个更好呢?
6、隐藏或者显示系统托盘区
我们知道通过函数 ShowWindow() 可以隐藏或显示任务栏,代码如下:
//隐藏任务栏
procedure TForm1.BitBtn1Click(Sender: TObject);
var
wndHandle : THandle;
wndClass : array[0..50] of Char;
begin
StrPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0], nil);
ShowWindow(wndHandle, SW_HIDE);
end;
//显示任务栏
procedure TForm1.BitBtn2Click(Sender: TObject);
var
wndHandle : THandle;
wndClass : array[0..50] of Char;
begin
StrPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0], nil);
ShowWindow(wndHandle, SW_RESTORE);
end;
如果我只是想隐藏或者显示系统托盘区,该怎么编写代码呢?方法如下;
procedure HideSysTray(visible:boolean);
var
Tray, Child : hWnd;
C : array[0..127] of char;
S : string;
begin
Tray := FindWindow('Shell_TrayWnd', NIL);
Child := GetWindow(Tray, GW_CHILD);
While Child <> 0
do begin
If GetClassName(Child, C, SizeOf(C)) > 0
Then Begin
S := StrPAS(C);
If UpperCase(S) = 'TRAYNOTIFYWND'
then begin
If visible
then ShowWindow(Child, 1)
else ShowWindow(Child, 0);
end;
end;
Child := GetWindow(Child, GW_HWNDNEXT);
end;
end;
当自定义过程 HideSysTray() 的参数为 False 时,托盘区隐藏,参数为 True 时,托盘区显示。
熟练掌握 Windows API 对提高我们的编程效率和技巧有着莫大帮助,希望以上代码能在您编写程序时起到抛砖引玉的作用。
以上程序在 Windows ME 中文版,Delphi5.0 下调试通过。
DelphiWindows API的深度融合:高效调用与应用实践 本文详细介绍了Delphi中调用Windows API的方法,包括基本概念、调用步骤、参数和返回值处理、错误处理、内存管理以及使用类型库等方面的内容,并通过实际代码示展示了API调用的过程。Delphi通过其丰富的VCL(Visual Component Library)封装了大量Windows API调用,但开发者也可以直接调用未封装的API函数,以实现特定功能。随着技术的发展,DelphiWindows API的集成将更加深入和智能,提供更多的自动化工具和安全特性,帮助开发者更高效地进行系统编程。 阅读详情

相关推荐

使用Win32 API EnumWindows函数在Delphi中枚举系统窗口

EnumWindowsWindows API 中的一个函数,用于枚举所有顶级窗口,并为每个窗口调用指定的回调函数。其函数原型如下:WNDENUMPROC lpEnumFunc, // 回调函数的地址LPARAM lParam // 用户提供的值传递给回调函数lpEnumFunc是一个指向回调函数的指针,这个回调函数必须被定义为接受两个参数:HWND和LPARAM类型的窗口句柄以及传递给 EnumWindows 的lParam。lParam是传递给回调函数的附加参数。

weixin_42611310的博客 1006

DELPHI获取电脑硬件信息

DELHI获取电脑硬件主板、CPU、网卡等信息

掌握Win32 Shell APIDelphi编程的艺术

本文是关于《Delphi宝典:Win32 Shell APIWindows 2000版》的读后感和总结。章节内容涵盖了DelphiWindows API的基本概念,包括Windows数据类型、句柄、常量和字符串处理,以及如何导入Windows函数。同时,文章详细介绍了窗口移动、信息获取和文件输入/输出等功能,展示了Delphi如何通过Win32 Shell API实现更深层次的Windows编程。

weixin_35696112的博客 382

Win32API(6.0) for Delphi

Win32 API for Delphi 6.0, Copyright (c) 2021-2024 WINSOFT Delphi language projection for Microsoft Win32 Metadata. Uses metadata from Microsoft Win32 Metadata project Supports Delphi 7 - 12 What's new Version 6.0 declarations generated from Windows.Win32.winmd version 62.0.23-preview

怎样在DELPHI中使用API函数

实际上,在DELPHI中调用WIN32 API函数与在C或C++中调用WIN32 API函数没有大的区别。DELPHI中将C或C++中引用 的WINDOWS.H头文件改写为WINDOWS.PAS单元,使WINDOWS API函数的定义符合PASCAL语法。而其他的头文件在DELPHI中也都有相应的.PAS单元一一对应,所以在DELPHI中调用API函数时,只须将相应的API函...

weixin_33863087的博客 254

linux API函数大全

还没有认真研读过,今晚在其他博客上找了比较久,今晚时间也不多了,等有空再细看   先复制先   获取当前执行路径:getcwd 1. API之网络函数  WNetAddConnection 创建同一个网络资源的永久性连接  WNetAddConnection2 创建同一个网络资源的连接  WNetAddConnection3 创建同一个网络资源的连接  WNetCancelConnection 结束一个网络连接  WNet...

神棍之路 1305

delphi之模拟按键

网上有很多的关于模拟按键的子,经过实验,我选如下一组函数 procedure SendShift(H: HWnd; Down: Boolean);var vKey, ScanCode: Word; lParam: longint;begin vKey:= $10; ScanCode:= MapVirtualKey(vKey, 0); lParam:= longint(...

weixin_33697898的博客 375

delphi-win32 API

本章内容: • 对象—以前和现在• 多任务和多线程• Win32内存管理• Win32的错误处理本章介绍Win32 APIWin32系统。还要讨论Win32系统的功能以及它与16位系统在功能上的几个 主要区别。本章内容不是关于 Win32系统的详细文档,而只是让对Win32系统有一个基本的了解。当已 经基本了解Win32操作后,就可以在任何需要的时候使用 Win32

laobai0335的专栏 951

Delphi Win32 API 使用的特殊情况

    我个人认为,Delphi 是当今最好的 Windows 可视化开发工具。其种种特点令开发如虎添翼。但要想发挥出 Delphi 真正的内含性能比如开发控件,实现一些特殊的功能,就必须直接调用 Win32 APIWin32 API 主要包含在 Windows95/98/NT/2K 的系统动态连接库中如 Kernel32.dll、User32.dll、Gdi32.dll、Shell32.dll

猫小的专栏 1147

WIN32中的串口通讯(Delphi

   在WIN32中的串口通讯(Delphi)  由在WIN32操作系统中禁止应用程序象DOS中那样直接访问计算机硬件,因此,无法象以前那样采用中断读写串口。但是在WIN32中我们可发采用两种方法访问串口:1、使用VB中的MSCOMM串口控件;2、采用API函数,本文主要介绍采用API函数实现串口通讯。  由于WM_COMMNOTIFY消息已被取消,故本文自定义了WM_COMMNOTIFY

gooddayme的专栏 584

Delphi下用Windows API创建窗体

这是一个很好的编程!!!

Win32各种API函数的Delphi单元

Win32各种API函数的Delphi单元

关于Win32API中的MAKELONG

<br />Win32API中有一个MAKELONG函数,其实是一个宏,其介绍如:<br /> <br />MAKELONG macro creates an unsigned 32-bit value by concatenating two given 16-bit values. <br /> <br />DWORD MAKELONG( <br />  WORD wLow, // low-order word of long value <br />  WORD wHigh // high-order

PBGun的专栏 6025

delphiapi函数

出处:http://www.itonv.cn/forum.php?mod=viewthread&tid=1716&page=1      什么是API函数  Win32 API即为Windows应用程序编程接口(Application Programming Inte**ce)。所有在Win32平台上运行的应用程序都可以调用这些函数。  早期的PC机内存非常少,Windo

fang16388的专栏 3533

Delphi Win32核心API参考学习记录(一)

unit CreateAWindowu;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedu

slf0205的专栏 1128

Windows API ——创建窗口步骤

在这个过程中,我们要先用TranslateMessage(&msg),是 Windows 操作系统中的一个函数调用,它的作用是将一个原始的键盘消息(keyboard message)翻译成对应的字符消息(character message),或者说将键盘消息转换为对应的字符消息。不同的消息会对应不同的操作选项,说实在,就是一个回调函数,用来对消息进行处理的函数。在这个步骤中我们使用了CreateWindow这个函数,就是为了创建窗口,当然光创建是不会显示这个窗口的,所以我们还要借助显示窗口函数。

itehima的博客 2361
上一篇: SQL语句导入导出大全
下一篇: 共享软件防破解的实用招法
hedylin
博客等级 码龄25年 35粉丝 71原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值