如何控制其他程序窗体上的窗口控件
Access数据库教程-窗体的设计

4.2.1 源于单一的数据集的窗体设计 经过以上的学习,我们了解了窗体的基本概念,下面
4. 3. 2 窗体设计视图工具栏
如图4-16所示的工具箱,是窗体设计的“命令中心”。拖动标 题栏可以移动工具箱,拖动边缘或角可以更改工具箱的外形。 还可以将工具移到工作区的顶部,像工具栏一样使之固定。 关闭工具箱的方法很多,可以单击工具箱右上角的“关闭” 按钮,也可以选择“视图”菜单中的“工具箱”命令,还可 以单击工具栏上的“工具箱”按钮。
本章导读
窗体又叫表单,是用户和Access 2002应用程 序之间的主要接口。数据库是用表来存储数据的, 一个完善的数据库应用程序,要使用户能够方便的 对数据表进行数据的输入,修改维护,以及显示输 出。利用Access窗体,能使用户可以轻松地完成数 据的各种处理,制定表中数据的多种显示输入输出 方法以及完成数据库的各种维护功能。可以说,创 建一个Access数据库应用程序系统来说,制作各种 各样的窗体是必不可少的。否则,它就不是一个完 整的数据库应用程序。
【例2】创建一个带有子窗体的主窗体,用于显示 “学生信息表”和“成绩表”中的数据,“成绩表” 表中的数据是一对多关系中的“多”端,而“学生 信息表”中的数据是此关系中的“一”端,每个学 号对应多门课程的成绩。
在这类窗体中,主窗体和子窗体彼此连接,使得 子窗体只显示与主窗体当前记录相关的记录。例如, 当主窗体显示学号为“9901001”时,在子窗体中就 只会显示学号“9901001”学生的各个学期的各科成 绩。
工具箱和窗体组成: ● 标题栏 显示当前编辑的窗体名称; ● 水平标尺和垂直标尺 用来标准控件的位置; ● 工具箱 是窗体设计工具的集合,通过拖放为窗体创
ACCESS2003教程之第六章 窗体的设计与高级应用

4. 在窗体中添加当前日期和时间 Access 2003提供了将系统时钟日期和时间显示在窗 体上的方法,添加日期和时间后,在窗体视图中,系统 时钟日期和时间将显示在窗体上。 【例6.7】 使用菜单命令为窗体添加当前日期和时 间。 5. 使用属性表设置控件属性 设置控件属性,方法同窗体属性设置,具体属性值 要根据控件的具体用途来确定。 【例6.8】 建立“学生信息处理”窗体,给出各控 件的具体使用及属性设置
6.2 创建窗体
在Access 2003中,创建窗体有两种方法: (1) 窗体向导 Access 2003提供了6种创建窗体的向导,如图6.4所 示,包括窗体向导、自动创建窗体:纵栏式、自动创建窗 体:表格式、自动创建窗体:数据表、图表向导和数据透 视表向导。 (2) 手动方式(又称窗体设计器) 使用人工方式创建窗体,需要创建窗体的每一个控 件,建立控件与数据源的联系,设置控件的属性等。
本章要点
1、Access 2003中窗体的构成与作用 2、利用向导创建窗体 3、在设计视图中如何设计窗体 4 4、窗体中控件对象的使用 5、窗体及控件的属性设置与事件的设计方法
6.1 窗体基础知识
窗体是Access 2003数据库中的一个非常重要的对象, 同时也是最复杂和灵活的对象。 通过窗体用户可以方便地输入数据、编辑数据、显示 统计和查询数据,是人机交互的窗口。窗体的设计最 能展示设计者的能力与个性,好的窗体结构能使用户 方便地进行数据库操作。此外,利用窗体可以将整个 应用程序组织起来,控制程序流程,形成一个完整的 应用系统。 6.1.1 窗体的概念与作用 窗体就是程序运行时的Windows窗口,在应用系统设计 时称为窗体。 窗体的主要特点与作用:
2. 控件属性 (1) 标签(label)控件 标题(Caption) 名称(Name) 其他常用的格式属性: 高度(Height) 宽度(Width) 背景样式(BackStyle) 背景颜色(BackColor) 显示文本字体(FontBold) 字体大小(FontSize) 字体颜色(ForeColor) 是否可见(Visible)等。
weifenluo控件 窗口停靠的原理 -回复

