• delphi有关获取其他程序的窗口及对窗口内控件的操作


    1.获取当前所有窗口

    procedure TForm1.Button1Click(Sender: TObject);
    var
     szText: array[0..254] of char;
     hCurrentWindow :hwnd;
    begin
    hCurrentWindow := GetWindow(Handle,GW_HWNDFIRST);
    while hCurrentWindow <> 0 do
    begin
        if GetWindowText(hCurrentWindow ,@szText,255) > 0 then
        memo1.lines.Add(StrPas(@szText));
        hCurrentWindow := GetWindow(hCurrentWindow,GW_HWNDNEXT);
     end;
    end;
     
    2.获取某一指定窗口

    procedure TForm1.Button1Click(Sender: TObject);
    var
     szText: array[0..254] of char;
     hCurrentWindow :hwnd;
    begin
    hCurrentWindow := GetWindow(Handle,GW_HWNDFIRST);
    while hCurrentWindow <> 0 do
    begin
        if GetWindowText(hCurrentWindow ,@szText,255) > 0 then

        if  pos('RTX 会话',  StrPas(@szText))<>0 then  //这里指定某一窗口,可能有多个
        memo1.lines.Add(StrPas(@szText));
        hCurrentWindow := GetWindow(hCurrentWindow,GW_HWNDNEXT);
     end;
    end;

    3.获取某一窗口内的所有控件及其内容
      unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure get_actrlh(h:hwnd);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;
     hi:integer;

    implementation

    {$R *.dfm}

    function gettext(h:hwnd):string;
    var name:string;
    txtlen:integer;

    begin
     TxtLen:=sendmessage(h  ,wm_gettextlength,0,0)+1;
       setlength(name,TxtLen);
       sendmessage(h ,wm_gettext,txtlen,LongInt(@name[1]));
     result:=name;
    end;

    procedure tform1.get_actrlh(h:hwnd);
    var
     s: Array[0..255] of char;
     begin

      h:=GetWindow(h,GW_child);
      while h>0 do
      begin

        GetClassName(h, s, 256);
        begin
          memo1.lines.Add(inttostr(hi)+':'+s+':'+trim(gettext(h)) );
        end ;
           hi:=hi+1;
           get_actrlh(h);
           h:=GetWindow(h,GW_HWNDNEXT);
     end;
    end;


    procedure TForm1.Button1Click(Sender: TObject);
    var
     szText: array[0..254] of char;
     hCurrentWindow :hwnd;
    begin
       hCurrentWindow := GetWindow(Handle,GW_HWNDFIRST);
       while hCurrentWindow <> 0 do
       begin
        if GetWindowText(hCurrentWindow ,@szText,255) > 0 then

        if  pos('RTX 会话',  StrPas(@szText))<>0 then  //这里指定某一窗口,可能有多个
        begin
        memo1.lines.Add(StrPas(@szText));
        hi:=0;
        get_actrlh(hCurrentWindow);//获取窗口中的所有控件

        end;

        hCurrentWindow := GetWindow(hCurrentWindow,GW_HWNDNEXT);
     end;
    end;
    end.

    4.获取窗口中的某个控件,并对其操作

     首先用上面3中的程序,根据窗口中控件的特性,找到你要操作的控件的序号,
    即memo1中左边的数字,用变量hnum保存这一序号,再把上面3中的程序稍作修改如下,

    以下其实是一个完整的、功能简单的、没有经过优化的腾讯通RTX自动回复消息程序:

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure get_actrlh(h:hwnd);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;
     hi,hnum:integer;

     implementation

    {$R *.dfm}

    function gettext(h:hwnd):string;
    var name:string;
    txtlen:integer;

    begin
     TxtLen:=sendmessage(h  ,wm_gettextlength,0,0)+1;
       setlength(name,TxtLen);
       sendmessage(h ,wm_gettext,txtlen,LongInt(@name[1]));
     result:=name;
    end;

    procedure tform1.get_actrlh(h:hwnd);
    var
     s: Array[0..255] of char;
     begin

      h:=GetWindow(h,GW_child);
      while h>0 do
      begin

        GetClassName(h, s, 256);
        begin
          memo1.lines.Add(inttostr(hi)+':'+s+':'+trim(gettext(h)) );

          if hi=hnum then
          begin
          memo1.lines.Add('上面为找到的控件');
          SendMessage(h,WM_SETTEXT,0,Integer(pchar('*此为RichEdit20W所赋的文本')));

          end;
        end ;


           hi:=hi+1;
           get_actrlh(h);
           h:=GetWindow(h,GW_HWNDNEXT);
     end;
    end;


    procedure TForm1.Button1Click(Sender: TObject);
    var
     szText: array[0..254] of char;
     hCurrentWindow :hwnd;
    begin
       hCurrentWindow := GetWindow(Handle,GW_HWNDFIRST);
       memo1.Clear;
       while hCurrentWindow <> 0 do
       begin
        if GetWindowText(hCurrentWindow ,@szText,255) > 0 then

        if  pos('RTX 会话',  StrPas(@szText))<>0 then  //这里指定某一窗口,可能有多个
        begin
        memo1.lines.Add(StrPas(@szText));
        hi:=0;
        hnum:=3; //此为所要赋值的RichEdit20W控件在窗口中的序号
        get_actrlh(hCurrentWindow);//获取窗口中的所有控件

    //以下向窗口发送ALT_S 组合键,实现腾讯通RTX发送消息

     SetForegroundWindow(hCurrentWindow);//设置窗口为当前窗口
      keybd_event(VK_menu,MapVirtualKey(VK_menu,0),0,0);
      sleep(1000);
      keybd_event(83,MapVirtualKey(83,0),0,0);
      sleep(1000);
      keybd_event(83,MapVirtualKey(83,0),KEYEVENTF_KEYUP,0);
      keybd_event(VK_menu,MapVirtualKey(VK_menu,0),KEYEVENTF_KEYUP,0);


        end;

        hCurrentWindow := GetWindow(hCurrentWindow,GW_HWNDNEXT);
     end;
    end;
    end.

  • 相关阅读:
    写在前面
    你应该知道的 RPC 原理
    虚函数 继承 多态
    指针 函数指针 指针数组
    Python使用RMF聚类分析客户价值
    数据挖掘关联分析中的支持度、置信度和提升度
    OpenCV2.4.4+Cmake2.8+Vs2010编译createsamples+traincascade程序用来训练样本
    UNITY + OpenCVSharp调节图像对比度
    使用单精度类型变量
    有符号基本整型
  • 原文地址:https://www.cnblogs.com/jijm123/p/6487303.html
Copyright © 2020-2023  润新知