Delphi对于其它软件的控制

Delphi
placeholder image
admin 发布于:2017-11-17 18:04:19
阅读:loading

背景介绍

在本文开始之前,有个颠覆性的小知识传递,我想Java开发相关的还从来不知道我们可以通过程序去控制一个exe软件吧,比如我们可以写一个小工具实现一键登录邮箱(桌面客户端邮箱)、一键登录远程桌面等等行为,只因为Java做不到所以导致认知里并没有想过这些事情。

控制鼠标实现1+2运算

本文主要实现对系统自带的计算器软件和远程桌面连接软件进行控制,对于计算器软件我简单(也就会这么点点)实现了一键出发 1 + 2 = 3 的计算控制,比如当我点击【鼠标1+2运算】按钮时实现程序控制鼠标点击【按钮1】、【按钮+】、【按钮2】、【按钮=】来实现,主要是软件去控制鼠标点击的位置,根据那一堆按钮所在的面板左上角0,0的坐标位置找寻的坐标并执行的鼠标点击,参考效果图如下:

鼠标1+2.gif

获取句柄实现1+2运算

使用句柄(何谓句柄不知道我有没有解释过,可自行百科)来实现的 1 + 2 = 3 程序显得要比上面的鼠标控制的要更好,它不占用鼠标,可以让计算器在后台进行计算,比如当我点击【句柄1+2运算】按钮时程序自行控制【按钮1】、【按钮+】、【按钮2】、【按钮=】来实现,仔细查看下图会发现这几个按钮中存在有被点击的痕迹,参考效果图如下:

句柄1+2.gif

加减乘除

本来想改一下计算器软件中【+-*/】按钮上的文字的,后来发现它不是讲文本写在Button上的,故本渣表示无法实现,参考原因如下图所示:

image.png

更改按钮文本

后来随便找了另一个程序【远程桌面连接】,因为它的按钮是标准的Windows Button故可以获取它的文本和设置它的文本,本例以更改它的按钮文本为例,你将看到的是默认的远程桌面连接的界面中,右侧有一个默认的【帮助(N)】,我将通过程序将它改为【help(H)】,参考效果图如下:

按钮文字修改.gif

代码参考

image.png

unit calcWindow;


interface


uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  StrUtils,

  Dialogs, StdCtrls,

  TLHelp32;


type

  TcalcForm = class(TForm)

    operatorButton: TButton;

    handleButton: TButton;

    mouseButton: TButton;

    textButton: TButton;

    procedure mouseButtonClick(Sender: TObject);

    procedure handleButtonClick(Sender: TObject);

    procedure operatorButtonClick(Sender: TObject);

    procedure textButtonClick(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

  

var

  calcForm: TcalcForm;

  p: array[0..254] of ansichar;

  R: TRect;//外部窗口的对象,包括宽、高、横坐标、纵坐标


implementation


{$R *.dfm}


//用于切换显示某个窗口

procedure SwitchToThisWindow(hWnd:Thandle; fAltTab:boolean);stdcall;external 'User32.dll';

//鼠标点击的方式

procedure TcalcForm.mouseButtonClick(Sender: TObject);

var

   calcWindow : Thandle;

   calcFrame : Thandle;

   operatorFrame : Thandle;

begin

    calcWindow := FindWindow(nil , '计算器');//获取顶级句柄

    if calcWindow = 0 then

    begin

        Application.MessageBox(PChar('未找到计算器') , '提示:' , MB_OK);

        exit;

    end;

    SwitchToThisWindow(calcWindow , true); //切换至计算器窗口

    //根据区域的相对坐标让鼠标按下

    calcFrame := FindWindowEx(calcWindow , 0 , 'CalcFrame' , nil);//获取子集句柄

    operatorFrame := FindWindowEx(calcFrame , 0 , 'Static' , '');//获取子集中Static

    operatorFrame := getWindow(operatorFrame , GW_HWNDLAST);//获取同级中最后一个

    operatorFrame := getWindow(operatorFrame , GW_HWNDPREV);//倒数第二个--所有按钮的句柄面板

    //找到 1 的相对位置并按下

    GetWindowRect(operatorFrame , R);

    SetCursorPos(R.Left + 15 , R.Top  + 140);

    sleep(1000);

    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//点击合同查询

    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

    //找到 + 的位置相对位置并按下

    SetCursorPos(R.Left + 130 , R.Top  + 170);

    sleep(1000);

    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//点击合同查询

    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

    //找到 2 的相对位置并按下

    SetCursorPos(R.Left + 55 , R.Top  + 140);

    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//点击合同查询

    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

    sleep(1000);

    //找到 = 的位置并按下

    SetCursorPos(R.Left + 170 , R.Top  + 150);

    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//点击合同查询

    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);

    sleep(1000);