weifenluo控件窗口停靠的原理-回复标题:【WeifenLuo控件:窗口停靠的原理详解】一、引言WeifenLuo.WinFormsUI.Docking,简称DockPanel Suite,是由C#编写的.NET开源库,为Windows窗体应用程序提供了一套强大的停靠功能。
本文将深入剖析WeifenLuo控件中窗口停靠的原理,一步步揭示其背后的设计逻辑与实现机制。
二、基本概念与组件在WeifenLuo控件库中,核心组件是DockPanel和DockControlPane。
DockPanel是所有停靠窗体的容器,而DockControlPane则是窗体实际停靠的位置,可以理解为停靠区域或者停靠面板。
1. DockPanel:作为顶级容器,DockPanel负责管理所有的DockControlPane和停靠窗体,控制它们的布局和行为。
它允许窗体在它的边缘(上、下、左、右)以及内部(填充)进行停靠,并且支持浮动窗口和自动隐藏的功能。
2. DockControlPane:DockControlPane是窗体停靠的具体位置,每个DockControlPane内只能有一个窗体。
当窗体被拖动到DockPanel的不同位置时,会动态创建或调整DockControlPane来适应新的布局需求。
三、窗口停靠过程解析1. 初始化停靠:首先,窗体需要设置CanDock属性为true以启用停靠功能,然后通过DockPanel.DockStyle属性将其添加到DockPanel中并指定初始停靠位置。
例如,如果希望窗体停靠在主界面底部,则可设置.DockStyle为DockBottom。
2. 拖动停靠:在运行时,用户可以通过鼠标拖拽窗体标题栏改变其停靠位置。
当窗体被拖动至DockPanel边界时,DockPanel会检测到这一动作并创建或调整相应的DockControlPane,同时更新窗体的DockControl.DockStyle属性。
C# 第6章 窗体、控件和组件

窗体的常用方法和事件
方法和事件名 说明
13
Close()方法
Hide()方法 Show()方法 Load事件
使窗体关闭,并释放资源;
使窗体隐藏,并不释放资源; 显示窗体; 加载窗体时处理的事件;
Click事件
Closing、Closed事件 GetFocus事件 Activated事件
鼠标单击窗体时处理的事件;
它还只是一个TextBox类型的变量而已,如果在InitializeCompon ent( )之前调用这个TextBox的属性或方法,就会出错。
6.1.3 窗体常用的属性
属性 Name BackColor ForeColor 含义 窗体的名称,代码中通过该属性来访 问窗体 窗体的背景色 窗体上文本的前景色 注意
C#中的InitializeComponent()方法
注意: InitializeComponent( )方法写在前面和后面是有区别的。
23
InitializeComponent( )方法是用来初始化窗体组件的,在Initializ
eComponent之前,窗体的各个控件还没有进行初始化,比如说
窗体上有一个TextBoxUserName,在InitializeComponent( )之前
19
20
6.1.2 窗体的创建、显示与隐藏
【例6-1】演示窗体的基本用法以及如何显示和关闭窗体。 部分运行效果如图:
C#中的InitializeComponent()方法
在每一个窗体生成的时候,都会针对于当前的窗体定义Initi alizeComponent()方法,该方法实际上是由系统生成的对于
3、如何隐藏一个打开的窗体 (1)隐藏当前窗体:this.Hide(); (2)隐藏其它窗体:Application.OpenForms["Form1"].H ide();
Qt Creator 窗体控件自适应窗口大小布局

