如何控制其他程序窗体上的窗口控件(中)

C# 实现控件在不同窗体之间的引用 .NETFAMEWORK2.0中要实现在不同窗体中引用控件变的非常的容易:Application.OpenForms["Form1"]  //用来引用窗体。Application.OpenForms["Form1"].Controls[0] //用来引用“Form1”中的第一个控件。但要注意的是,一定要弄清楚控件的父本是谁,如我要引用Form1中的一个MSFlexGrid控件,但它在第 阅读详情
其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow.

其函数原形是:

function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall;

lpClassName:窗口类名.如果只知道标题,可以为空.窗口类名可以用很多工具获得.如winsignt32.
lpWindowName:窗口标题.

调用方式举例:

var wndhwnd:HWND;
wndhwnd:=FindWindow(nil,'某窗口标题');
if wndhwnd<>0 then  //找到此窗口句柄.
begin
  xxxxx
end
else begin
  MessageBox(self.handle,'没找到该窗口句柄','提示',0);
end;

有了这个窗口句柄,就离我们的初始目的不远了:控制其他窗体上的窗口控件.

同样,首先要得到其他窗体上窗口控件的句柄.我们用这个API函数:EnumChildWindows.

其函数原形是:
function EnumChildWindows(hWndParent: HWND; lpEnumFunc: TFNWndEnumProc;
  lParam: LPARAM): BOOL; stdcall;

这个函数和EnumWindow函数很有些想象.其作用也很相似.它的功能就是列举窗口句柄为hWndParent的窗体上所有的窗口控件的句柄.同样也是以回调函数参数的形式给出的.

我们再举一个实际的例子,来说明这个函数的用法.程序的功能是让用户输入一个窗口标题,然后调用FindWindow函数找到此窗口句柄.通过这个句柄,我们在一个Memo里显示该窗口上所有的窗口控件.

同样先编写回调函数.
function  EnumChildWndProc(AhWnd:LongInt;
  AlParam:lParam):boolean;stdcall;
var
  WndClassName: array[0..254] of Char;
  WndCaption: array[0..254] of Char;
begin
  GetClassName(AhWnd,wndClassName,254);
  GetWindowText(aHwnd,WndCaption,254);
  with form1.memo1 do
  begin
    lines.add( string(wndClassName));
    lines.add( string(wndCaption));
    lines.add('-------');
  end;
  result:=true;
end;


然后在一事件里调用EnumChildWindows函数.
procedure TForm1.Button1Click(Sender: TObject);
var
  hWnd:LongInt;
begin
  memo1.Lines.Clear;
  Memo1.Lines.Add(Edit1.Text+' 有如下控件类名称');
  hWnd:=FindWindow(nil,pchar(Edit1.Text));
  if hWnd<>0 then
  begin
    EnumChildWindows(hWnd,@EnumChildWndProc,0);
  end
  else  MessageBox(self.handle,'没找到该窗口句柄','提示',0);
end;

程序清单如下:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;  //用来显示找到的控件
    Label1: TLabel; 
    Edit1: TEdit;  //输入标题.
    Button1: TButton; 
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  function  EnumChildWndProc(AhWnd:LongInt;
    AlParam:lParam):boolean;stdcall;

implementation


{$R *.dfm}
function  EnumChildWndProc(AhWnd:LongInt;
  AlParam:lParam):boolean;stdcall;
var
  WndClassName: array[0..254] of Char;
  WndCaption: array[0..254] of Char;
begin
  GetClassName(AhWnd,wndClassName,254);
  GetWindowText(aHwnd,WndCaption,254);
  with form1.memo1 do
  begin
    lines.add( string(wndClassName));
    lines.add( string(wndCaption));
    lines.add('-------');
  end;
  result:=true;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  hWnd:LongInt;
begin
  memo1.Lines.Clear;
  Memo1.Lines.Add(Edit1.Text+' 有如下控件类名称');
  hWnd:=FindWindow(nil,pchar(Edit1.Text));
  if hWnd<>0 then
  begin
    EnumChildWindows(hWnd,@EnumChildWndProc,0);
  end
  else  MessageBox(self.handle,'没找到该窗口句柄','提示',0);
end;

end.


有了控件句柄,我们当然就可以随心所欲了.比如:

SendMessage(hWnd,WM_SETTEXT,0,LongInt(Pchar('sdafdsf')));就可以给控件发送文本.其他还可以发送不同的消息可以做很多事情.

但是,有很大一个问题:假设一个窗体上有很多相同的控件,并且根本没办法区分他们,即使我们能找到所有的控件句柄,我们又不能区分到底哪个是我们想要的,同样是干着急.

我想了很长时间,后来在大富翁里找到了答案,只要用到一个小技巧,就可以解决了.

