有了回调函数的概念及上面的例子,我们可以继续了。其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow.

其函数原形是:

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

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

调用方式举例:

var wndhwnd:HWND; wndhwnd:=FindWindow(nil,'某窗口标题'); if wndhwnd<>0 then  file://找到此窗口句柄. 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;  file://用来显示找到的控件     Label1: TLabel;      Edit1: TEdit;  file://输入标题.     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')));就可以给控件发送文本.其他还可以发送不同的消息可以做很多事情.

阅读全文        

转载于:https://www.cnblogs.com/gaobo543013306/p/7819312.html

查找标题已知的窗口句柄,遍历窗口控件句柄相关推荐

  1. C++ 主程序中打开子程序窗口隐藏,操作控件 遍历窗口控件句柄EnumChildWindows();获取其他程序进度条数据 操作选择框 按钮点击

    1.线程启动子程序  ShowWindow(hWnd, SW_SHOW)显示 ShowWindow(hwnd, SW_HIDE);隐藏 system_hide(L"Odin3.exe&quo ...

  2. 根据获取的窗口句柄遍历窗口Edit控件

    网上说遍历窗口控件有两种方法: 1),使用EnumChildWindows,没有深究,     学习网址如下: http://blog.sina.com.cn/s/blog_60ac1c4b01011 ...

  3. C++实现已知二叉树前序遍历和中序遍历,求后序遍历

    C++实现已知二叉树前序遍历和中序遍历,求后序遍历 一.基本概念 1.先序遍历(NLR)可以确定二叉树的父子结点: 2.中序遍历(LNR)可以确定二叉树的左右子树: 3.后序遍历(LRN)可以确定二叉 ...

  4. 建立二叉树:已知层次遍历顺序建立二叉树、已知先序遍历顺序建立二叉树

    其他二叉树知识!二叉树知识汇总 目录 前提知识: 约定: 二叉树节点的存储结构: 创建一个节点: 建立二叉树的几种方法: 一.已知先序遍历顺序,构建二叉树.(链式存储) 二.已知层次遍历顺序,构建二叉 ...

  5. 二叉树已知两种遍历结果求另一个遍历结果

    二叉树的遍历分为 前序遍历: 根-------左---------右 中序遍历: 左-------根---------右 后序遍历:左--------右---------根 现问题为:已知其两种遍历, ...

  6. 简介子窗口控件(api)

    子窗口控件 壹佰软件开发小组  整理编译   回忆第七章的CHECKER程序.这些程序显示了矩形网格.当您在一个矩形中按下鼠标按键时,该程序就画一个x:如果您再按一次鼠标按键,那么x就消失.虽然这个程 ...

  7. QT 基础知识一(QT安装、创建项目、常用窗口控件使用、信号与槽机制讲解)

    QT概念 Qt:Qt是一个跨平台的C++框架(C++库),Qt除了支持界面设计(GUI编程),还封装了与网络编程.多线程.数据库连接.视频音频等相关的功能. ctrl 撤销(返回上一步) 市面常见的G ...

  8. 【免杀前置课——Windows编程】五、窗口控件——什么是控件、Windolws 窗口两大类、Windows标准控件/通用控件、控件响应的接收、创建窗口制作不同控件

    窗口控件 WINDOW控件 什么是控件? 控件是常见的窗口上的交互元素.例如:一个按钮,一个复选框,一个列表框等.当控件的特定功能被触发后,会主动发送消息通知父窗口,父窗口可以通过发送消息给控件控制控 ...

  9. 【转】Win32子窗口控件(按钮、编辑框、静态框、滚动条等)!!

    前言: 子窗口控件是特殊的子窗口,不需要我们注册窗口类,系统已经注册好了,我们只需要在创建时选择相应的窗口类名.常用的子窗口控件有按钮BUTTON.组合框COMBOBOX.编辑框EDIT.列表框LIS ...

最新文章

  1. android gridview固定行数据,如何在Android gridview中为行设置不同的列
  2. Coding中遇到的BUG集合~
  3. 静态static关键字修饰成员变量
  4. kata_小规模流处理kata。 第2部分:RxJava 1.x / 2.x
  5. 图灵奖大佬+谷歌团队,为通用人工智能背书!CV 任务也能用 LM 建模!
  6. flutter 获取android 还是ios_Flutter完整开发实战详解(二十、 Android PlatformView 和键盘问题)...
  7. java监听器的原理与实现
  8. c语言标识符的规范,初识C语言-声明和使用变量、标识符的命名规范以及基本数据类型...
  9. 计算机专业虽然好,但是也要有这些潜质才去选择
  10. Python机器学习基础教程
  11. et中计算机的快捷键,ET制版快捷键
  12. An invalid domain [] was specified for this cookie问题解决方案
  13. ABAP BDC个人使用见解
  14. java 社会统一信用代码分解,获取登记管理部门代码、机构类别代码、登记管理机关行政区划码、 主体标识码、校验码
  15. php 对象教程,创建一个简单的PHP对象_PHP教程
  16. html用手机什么软件能编写,目前编写一款简单的手机应用APP一般用什么编程语言?...
  17. java ecb加密_AES(Rijndael)算法ECB模式加密
  18. (4)Artemis支持的协议
  19. MSP430F5529库函数——模数转换模块(ADC12)软件触发
  20. linux游戏移植,英特尔移植AMD编译器代码可将Linux游戏性能提高10%

热门文章

  1. 编写自己的工具箱 (一)
  2. 字符串反序输出字符串
  3. [NOIP2014]飞扬的小鸟
  4. 初等数论及其应用——中国剩余定理
  5. Spring MVC 学习笔记一 HelloWorld
  6. Java集合框架练习-计算表达式的值
  7. crash recovery mysql_InnoDB crash recovery 完整过程
  8. python中continue用法案例_Python continue语句实例用法
  9. matlab impyramid图像金字塔
  10. VS2008中源文件与模块生成时的文件不同,仍要让调试器使用它吗