Qt Creator 窗体控件自适应窗口大小布局常见的软件窗口大小改变(最大化、手动改变时)需要窗口的部件能够自适应布局,而在Qt的应用程序界面设计中,对于像我一样的初学者如何实现窗口自适应调整还是要绕点弯路的。
网上百度了很多,多数说的很含糊,还有很多是用程序实现的,既然已经有Qt Creator那么高集成度的工具了,我还是倾向于直接在Qt Creator中通过可视化配置的方式完成,一是所见即所得,而是效率要高不少。
Qt中如果想实现窗体内空间随着窗体大小调整,必须使用布局管理,常用的布局管理有QHBoxLayout、QVBoxLayout、QGridLayout,空的地方使用spacer 控件进行填充,因此首先将窗体空间使用布局管理典型应用如下图所示。
我这里使用QGridLayout,按住Ctrl多选需要布局的窗体控件,右键-布局-栅格化局,根据需要进行调整。
要想是控件根据窗体进行调整,最为重要的一点就是设置窗口部件的大小策略,各控件均有这一项设置,如下图所示。
这部分具体的参数解释摘录如下:结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。
控件的sizePolicy说明控件在布局管理中的缩放方式。
Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。
一个QSizePolicy的所有变量对水平方向和垂直方向都适用。
下面列举了一些最长用的值:A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。
B. Minimum:控件的sizeHint为控件的最小尺寸。
控件不能小于这个sizeHint,但是可以放大。
C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小的允许尺寸。
D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小E. Expandint:控件可以自行增大或者缩小注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)所以对于需要根据窗口大小对应改变的部件我这里就设置为Expandint。
窗体的基本类型

1.快速创建带子窗体的窗体 .
【例5-14】 创建“学生成绩”窗体,如图560所示效果。
2.子窗体的源对象为窗体 .
【例5-15】 使用已经存在的窗体,创建“学 生成绩”窗体。 说明:以窗体作为子窗体源对象时,该窗体 的“默认视图”要设置为“数据表”;如不 修改,则子窗体将如一般窗体的纵栏式显示, 一次只显示一笔记录。
快速创建窗体
窗体是最常见的操作界面,本节介绍如何在 Access数据库中,以向导及其他方式,创建 窗体。
自动创建窗体
【例5-1】 使用“自动创建窗体”创建如图56所示的“学生”(自动创建)窗体。
通过文件另存创建窗体
可以通过“另存为”的方法,将现有的表或 查询保存为窗体形式。 【例5-2】 通过将文件另存来创建简单窗体, 创建结果同【例5-1】的结果。
快速自定义窗体
【例5-4】 使用“设计视图”创建“教师基本 情况”窗体,如图5-12所示。
使用设计视图创建窗体
窗体的视图分为设计视图、窗体视图、数据 表视图、数据透视表视图和数据透视图视图。 在设计视图中可创建和修改一个窗体,在窗 体视图下可运行窗体并显示结果。另外3种视 图,是针对窗体中源于表或查询数据的相应 的显示方式。 要想在设计视图中设计窗体,就需了解设计 视图中窗体的结构组成。
3.修改子窗体 .
【例5-16】 修改“学生成绩”窗体的子窗体 部分。
4.在主窗体引用子窗体计算型控件 .
【例5-17】 在“学生成绩”窗体的主窗体引 用子窗体的计算型控件,如图5-72所示。
数据透视表及图
数据透视表及数据透视图均有分析功能,将 数据分析后显示为易读、易懂的表及图,通 过表及图,可一目了然数据分析结果。
第 5章 窗
Windows窗体与控件(一)