vb调用其他应用程序 如何在vb中定时启动kingview组态王可执行文件 立即下载

相关推荐

VB控制其他程序成为自己的子窗体

VB控制其他程序成为自己的子窗体VB控制其他程序成为自己的子窗体VB控制其他程序成为自己的子窗体!

如何控制其他程序窗体上的窗口控件:中

有了回调函数的概念及上面的例子,我们可以继续了。其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow.其函数原形是:function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall;lpClassName:窗口类名.如果只知道标题,可以为空.窗口类名可以用很多工具获得.如winsign

w8u的专栏 2411

VB 控制其他程序成为自己的子窗体

VB 控制其他程序成为自己的子窗体 VB 控制其他程序成为自己的子窗体

窗体、控件的使用 控件的事件处理与控件的访问 多个窗体之间的跳转

C#之窗体应用程序设计:窗体、控件的使用 实验内容:在主窗口上放置一ListBox和两个Button,Button1和Button2;新建Window窗体Form2,在Form2上放置一button;要求主窗体居中显示。点击主窗体上的button1,,弹出窗体Form2,实现点击Form2窗体上的按钮时,在Form1的ListBox控件里面添加任意字符串; 在Form2窗体上添加合适的控件,要求输入一十进制数,输出这个数的八进制和二进制; 步骤: 打开vs,新建WPF文件,打开工具箱,拖动需要的控件至FO

菜鸟的博客 4096

VC++ 在其它程序窗口上创建按钮并控制

内容索引:VC/C++源码,系统相关,按钮  VC++ 在其它程序窗口上创建按钮并控制响应,其内有几个是封闭成的DLL,附有几个例子调用DLL,以加深大家的理解,写出这样的程序需要作者深入了解系统内的进程及线程环境,很有参考价值。

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

dapengglove的博客 1681

C# 通过WinAPI 实现不同窗体间的相互控制

有时候想要通过软件的方式去控制别人软件的运行乃至控制别人软件上按钮的动作、文本框的填充等,实现自己独特的功能,怎么实现呢? 在Windows中不管是窗体、控件都有一个与之对应的句柄,只要获得了句柄,就可以操作该句柄对应的对象。 在VS中新建项目WinApp1,解决方案名为WinFormCall,再添加项目WinApp2.   重命名WinApp1中的Form1为WinApp1Form1

ferrycooper的博客 4304

使用项目管理画布启动项目

许多人对商业模式画布并不陌生,它是亚历山大·奥斯特瓦德(Alexander Osterwalder)、伊夫·皮尼厄(Yves Pigneur)在《商业模式新生代》(Business Model Generation)中提出的一种用来描述商业模式、可视化商业模式、评估商业模式以及改变商业模式的通用语言。 在我们做敏捷软件项目inception(项目启动规划)的时候经常会用到商业画布,此时它的作用是帮助我们快速了解客户的业务、产品和市场,帮助客户梳理自己的资源、优势和盈利模式,总的来说,商业画布是一种简单实用的

IDEAL Garden 1224

windows的应用程序之CUI(控制台)程序和(GUI)程序

CUI是console uers interface,GUI是graphical user interface,顾名思义,一个是基于控制台的,一个是基于窗口的。所谓的控制台,其实是一种文本,所以,控制台程序也就是基于文本的应用程序。说起应用程序,就不得不说进程,一个应用程序的实例(也就是运行着的应用程序)就是一个进程,所谓进程,其实也是一个空架子,它由一个记录该进程的内核对象和一个存放可执行文件所

8189

《UE4游戏开发》之 《音效系统的实现》

音效系统需要负责管理什么事情: 1.1 确定声音控制的分类:如背景音乐、技能音效、界面音效、角色配音等,不同游戏对声音有不同的分类 1.2 控制每个分类的声音的开启与关闭,以及调节每个分类声音的大小 解决如何分类: 2.1 首先需要知道ue4为声音分类提供了什么:SoundClass通常需要一个根分类【SC_RPG_Master】,便于总体控制音效,以及指定引擎默认启动的音效 打开SoundClass资产【SC_RPG_Master】,对根控制的设置,将逐级传递并按比例进行设置,以此达到控制一类声音的目的.

qq_21919621的博客 2126

OpenCV-Python实战(11)——OpenCV轮廓检测相关应用

在计算机视觉领域,轮廓通常指图像中对象边界的一系列点。因此,轮廓通常描述了对象边界的关键信息,包含了有关对象形状的主要信息,该信息可用于形状分析与对象检测和识别。在本文中,我们将学习如何利用获取到的轮廓,进行形状分析以及对象检测和识别。

盼小辉丶的博客 1万+

怎样控制其他程序窗体上的窗口控件

