用過Visual Basic等編程語言的朋友們一定對其SendKeys函數非常熟悉。利用該函數可以把一個字符串發送到目標窗口(比如記事本)或控件(比如一個Edit控件)中,就好像是在目標窗口或控件中輸入這個字符串一樣。
但是,在Delphi中卻沒有為我們提供這樣的函數。其實,Borland的工程師們早就提供了一個方便的方法:在Delphi5.0企業版的安裝盤的\info\Extras\SendKeys\文件夾中,有一個sndKey32.Pas文件,
只需把該文件復制到Delphi的安裝目錄下\Lib\文件夾中,在工程中引用該文件後即可使用SendKeys函數.
其中兩個主要的函數為:
SendKeys(KeyString:Pchar;Wait:Boolean):Boolean;
AppActivate(WindowName:Pchar):Boolean;
用法為:
SendKeys函數向當前擁有焦點的窗口或控件發送字符串,KeySering為字符串的內容。
Wait指示是否等待接收字符串的窗口或控件處理完畢後返回。一般設為False即可。
例如:SendKeys('abcdefg',false);
值得一提的是,SendKeys函數支持發送特殊字符和組合字符,例如方向鍵、Alt、Ctrl組合鍵。
使用時,只需用規定的前綴指明即可。+為Shift,^為Ctrl,%為Alt。
例如:
'+monday ' 意為發送Shift+m和onday
'+(monday)'意為發送Shift+monday
對於不可見字符(比如方向鍵、F1~F11、回車等),可用{}將其括起來。
例如:
'%{F4}'即發送Alt+F4的組合送給應用程序。
更詳盡的說明請參照SndKey32.pas文件中的注釋。
AppActivate函數的作用是將某個窗口設置為當前窗口。只需將該窗口的標題傳過去即可。
若成功將某個窗口激活,則返回值為True.
例子:點擊發送後,上面的Edit控件的內容會被發送到下面的Edit控件裡面去。
程序很簡單,只要兩個Edit控件和一個Button控件。
源程序如下:
unit sendkey1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,sndkey32, StdCtrls; //注意該行要添加sndker32!!
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.SetFocus; //將焦點置於Edit2
SendKeys(Pchar(Edit1.Text),False); //將Edit1中的字符串發送給Edit2
//事先需進行轉換
end;
end.
很簡單,是不是?其實不僅Edit控件,像Memo、RichEdit等空件均可接收發送的字符。
上面的例子只是在本應用程序內傳遞字符串,
下面的例子是將字符串發送給Microsoft Word。其所用控件與上例相差不大。
源程序為:
unit unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs
,sndkey32, StdCtrls; //不要忘了sndKey32!
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ 該函數將焦點置於Word,若失敗,返回False}
function SetFocusToWord:boolean;
var
f:boolean;
begin
f:=true;
if not AppActivate('文檔 1 - Microsoft Word') then
{
字符串內容為:文檔空格1空格-空格Microsoft空格Word
}
begin
f:=False;
MessageDlg('沒找到Word!',mtError,[mbOk],0); //顯示錯誤
exit;
end;
result:=f;
end;
procedure SetFormActive; //該子程序將焦點置回
begin
Appactivate('SendToWord');
form1.SetFocus;
form1.Edit1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not SetFocusToWord then exit; //沒找到Word,退出
sendkeys(Pchar(form1.edit1.text),false); //找到了,發送字符串
SetFormActive;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if not SetFocusToWord then exit; //沒找到Word,退出
sendkeys('%{F4}',false); //發送Alt+F4,關閉Word
SetFormActive;
end;
end.
該例子只是簡單演示一下,實際上大家可以改動激活word的部分(本文查找'文檔 1 - Microsoft Word'來實現,
顯得有些太簡單了。)
Delphi本身也帶有與Office協作的一系列控件,但只進行簡單的協作,這樣不是更簡單麼?
SendKeys函數的功能很強大,不然Borland也不會在安裝盤中提供這個文件。更好的利
SendKeys的設想,就要看各位朋友的了!