创建应用程序的操作界面
5. 设置所有控件的Tab键顺序索引
Tab键顺序是指当用户按下Tab键时,焦点在控件间移动的顺序。 每个窗体都有自己的Tab键顺序,每个控件在窗体上也都有唯 一的Tab键顺序索引。默认状态下,控件在窗体上的Tab键顺序 索引与建立控件的顺序一致。如果要设置窗体上控件的Tab键 顺序索引,可以分别对每个控件设置其TabIndex属性,也可以 集中设置所有控件的Tab键顺序索引。 • 要集中设置所有控件的Tab键顺序索引,可以选择菜单【视 图|Tab键顺序】命令。如果需要改变多个控件的Tab键顺序索 引,按照想设置的顺序依次单击各个控件。【Tab键顺序】命 令是一个切换命令,因此设置好所有控件的Tab键顺序索引之 后,再次选择【Tab键顺序】命令即可结束Tab键顺序索引的设 置。
LOGO
《Visual C#.NET程序设计教程 》
Windows窗体与控件
内容简介
• Windows窗体是以.NET Framework为基础的一个新平台,主 要用来开发Windows应用程序。一个Windows应用程序通常由 窗体对象和控件对象构成,即使开发一个最简单的Windows 应用程序,也必须了解窗体对象和控件对象的使用。 • 先主要介绍Windows窗体的结构和常用属性、方法与事件, 以及Label、LinkLabel、TextBox、Button几种常用控件的 使用。
2. 设置标签的文本
• 在Label中显示文本,使用Text属性。首先要选择Label控件, 然后在属性窗口中设置该属性为某个字符串即可。 • Label控件中的文本默认的排列方式为靠上左对齐,通过设 置TextAlign属性可以改变排列方式。TextAlign属性值是 ContentAlignment枚举类型,共有9个枚举值,默认值是 TopLeft。如果设置TextAlign为TopCenter,则靠上居中。
delphi中在自己的窗体上嵌入其它程序