作者:摘自多个网站 用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是回调函数。我的理解是这样的: 回调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows操作系统,比如其他的程序等等之类的。但是什么时候被调用却不知道了。回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你

mahushen的专栏 977

ADS基础教程22 - 有限元电磁仿真(FEM)

一、引言二、FEM操作过程1.新建Layout1.新建Layout2.EM设置3.设置Frequency plan4.设置Output plan5.设置Options6.设置网格频率7.仿真结果三、总结介绍了在ADS中如何进行FEM仿真过程。END!}}END!

XZ_ZC的博客 2579

如何控制其他程序窗体上的窗口控件:上

如何控制其他程序窗体上的窗口控件:上首先申明:我是菜鸟,我只不过想把困绕了我很长时间的问题的解决方案发表出来,免得以后我又忘记,同时给还不知道这些小知识的同僚一些帮助。各位不要笑我的浅薄。同时为了表示我的低级,我会很罗嗦的讲一些基本的东西,这些都是我的理解,很不准确。用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是回调函数。我的理解是这样的:回调函数写出来不是自己的程序去调用

w8u的专栏 2704

华为OD机试:查找接口成功率最优时间段 (C/C++/Py/Java/JS/GO)

华为OD机试双机位C卷 查找接口成功率最优时间段,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。

qq_45776114的博客 4686

vue3 - 实现WebRTC播放实时rtsp视频流+NVR录像机回放,web前端浏览器网页播放RTSP推流,支持海康威视大华等摄像头/监控设备对接(监控摄像头录像及回放,拿到rtsp视频流如何处理)

vue3,webrtc-streamer,rtsp视频流,监控画面,nvr录像机,回放功能,监控摄像头设备,vue3播放Rtsp推流示例代码,前端如何在vue3项目中播放rtsp视频流,VUE中播放RTSP实时推流播放解决方案,vue3 webrtc播放rtsp视频流,vue3实现rtsp视频流浏览器实时播放,海康摄像机、NVR、流媒体服务器、回放取流RTSP地址,vue3+vite+ts 使用webrtc-streamer播放海康rtsp监控视频,播放海康rtsp监控视频,海康摄像机/录像机预览+回放RT

✅ 精选推荐文章 1万+

如何控制其他程序窗体上的窗口控件

控制其他程序窗体上的窗口控件,必须先了解什么是回调函数。我的理解是这样的: 回调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows操作系统,比如其他的程序等等之类的。但是什么时候被调用却不知道了。回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你提供的地址调用这个函数通知你,并按照

thinkray的专栏 786

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

如何控制其他程序窗体上的窗口控件(上)

如何控制其他程序窗体上的窗口控件:上首先申明:我是菜鸟,我只不过想把困绕了我很长时间的问题的解决方案发表出来,免得以后我又忘记,同时给还不知道这些小知识的同僚一些帮助。各位不要笑我的浅薄。同时为了表示我的低级,我会很罗嗦的讲一些基本的东西,这些都是我的理解,很不准确。用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是回调函数。我的理解是这样的:回调函数写出来不是自己的程序去调用

VBEND的专栏 2137

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Delphi中如何控制其他程序窗体上的窗口控件

Delphi中如何控制其他程序窗体上的窗口控件 回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你提供的地址调用这个函数通知你,并按照预先规定好的形式传递参数。所以很多人打比方...

387

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

如何控制其他程序窗体上的窗口控件:下

实在不好意思,写了上,中后,由于一直忙于项目,就没有完成最关键的工作。导致很多网友给我发邮件询问答案。同时对某些人发表的评论感觉到很伤心,本来就申明了文章写的很浅薄无知,很罗里八嗦的,并且将自己的心得发布给大家看,我自己不但没有好处,还浪费时间,凭什么发表了东西要被人骂?所以就一直不想继续写了。现在看我写的上,中,可真是够细的了。其实,几句话就搞定,但是我那时可没有理解什么回调之类的东西,

w8u的专栏 3233

如何控制其他程序窗体上的窗口控件(下)

实在不好意思,写了上,中后,由于一直忙于项目,就没有完成最关键的工作。导致很多网友给我发邮件询问答案。同时对某些人发表的评论感觉到很伤心,本来就申明了文章写的很浅薄无知,很罗里八嗦的,并且将自己的心得发布给大家看,我自己不但没有好处,还浪费时间,凭什么发表了东西要被人骂?所以就一直不想继续写了。 现在看我写的上,中,可真是够细的了。其实,几句话就搞定,但是我那时可没有理解什么回调之类的东西,所以罗

VBEND的专栏 2538
上一篇: win32 API窗口句柄的获得——我的经验
下一篇: EnumChildWindows的威力
VBEND
博客等级 码龄23年 16粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值