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 下调试通过。 |