end;


//句柄的方式

procedure TcalcForm.handleButtonClick(Sender: TObject);

var

   calcWindow : Thandle;

   calcFrame : Thandle;

   operatorFrame : Thandle;

   button1 : Thandle;

   button2 : Thandle;

   buttonJ : Thandle;

   buttonD : Thandle;

begin

    calcWindow := FindWindow(nil , '计算器');//获取顶级句柄

    if calcWindow = 0 then

    begin

        Application.MessageBox(PChar('未找到计算器') , '提示:' , MB_OK);

        exit;

    end;

    //获取计算机的 1、+、2、= 键来计算出 1 + 2 = 3

    calcFrame := FindWindowEx(calcWindow , 0 , 'CalcFrame' , nil);//获取子集句柄

    operatorFrame := FindWindowEx(calcFrame , 0 , 'Static' , '');//获取子集中Static

    operatorFrame := getWindow(operatorFrame , GW_HWNDLAST);//获取同级中最后一个

    operatorFrame := getWindow(operatorFrame , GW_HWNDPREV);//倒数第二个

    button1 := FindWindowEx(operatorFrame , 0 , 'Button' , '');//第一个按钮

    buttonD := getWindow(button1 , GW_HWNDLAST); //等号=

    buttonJ := getWindow(buttonD , GW_HWNDPREV);

    buttonJ := getWindow(buttonJ , GW_HWNDPREV);

    buttonJ := getWindow(buttonJ , GW_HWNDPREV);

    buttonJ := getWindow(buttonJ , GW_HWNDPREV);

    buttonJ := getWindow(buttonJ , GW_HWNDPREV); //加号+

    button2 := getWindow(buttonJ , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV);

    button2 := getWindow(button2 , GW_HWNDPREV); //数字2

    button1 := getWindow(button2 , GW_HWNDPREV);

    button1 := getWindow(button1 , GW_HWNDPREV);

    button1 := getWindow(button1 , GW_HWNDPREV);

    button1 := getWindow(button1 , GW_HWNDPREV);

    button1 := getWindow(button1 , GW_HWNDPREV);

    button1 := getWindow(button1 , GW_HWNDPREV); //数字1

    SendMessage(button1 , WM_LBUTTONDOWN , 0 , 0);//点击数字1

    SendMessage(button1 , WM_LBUTTONUP , 0 , 0);

    Sleep(1000);

    SendMessage(buttonJ , WM_LBUTTONDOWN , 0 , 0);//点击+号

    SendMessage(buttonJ , WM_LBUTTONUP , 0 , 0);

    Sleep(1000);

    SendMessage(button2 , WM_LBUTTONDOWN , 0 , 0);//再点击数字1

    SendMessage(button2 , WM_LBUTTONUP , 0 , 0);

    Sleep(1000);

    SendMessage(buttonD , WM_LBUTTONDOWN , 0 , 0);//再点击数字1

    SendMessage(buttonD , WM_LBUTTONUP , 0 , 0);

end;


procedure TcalcForm.operatorButtonClick(Sender: TObject);

begin

     Application.MessageBox(PChar('计算器这个软件中的按钮文字并非写在标准的Windows Button上,故取不到(新手感觉如是)...'

        + char(13) + char(10) + '本来还准备改写【+ - * /】按钮上的文本呢') , '提示:' , MB_OK);

end;


procedure TcalcForm.textButtonClick(Sender: TObject);

var

    remoteWindow : Thandle;

    button : Thandle;

begin

    remoteWindow := FindWindow(nil , '远程桌面连接');//获取顶级句柄

    if remoteWindow = 0 then

    begin

        Application.MessageBox(PChar('未找到远程桌面连接') , '提示:' , MB_OK);

        exit;

    end;

    //找子级中的Button,找到倒数第二个元素

    button := FindWindowEx(remoteWindow , 0 , 'Button' , '');//第一个按钮

    button := getWindow(button , GW_HWNDLAST);

    button := getWindow(button , GW_HWNDPREV);

    //SendMessage(button , WM_GETTEXT , 256 , integer(@p));//取值

    SendMessage(button , WM_SETTEXT , 256 , Integer(PChar('help(H)')));

    //Application.MessageBox(PChar('当前文本为:' + p) , '提示:' , MB_OK);

    //showmessage(inttostr(button));

end;

end.

 点赞


 发表评论

当前回复:作者

 评论列表


留言区