Delphi中的Win32 API应用六例

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 下调试通过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值