程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中的SendKeys函數

Delphi中的SendKeys函數

編輯:Delphi

用過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的設想,就要看各位朋友的了!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved