Delphi中的Win32 API应用六例

来源:互联网 发布:mac os x10.7 iso下载 编辑:程序博客网 时间:2024/05/16 11:11

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 下调试通过。  
原创粉丝点击