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.

delphi有关获取其他程序的窗口及对窗口内控件的操作的更多相关文章

  1. WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里?

    原文:WPF 程序鼠标在窗口之外的时候,控件拿到的鼠标位置在哪里? 在 WPF 程序中,我们有 Mouse.GetPosition(IInputElement relativeTo) 方法可以拿到鼠标 ...

  2. delphi 一个自动控制机的硅控板检测程序,用多线程和API,没有用控件,少做改动就能用 用485开发

    一个自动控制机的硅控板检测程序,用多线程和API,没有用控件,少做改动就能用Unit CommThread; Interface Uses  Windows, Classes, SysUtils, G ...

  3. SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)

    做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...

  4. WPF 从程序集中检索图片资源stream给Image控件使用

    原文:WPF 从程序集中检索图片资源stream给Image控件使用 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/nihang1234/artic ...

  5. JS 获取某个容器控件中id包含制定字符串的控件id列表

    //获取某容器控件中id包含某字符串的控件id列表 //参数:容器控件.要查找的控件的id关键字 function GetIdListBySubKey(container,subIdKey) { va ...

  6. DELPHI XE10,JSON 生成和解析,再利用INDYHTTP控件POST

    Delphi XE10,Json 生成和解析,再利用indyhttp控件Post 年09月20日 :: 阅读数: --不多说,直接上代码 procedure TFrmMain.Brand; var J ...

  7. VC++如何在程序中用代码注册和卸载ocx控件(代码)

    方法一:在dos或Windows命令行下运行:regsvr32 ocxname.ocx 注册 示例:regsvr32 netshare.ocx     //注册netshare.ocx控件regsvr ...

  8. 在DevExpress程序中使用条形码二维码控件,以及进行报表打印处理

    在很多业务系统里面,越来越多涉及到条形码.二维码的应用了,不管在Web界面还是WInform界面都需要处理很多物料相关的操作,甚至很多企业为了减少录入错误操作,为每个设备进行条形码.二维码的标签,直接 ...

  9. 首发 手把手教你制作 Windows8 应用程序内部的 hubtile (动态瓷砖控件) MetroStyle(转)

    http://blog.csdn.net/wangrenzhu2011/article/details/8175492 (转) 在metro 风格中 动态磁贴是他的精髓 在wp7 的开发中 我们可以使 ...

随机推荐

  1. Android学习之基础知识五—创建自定义控件

    下面是控件和布局的继承关系: 从上面我们看到: 1.所有控件都是直接或间接继承View,所有的布局都是直接或间接继承ViewGroup 2.View是Android中最基本的UI组件,各种组件其实就是 ...

  2. hibernate4使用原生jdbc进行批处理

    在hibernate中,有一级缓存session和二级缓存sessionFactory这些机制,一方面为编码提供了便利,同时也会有一些副作用.比如有较大的数据量交互的话,缓存反而会降低效率.最近在做一 ...

  3. android 3.0+百度地图api地图如何移动到指定的经纬度处

    由于百度地图api,2.0+和3.0+的改动比较大,api基本上被全换过了,有些同学可能2.0+的api使用的非常熟悉,但是更新到3.0+时,却会遇到一些小麻烦(由于api变了,你就需要重新学习它的a ...

  4. 重度使用示波器进行优化分析——一个DSDA项目回顾

    这是若干年前一个项目,最近有时间整理一下.回忆起来,印象最深刻的就是重度使用示波器辅助分析,进行优化. 项目背景是在原有项目3G+项目基础上,增加一颗2G+ Modem,使支持DSDA功能. 在介绍D ...

  5. LiveCharts文档-3开始-2基础

    原文:LiveCharts文档-3开始-2基础 LiveCharts文档-3开始-2基础 基本使用 LiveCharts设计的很容易使用,所有的东西都可以自动的实现更新和动画,库会在它觉得有必要更新的 ...

  6. odoo 11 实现多个字段对应一个查询参数的查询

    在整理英语单词开发模块的过程中,有这样一个需求,就是我在查询界面里输入一个查询的值A,这个A可能是下面的任何一个值 1.一个英语单词  2.汉语文字  3.一个英语单词的部分 这里有两张表:engli ...

  7. Luogu P1337 [JSOI2004]平衡点 / 吊打XXX

    一道入门模拟退火的经典题,还是很考验RP的 首先我们发现神TM这道题又和物理扯上了关系,其实是一道求广义费马点的题目 首先我们可以根据物理知识得到,当系统处于平衡状态时,系统的总能量最小 又此时系统的 ...

  8. 【LGR-048 五周年庆贺】洛谷6月月赛

    Luogu的五周年庆典比赛,还是比较满意的. 题目清新不毒瘤,数据优质不卡常,解法自然,为出题人点赞. 前三题的难度都很低,T5个人感觉还好.但是最后那个splay+hash是什么神仙东西. 最后好像 ...

  9. bitcoin 源码解析 - 交易 Transaction(三) - Script

    bitcoin 源码解析 - 交易 Transaction(三) - Script 之前的章节已经比较粗略的解释了在Transaction体系当中的整体运作原理.接下来的章节会对这个体系进行分解,比较 ...

  10. Helper

    //检测端口是否使用 public static bool VerifyListenerPort(int port) { bool inUse = false; System.Net.NetworkI ...