delphi中在自己的窗体上嵌入其它程序基于Delphi的融合DLL中的窗体博客分类:•delphiDelphiWindows编程基于Delphi的融合DLL中的窗口摘要:提出了一种简单的方法将DLL中的窗口融合(嵌入)到其他应用程序或DLL的窗口中,使用本方法可以简便地实现具有强扩展性和升级能力的软件系统。
1 引言在开发一个大型通用控制系统时曾遇到这么一个问题:该系统软件包由若干个可执行文件和动态链接库组成,因为扩展性和兼容性的要求,需要将系统划分为若干个可执行文件和动态链接库,并且在大部分DLL中封装各自的操作界面,在调用DLL时将其中包含的部分界面嵌入地显示在主界面的某个区域或某个窗口内,与主界面的其他部分浑然一体。
这样主程序与DLL在功能操作上各司其职,在外部界面上又彼此交融,使用户可以通过增加和修改DLL来实现对系统内部、外部的扩展和升级;同时因为DLL的跨语言特性,内部包含操作界面的DLL可以更为方便地在以后的不同工作、不同语言环境中更好地重复使用。
这一问题的应用较为广泛,但没有充分的资料来帮助解决,经过不断的试验,笔者将初步体会总结出来,用以抛砖引玉。
本文中涉及的主程序和DLL都是在Delphi5.0下实现的,但因为其中所依赖的基础还是Windows本身的窗口机制,所以对于其他的语言平台也有实际意义。
在Delphi中如何创建DLL及输出DLL中的函数有较多资料进行过介绍,在本文中不再赘述,本文只针对DLL中的窗口部分做重点介绍。
2 DLL中自带窗口的创建和显示DLL和普通EXE一样,可以自带窗口,用Delphi设计包含窗口的DLL较其他语言更为方便。
在Delphi的DLL工程中,窗口的生成和编程与普通的EXE工程基本相同,但与EXE文件不同的是:在Delphi的EXE工程中所包含的窗口是自动创建的,而DLL工程中所包含的窗口需要显示创建。
在通常的应用中,DLL将所包含的窗口的创建和显示函数(或过程)输出,由宿主程序根据情况调用将DLL中的窗口显示出来(如点击宿主程序中的某个按钮时显示DLL中的窗口),其窗口创建和显示的过程如下:首先,创建一个DLL工程,并新建一个名为DllForm的Form,可以在该Form上放置任何控件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何控制其他程序窗体上的窗口控件回调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows 操作系统,比如其他的程序等等之类的。
但是什么时候被调用却不知道了。
回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你提供的地址调用这个函数通知你,并按照预先规定好的形式传递参数。
所以很多人打比方,说回调函数还真有点像您随身带的BP 机:告诉别人号码,在它有事情时Call您!所以一个回调函数写出来之后,一定有个注册的动作,就是告诉调用者,你怎么样找到我写的函数。
某些Windows API 函数会要求以回调函数地址作为其参数之一,例如SetTimer 、LineDDA 、EnumObjects,以及我们下面要用到的EnumWindows。
在Delphi里声明一个回调函数的格式很简单,例如:function EnumWindowsProc(AhWnd:LongInt;lParam:LongInt):boolean;stdcall;首先是函数名称可以随便乱取,但函数参数的类型一般不得乱来,其顺序,数据类型等都有规定的,因为这些都是让其他程序调用的,他们已经规定好了的,但参数名称可以随便乱叫。
注意后面一定要带上“stdcall”,stdcall是标准调用,也就是说采用标准windows参数传递方式来调用函数。
编写函数体就很简单了,利用传递过来的参数就可以了,只要记住,这些参数是别人送给你的,你只要知道这些参数代表了什么意思。
再看个向调用者注册回调函数入口地址的函数。
function EnumWindows(lpEnumFunc: TFNWndEnumProc; lParam: LPARAM): BOOL; stdcall;TFNWndEnumProc其实就是指针类型。
其中的lpEnumFunc就是回调函数的入口地址了。
下面是调用EnumWindows的格式:EnumWindows(@EnumWindowsProc,0);通过向系统注册回调函数的入口地址,系统就能在需要的时候,调用回调函数,传递参数给它,也许这些参数就是我们想要的。
EnumWindows函数的功能是:枚举屏幕上所有程序中的顶层窗口,将窗口句柄以参数的形式传递给回调函数。
找到一个窗口,就调用一次回调函数。
枚举结束的条件是:要么枚举完所有的窗口,要么回调函数返回False。
lParam: LPARAM参数是程序定义的值,这个值被传递到回调函数。
回过头来再看一下EnumWindowsProc:function EnumWindowsProc(AhWnd:LongInt;lParam:LongInt):boolean;stdcall;当系统找到了一个窗口后,就开始调用这个回调函数,将窗口的句柄作为第一个参数传递过来,将在EnumWindows中lParam: LPARAM这个程序定义的值作为第二个参数传递过来。
所以我们可以在EnumWindowsProc函数中利用传递过来的两个参数来做某些处理了。
下面我们新建一个程序列举系统中所有程序的顶层窗口,我们要得到窗口的标题,要得到窗口类名称。
得到窗口标题用:function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer; stdcall;该函数功能是将窗口句柄为hWnd的窗口的标题拷入到一个缓冲区lpString。
nMaxCount是拷入缓冲区内的最大的字符数。
要得到窗口标题还可以发送消息:WM_GETTEXT,其实GetWindowText就是发送WM_GETTEXT消息的。
要得到窗口类名称用:function GetClassName(hWnd: HWND; lpClassName: PChar; nMaxCount: Integer): Integer; stdcall;其参数意义和上面的函数差不多。
不详细解释了。
我们先编写回调函数:EnumWindowsProc。
现在告诉自己,我们已经有了两个参数的值了。
这两个参数是系统给我们的.为了显示窗口标题和类名,我们用一个TMemo控件。
先在interface部分声明函数。
function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean;stdcall;注意我将第二个参数改了,不要紧,到时候调用的时候注意看。
然后在implementation部分定义函数:function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean;varlpszClassName,lpszWindowText:array[0..254] of char; //定义两个缓冲区。
beginGetWindowText(AhWnd,lpszWindowText,254); //得到窗口标题GetClassName(AhWnd,lpszClassName,254); //得到窗口类名。
Aform.memo1.lines.add(StrPas(lpszWindowText));Aform.memo1.lines.add(StrPas(lpszClassName));Aform.memo1.lines.add('--------------------');Result:=True;end;接着需要做的就是调用EnumWindows函数,注册回调函数入口地址,让系统调用回调函数,列举窗口了。
所以再添加一个TButton: btn_listwindowprocedure TForm1.btn_listwindowClick(Sender: TObject);beginEnumWindows(@EnumWindowsProc,LongInt(self));end;程序清单如下:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Memo1: TMemo;btn_listwindow: TButton;procedure btn_listwindowClick(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean;stdcall;implementation{$R *.dfm}function EnumWindowsProc(AhWnd:LongInt;AForm:TForm1):boolean;varlpszClassName,lpszWindowText:array[0..254] of char;beginGetWindowText(AhWnd,lpszWindowText,254);GetClassName(AhWnd,lpszClassName,254);Aform.memo1.lines.add(StrPas(lpszWindowText));Aform.memo1.lines.add(StrPas(lpszClassName));Aform.memo1.lines.add('--------------------');Result:=True;end;procedure TForm1.btn_listwindowClick(Sender: TObject);beginEnumWindows(@EnumWindowsProc,LongInt(self));end;end.F9,运行,看看结果。
最好是F7单步跟踪调试一下,看看回调函数是怎么被调用的。
有了回调函数的概念及上面的例子,我们可以继续了。
其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow.其函数原形是:function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall;lpClassName:窗口类名.如果只知道标题,可以为空.窗口类名可以用很多工具获得.如winsignt32.lpWindowName:窗口标题.调用方式举例:var wndhwnd:HWND;wndhwnd:=FindWindow(nil,'某窗口标题');if wndhwnd<>0 then file://找到此窗口句柄.beginxxxxxendelse beginMessageBox(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;varWndClassName: array[0..254] of Char;WndCaption: array[0..254] of Char;beginGetClassName(AhWnd,wndClassName,254);GetWindowText(aHwnd,WndCaption,254);with form1.memo1 dobeginlines.add( string(wndClassName));lines.add( string(wndCaption));lines.add('-------');end;result:=true;end;然后在一事件里调用EnumChildWindows函数.procedure TForm1.Button1Click(Sender: TObject);varhWnd:LongInt;beginmemo1.Lines.Clear;Memo1.Lines.Add(Edit1.Text+' 有如下控件类名称');hWnd:=FindWindow(nil,pchar(Edit1.Text));if hWnd<>0 thenbeginEnumChildWindows(hWnd,@EnumChildWndProc,0);endelse MessageBox(self.handle,'没找到该窗口句柄','提示',0);end;程序清单如下:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Memo1: TMemo; file://用来显示找到的控件Label1: TLabel;Edit1: TEdit;file://输入标题.Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;function EnumChildWndProc(AhWnd:LongInt; AlParam:lParam):boolean;stdcall;implementation{$R *.dfm}function EnumChildWndProc(AhWnd:LongInt; AlParam:lParam):boolean;stdcall;varWndClassName: array[0..254] of Char; WndCaption: array[0..254] of Char;beginGetClassName(AhWnd,wndClassName,254); GetWindowText(aHwnd,WndCaption,254);with form1.memo1 dobeginlines.add( string(wndClassName));lines.add( string(wndCaption));lines.add('-------');end;result:=true;end;procedure TForm1.Button1Click(Sender: TObject); varhWnd:LongInt;beginmemo1.Lines.Clear;Memo1.Lines.Add(Edit1.Text+' 有如下控件类名称'); hWnd:=FindWindow(nil,pchar(Edit1.Text));if hWnd<>0 thenbeginEnumChildWindows(hWnd,@EnumChildWndProc,0);endelse MessageBox(self.handle,'没找到该窗口句柄','提示',0);end;end.有了控件句柄,我们当然就可以随心所欲了.比如:SendMessage(hWnd,WM_SETTEXT,0,LongInt(Pchar('sdafdsf')));就可以给控件发送文本.其他还可以发送不同的消息可以做很多事情.但是,有很大一个问题:假设一个窗体上有很多相同的控件,并且根本没办法区分他们,即使我们能找到所有的控件句柄,我们又不能区分到底哪个是我们想要的,同样是干着急.我想了很长时间,后来在大富翁里找到了答案,只要用到一个小技巧,就可以解决了.运行要控制的窗口程序。