CN104598282B - 一种控件捕捉方法和设备 - Google Patents
一种控件捕捉方法和设备 Download PDFInfo
- Publication number
- CN104598282B CN104598282B CN201510061443.6A CN201510061443A CN104598282B CN 104598282 B CN104598282 B CN 104598282B CN 201510061443 A CN201510061443 A CN 201510061443A CN 104598282 B CN104598282 B CN 104598282B
- Authority
- CN
- China
- Prior art keywords
- target
- window
- control
- program
- widget
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Abstract
本发明实施例公开了一种控件捕捉方法,包括:获取正在运行的程序;检测从所述正在运行的程序中选择的目标程序;在所述目标程序的运行进程中加载目标DLL文件,以显示工具主窗口;当检测到通过所述工具主窗口输入的窗口句柄获取操作时,获取所述目标程序对应的目标窗口的窗口句柄,并将所述窗口句柄转换为Qt指针;若所述Qt指针不为空,根据所述Qt指针遍历所述目标窗口的所有子控件,并在所述工具主窗口中输出所述目标窗口的控件列表;当检测到针对所述目标窗口中的目标控件的操作时,在所述工具主窗口中输出所述目标控件的控件属性。本发明实施例还公开了一种控件捕捉设备。采用本发明,可以实现针对基于Qt的图形用户界面程序的控件的识别。
Description
技术领域
本发明涉及互联网技术领域,尤其涉及一种控件捕捉方法和设备。
背景技术
在图形用户界面(Graphical User Interface,GUI)编程过程中,经常需要对界面进行微调,但每修改一次代码,就需要重新编译生成新的程序文件,步骤重复,效率低下。利用Spy++等工具,可以对界面控件进行实时捕捉、监控、修改,避免了反复查看修改源代码的繁琐。
Spy++是基于Win32的实用工具,可以方便的查看Win32程序窗口的属性、子控件结构、窗口的消息等,但是由于基于Qt的图形用户界面(基于Qt开发的程序的图形用户界面)通常是用QWidget和QGraphicsItem叠加实现,只有根窗口的QWidget是真窗口,具有窗口句柄,其它的子控件QGraphicsItem则没有窗口句柄的,因此,Spy++无法识别基于Qt的图形用户界面的子控件。
发明内容
本发明实施例所要解决的技术问题在于,提供一种控件捕捉方法和设备,以实现针对基于Qt的图形用户界面的程序的控件的识别。
为了解决上述技术问题,本发明实施例提供了一种控件捕捉方法,包括:
获取正在运行的程序;
检测从所述正在运行的程序中选择的目标程序;
在所述目标程序的运行进程中加载目标DLL文件,以显示工具主窗口;
当检测到通过所述工具主窗口输入的窗口句柄获取操作时,获取所述目标程序对应的目标窗口的窗口句柄,并将所述窗口句柄转换为Qt指针;
若所述Qt指针不为空,根据所述Qt指针遍历所述目标窗口的所有子控件,并在所述工具主窗口中输出所述目标窗口的控件列表;其中,所述目标窗口的控件列表包括所述目标窗口以及所述目标窗口的所有子控件;
当检测到针对所述目标窗口中的目标控件的操作时,在所述工具主窗口中输出所述目标控件的控件属性;其中,所述目标控件包括所述目标窗口或所述目标窗口的子控件。
其中,所述在目标程序的进程对象中加载目标DLL文件,包括:
在所述目标程序的进程对象中启动一个线程,通过所述线程以所述目标DLL文件的访问路径为输入参数调用指定API,以加载所述目标DLL文件。
其中,所述在所述工具主窗口中输出所述目标控件的控件属性之后,还包括:
根据针对所述目标控件的控件属性的修改操作,修改所述目标子控件的控件属性。
其中,所述在所述工具主窗口中输出所述目标控件的控件属性之后,还包括:
当检测到针对目标控件的窗口消息监听指令时,以所述目标控件,以及指定事件为输入参数重载事件过滤函数,以监听该目标控件的窗口消息。
其中,所述在所述工具主窗口中输出所述目标控件的控件属性之后,还包括:
当检测到针对目标控件的信号与槽监听指令时,在信号发生起始时刻、信号发生结束时刻,以及槽被调用起始时刻、槽被调用结束时刻,运行预先定义的回调函数,以监听目标控件的信号与槽。
相应地,本发明实施例还提供了一种控件捕捉设备,包括:
获取模块,用于获取正在运行的程序;
检测模块,用于检测从所述正在运行的程序中选择的目标程序;
加载模块,用于在所述目标程序的运行进程中加载目标DLL文件,以显示工具主窗口;
所述获取模块,还用于当检测到通过所述工具主窗口输入的窗口句柄获取操作时,获取所述目标程序对应的目标窗口的窗口句柄;
转换模块,用于将所述窗口句柄转换为Qt指针;
输出模块,用于当所述Qt指针不为空时,根据所述Qt指针遍历所述目标窗口的所有子控件,并在所述工具主窗口中输出所述目标窗口的控件列表;其中,所述目标窗口的控件列表包括所述目标窗口以及所述目标窗口的所有子控件;
所述输出模块,还用于当检测到针对所述目标窗口中的目标控件的操作时,在所述工具主窗口中输出所述目标控件的控件属性;其中,所述目标控件包括所述目标窗口或所述目标窗口的子控件。
其中,所述加载模块,具体用于在所述目标程序的进程对象中启动一个线程,通过所述线程以所述目标DLL文件的访问路径为输入参数调用指定API,以加载所述目标DLL文件。
其中,所述设备还包括:
修改模块,用于根据针对所述目标控件的控件属性的修改操作,修改所述目标子控件的控件属性。
其中,所述设备还包括:
第一监听模块,用于当所述检测模块检测到针对目标控件的窗口消息监听指令时,以所述目标控件,以及指定事件为输入参数重载事件过滤函数,以监听该目标控件的窗口消息。
其中,所述设备还包括:
第二监听模块,用于当所述检测模块检测到针对目标控件的信号与槽监听指令时,在信号发生起始时刻、信号发生结束时刻,以及槽被调用起始时刻、槽被调用结束时刻,运行预先定义的回调函数,以监听目标控件的信号与槽。
实施本发明实施例,具有如下有益效果:
通过在从正在运行的程序中选择的目标程序的运行进程中加载目标DLL文件,显示工具主窗口,从而当检测到通过工具主窗口输入的窗口句柄获取操作时,获取该目标程序对应的目标窗口的窗口句柄,并将该窗口句柄转换为Qt指针,从而在Qt指针不为空时,在工具主窗口中输出目标窗口的控件列表;当检测到针对目标窗口中的目标控件的操作时,在工具主窗口中输出目标控件的控件属性,实现了针对基于Qt的图形用户界面程序的控件的识别。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种控件捕捉方法的流程示意图;
图1A为本发明实施例的一种目标窗口的示意图;
图2为本发明实施例提供的另一种控件捕捉方法的流程示意图;
图2A为本发明实施例提供的一种工具主窗口的示意图;
图3为本发明实施例提供的一种控件捕捉设备的结构示意图;
图4为本发明实施例提供的另一种控件捕捉设备的结构示意图;
图5为本发明实施例提供的另一种控件捕捉设备的结构示意图;
图6为本发明实施例提供的另一种控件捕捉设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,为本发明实施例提供的一种控件捕捉方法的流程示意图,可以包括以下步骤:
S101、获取正在运行的程序。
本发明实施例描述的控件捕捉方法可以应用于Qt界面辅助工具中,该Qt界面辅助工具可以运行在Windows XP或更新版本的操作系统中。但值得说明的是,上述方法不限于应用于Qt界面辅助工具中,其也可以应用于其它具有Qt界面辅助功能的工具中,本发明实施例不做限定。为了便于描述,以下以上述方法应用于Qt界面辅助工具为例进行描述。
本发明实施例中,用户运行上述工具之后,该工具可以获取正在运行的程序。例如,该工具可以通过Process32First和Process32Next函数遍历当前正在运行的程序。
S102、检测从正在运行的程序中选择的目标程序。
本发明实施例中,Qt界面辅助工具获取到正在运行的程序之后,可以向用户展示正在运行的程序,用户可以根据需求从正在运行的程序中选择目标程序。
S103、在目标程序的运行进程中加载目标DLL文件,以显示工具主窗口。
本发明实施例中,Qt界面辅助工具检测到从正在运行的进程中选择的目标程序之后,可以在该目标程序的运行进程中加载目标DLL文件,以显示工具主窗口。
具体的,Qt界面辅助工具可以在目标程序的运行进程中启动一个线程,并通过该线程以目标DLL文件的访问路径为输入参数调用指定API,以加载该目标DLL文件。其中,该指定API为系统提供的用于加载DLL文件的API。
S104、当检测到通过工具主窗口输入的窗口句柄获取操作时,获取该目标程序对应的目标窗口的窗口句柄,并将该窗口句柄转换为Qt指针。
本发明实施例中,用户可以通过工具主窗口中的指定功能按钮输入窗口句柄获取操作,该窗口句柄获取操作可以为用户通过鼠标按下工具主窗口中的指定功能按钮,并将光标移动到目标程序对应的目标窗口。其中,可以突出显示(如高亮显示)当前光标所选中的区域,例如,当光标处于目标窗口中任一子控件所在区域时,高亮显示该子控件;当光标未处于目标窗口中任一子控件所在区域(但仍在目标窗口中)时,高亮显示目标窗口。
举例来说,以目标程序为YY程序为例,上述窗口句柄获取操作可以为用户通过鼠标按下工具主窗口中的指定功能按钮(如“查找”),并将光标移动到YY程序对应的目标窗口(如“我的设置”窗口)。
S105、若该Qt指针不为空,根据该Qt指针遍历目标窗口的所有子控件,并在工具主窗口中输出目标窗口的控件列表,该目标窗口的控件列表包括目标窗口以及目标窗口的所有子控件。
本发明实施例中,Qt界面辅助工具检测到通过工具主窗口输入的窗口句柄获取操作时,可以获取目标程序对应的目标窗口的窗口句柄,并将该窗口句柄转换为Qt指针,例如,通过QWidget::find(WId id)方法将窗口句柄转换为Qt指针,若该Qt指针不为空,说明该目标窗口是由Qt GUI所创建,即该目标窗口为基于Qt的图形用户界面。
由于Qt窗口与子控件之间遵循父子关系,因此,根据目标窗口的Qt指针,可以通过遍历找到该目标窗口的所有子控件。
举例来说,参见图1A,假设上述目标程序为YY程序,目标窗口为YY程序的“我的设置”窗口,则该目标窗口的所有子控件可以包括“我的信息”、“我的公会”、“好友设置”…“离开、游戏中、忙碌时自动回复(100字内)”等子控件。
本发明实施例中,Qt界面辅助工具根据目标窗口的Qt指针找到目标窗口的所有子控件时,可以根据目标窗口以及目标窗口的所有子控件之间的父子关系,在工具主窗口中输出目标窗口的控件列表,该控件列表包括目标窗口和目标窗口的所有子控件。
例如,Qt界面辅助工具可以根据目标窗口以及目标窗口的所有子控件之间的父子关系,在工具主窗口中以树状结构列表的形式输出目标窗口的控件列表,其中,该树状结构列表的根节点即为目标窗口(即根窗口)。
本发明实施例中,基于工具主窗口中输出的目标窗口的控件列表,用户可以查看目标窗口中控件的父子关系,检验其是否符合预期(即是否与研发人员的设计相符)。
举例来说,仍以图1A所示窗口为例,若用户根据工具主窗口中输出的目标窗口的控件列表发现控件“好友设置”为控件“自动在系统托盘处闪动提醒”的子控件,则可知目标窗口的父子关系发生了错误。
需要注意的是,在本发明实施例中,若Qt界面辅助工具将获取到的目标窗口的窗口句柄转换为Qt指针时,得到的Qt指针为空,则表明目标窗口不是基于Qt的图形用户界面程序的窗口,可以结束控件捕捉流程,其具体实现本发明实施例不做限定。
S106、当检测到针对目标窗口中的目标控件的操作时,在工具主窗口中输出该目标控件的控件属性,该目标控件包括目标窗口或目标窗口的子控件。
本发明实施例中,当Qt界面辅助工具检测到针对目标窗口的目标控件(包括目标窗口或目标窗口中任一子控件)的操作时,Qt界面辅助工具可以在工具主窗口中输出该目标控件的控件属性,如控件的标题、字体、颜色、坐标、大小、可见等属性。
举例来说,以上述窗口句柄获取指令为用户通过鼠标按下工具主窗口中的指定功能按钮,并将光标移动到目标程序对应的目标窗口为例,相应地,上述针对目标控件的操作可以为用户将鼠标的光标移动到目标窗口中的任意区域,并松开鼠标,其中,当用户松开鼠标时,若光标所在区域为目标窗口中任一子控件所在区域,则目标控件即为该子控件;若光标所在区域中不是目标窗口中子控件所在区域,则目标控件即为目标窗口。
需要注意的是,本发明实施例中,上述窗口句柄获取操作为通过鼠标按下工具主窗口中的指定功能按钮,并将光标移动到目标程序对应的目标窗口,以及上述针对目标窗口的目标控件的操作为用户将鼠标移动到目标窗口中的任意区域并松开鼠标仅仅是本发明具体实现方式的一种示例,而并不是对本发明保护范围的限定,本发明实施例中,上述窗口句柄获取操作,以及上述针对目标窗口的目标控件的操作也可以是其它操作,例如,上述窗口句柄获取操作还可以为用户通过鼠标单击(或双击)指定功能按钮后,将光标移动到目标程序对应的目标窗口,上述针对目标窗口的目标控件的操作还可以为用户在目标窗口中的任意区域单击(或双击)鼠标,其具体实现在此不再赘述。
又举例来说,参见图1A,假设目标程序为YY程序,目标程序对应的目标窗口为“我的设置”窗口,当用户通过鼠标按下工具主窗口中的“查找”按钮,并将光标移动到YY程序的“我的设置”窗口中的“自动在系统托盘处闪动提醒”对应的区域时松开鼠标,则目标控件即为YY程序的“我的设置”窗口中的子控件“自动在系统托盘处闪动提醒”,Qt界面辅助工具检测到上述操作之后,可以在工具主界面中输出子控件“自动在系统托盘处闪动提醒”的控件属性,如标题、字体、颜色、坐标、大小、可见等。
进一步地,在本发明实施例中,用户除了可以通过上述针对目标窗口的目标控件的操作来查看目标窗口或目标窗口中任一子控件的控件属性之外,还可以通过在工具主窗口中输出的控件列表中选中任一控件(包括目标窗口和目标窗口中所有子控件)的方式来查看该控件的控件属性。
具体的,当Qt界面辅助工具检测到针对目标窗口的控件列表中的控件的选择指令时,Qt界面辅助工具可以获取该控件的控件指针,使用QMetaObject::property(intindex)方法,可以获取该控件的控件属性,并在工具主窗口中输出该控件的控件属性。其中,QMetaObject::property()函数用于动态获取对象属性。
进一步地,在本发明实施例中,在工具主窗口输出目标控件的控件属性之后,还可以根据针对目标控件的控件属性的修改操作,修改目标控件的控件属性。
具体的,基于工具主窗口中输出的目标控件的控件属性,用户可以对目标控件的控件属性进行修改,例如,用户可以通过鼠标双击工具主窗口中输出的目标控件的控件属性,触发工具主窗口输出控件属性修改界面,并在该属性修改界面中对控件属性进行修改。
相应地,当Qt界面辅助工具接收到通过工具主窗口输入的针对目标控件的控件属性的操作指令时,可以输出控件属性修改界面,并根据用户在该控件属性修改界面中输入的属性值,对相应的控件属性的属性值进行修改。
在具体实现中,Qt界面辅助工具可以使用QObject::setProperty(const char*name,const QVariant&value)方法实现控件属性的修改。其中,QObject::setProperty()函数用于动态设置对象属性。
进一步地,本发明实施例中,在工具主窗口中输出目标窗口的控件列表之后,若接收到针对目标控件的窗口消息监听指令,以该目标控件,以及指定事件为输入参数,重载事件过滤函数,以监听该目标控件的窗口消息。
具体的,Qt界面辅助工具可以通过重载virtual bool eventFilter(QObject*obj,QEvent*event)实现监听针对目标控件的窗口消息。其中,virtual bool eventFilter为事件过滤函数,可以用于窗口消息监听。
进一步地,本发明实施例中,在工具主窗口中输出目标窗口的控件列表之后,若接收到针对目标控件的信号与槽监听指令,可以在信号发生起始时刻、结束时刻、槽被调用起始时刻以及结束时刻,运行预先定义的回调函数,以监听目标控件的信号与槽。
具体的,为了实现监听目标控件的信号与槽,需要预先定义信号与槽发生时的回调函数,并赋值给QSignalSpyCallbackSet类型的成员变量signal_begin_callback、signal_end_callback、slot_begin_callback与slot_end_callback,然后调用qt_register_signal_spy_callbacks(QSignalSpyCallbackSet set)方法即可。其中,signal_begin_callback、signal_end_callback、slot_begin_callback与slot_end_callback分别为目标控件发出信号的起始时刻、结束时刻、调用槽的起始时刻与结束时刻时,需要运行的自定义回调函数;qt_register_signal_spy_callbacks()用于将上述回调函数注册到目标控件内,使其在信号或槽被触发时被调用。
为了使本领域技术人员更好地理解本发明实施例提供的技术方案,下面结合具体的应用场景对本发明实施例提供的技术方案进行描述。
在该实施例中,Qt界面辅助工具的主要模块可以包括:
1)、主程序模块QtUISpyCaller.exe,用于实现获取当前正在运行的程序,将另外两个模块加载到从当前正在运行的程序中选择的目标程序的运行进程中。
2)、界面捕捉模块QtUISpy.dll,用于实现输出目标窗口的控件列表,对控件进行高亮显示、消息监控等。
3)、控件属性查改模块QtUIUtils.dll,用于实现查看、修改选定的控件属性。
如图2所示,为本发明实施例提供的另一种控件捕捉方法的流程示意图,可以包括以下步骤:
S201、使用Process32First和Process32Next函数遍历当前正在运行的程序。
本发明实施例中,Qt界面辅助工具开启运行后,可以通过Process32First和Process32Next函数获取当前正在运行的程序。
S202、使用OpenProcess函数打开从当前正在运行的程序中选择的目标程序的运行进程,获取该运行进程的句柄。
本发明实施例中,Qt界面辅助工具获取到正在运行的程序之后,可以向用户展示正在运行的程序,用户可以根据需求从正在运行的程序中选择目标程序。
Qt界面辅助工具检测到从当前正在运行的进程中选择的目标程序之后,可以使用OpenProcess函数打开该目标程序的运行进程,并获取该运行进程的句柄,其中,该运行进程的句柄用于唯一标识该运行进程。
S203、在目标程序的运行进程中加载目标DLL文件,以显示工具主窗口。
本发明实施例中,Qt界面辅助工具打开目标程序的运行进程之后,可以利用DLL注入技术,将Qt界面辅助工具的核心模块(即DLL文件——QtUISpy.dll和QtUIUtils.dll)注入到目标程序的运行进程中,即通过DLL注入,使目标进程在在其内存地址中加载Qt界面辅助工具的核心模块。
在具体实现中,Qt界面辅助工具可以通过在目标进程中启动一个线程,并以核心模块的访问路径为输入参数,调用加载DLL文件的系统API,以实现在目标进程的内存地址中加载该DLL文件。
本发明实施例中,在目标程序的运行进程中加载目标DLL文件之后,Qt界面辅助工具可以通过传递目标进程的句柄来远程调用QtUISpy.dll的入口函数,以显示工具主窗口。
S204、当检测到用户通过鼠标按下“查找”按钮的操作时,获取光标下的目标程序对应的目标窗口的窗口句柄,并将该窗口句柄转换为Qt指针。
本发明实施例中,Qt界面辅助工具的工具主窗口中包括用于获取目标窗口的窗口句柄的功能按键“查找”(find),用户可以通过鼠标按下“查找”按钮,并将光标移动至目标窗口所在区域,获取目标窗口的窗口句柄。
当Qt界面辅助工具检测到用户通过鼠标按下“查找”按钮的操作时,Qt可以获取光标下的目标程序对应的目标窗口的窗口句柄,并通过QWidget::find(WId id)方法将句柄转换为Qt指针,若Qt指针不为空,则表明该目标窗口为基于Qt的图形用户界面程序的窗口。
本发明实施例中,当用户通过鼠标按下“查找”按钮,并将光标移动到目标窗口所在区域时,可以高亮显示光标所在区域对应的控件;其中,若光标所在区域为目标窗口中任一子控件对应的区域,则高亮显示该子控件对应的区域;若光标所在区域不是目标窗口中任一子控件对应的区域,则高亮显示目标窗口。
S205、若Qt指针不为空,根据Qt指针遍历目标窗口的所有子控件,并在工具主窗口中输出目标窗口的控件列表,该目标窗口的控件列表包括目标窗口以及目标窗口的所有子控件。
本发明实施例中,当Qt界面辅助工具检测到用户通过鼠标按下“查找”按钮,并将光标移动到目标窗口,且确定目标窗口为基于Qt的图形用户界面程序的窗口时,Qt界面辅助工具可以根据该目标窗口对应的Qt指针,遍历该目标窗口的所有子控件。
其中,由于Qt窗口(基于Qt的图形用户界面程序的窗口)与子控件之间遵循父子关系,因此,通过目标窗口的Qt指针,可以找到其所有子控件。
Qt界面辅助工具遍历目标窗口的所有子控件之后,可以在工具主窗口中,以树状结构列表的形式输出目标窗口的控件列表(包括目标窗口以及目标窗口的所有子控件),该树状结构列表中每一个树节点代表一个控件(目标窗口或目标窗口的任一子控件),存储着该控件的指针;其中,通过该树状结构列表可以清晰地看出,目标窗口的控件(包括目标窗口,以及目标窗口中所有子控件)之间的父子关系。其中,Qt界面辅助工具在工具主窗口中,以树状结构列表的形式输出目标窗口的控件列表的示意图可以参见图2A中的(a)。
S206、当检测到用户松开鼠标的操作时,在工具主窗口中输出目标控件的控件属性,该目标控件包括目标窗口或目标窗口的子控件。
本发明实施例中,Qt界面辅助工具检测到用户通过鼠标按下“查找”按钮,并将光标移动到目标窗口所在区域时,除了可以执行上述步骤之外,还可以获取光标所在区域对应的目标控件的控件属性,并当检测到用户松开鼠标的操作时,在工具主窗口中输出目标控件的控件属性。其中,若光标所在区域为目标窗口中任一子控件所对应的区域,目标控件则为该子控件,Qt界面辅助工具可以在工具主窗口中输出该子控件的控件属性;若光标所在区域不是目标窗口中任一子控件所对应的区域,目标控件则为目标窗口,Qt界面辅助工具可以在工具主窗口中输出目标窗口的控件属性。其中,Qt界面辅助工具在工具主窗口中输出目标控件的控件属性的示意图,可以参见图2A中的(b)。
本发明实施例中,用户除了可以通过上述步骤描述的方式查看目标控件的控件属性之外,还可以通过选中工具主窗口中输出的目标窗口的控件列表中任一控件的方式,查看该控件的控件属性。
当Qt界面辅助工具检测到从目标窗口的控件列表中选中控件的指令时,可以获取该控件的指针,并使用QMetaObject::property(int index)方法获取该控件的控件属性,并在工具主窗口中输出该控件的控件属性。
S207、当检测到针对目标控件的控件属性的修改操作时,修改目标控件的控件属性。
本发明实施例中,当Qt界面辅助工具接收到通过工具主窗口输入的针对目标控件的控件属性的操作指令时,如用户通过鼠标双击工具主窗口中输出目标控件的控件属性,可以输出控件属性修改界面,并根据用户在该控件属性修改界面中输入的属性值,对相应的控件属性的属性值进行修改。
其中,在具体实现中,Qt界面辅助工具可以使用QObject::setProperty(constchar*name,const QVariant&value)方法实现控件属性的修改。
S208、当接收到针对目标控件的窗口消息监听指令时,以该目标控件,以及指定事件为输入参数,重载事件过滤函数,以监听该目标控件的窗口消息。
本发明实施例中,Qt界面辅助工具可以通过重载virtual bool eventFilter(QObject*obj,QEvent*event)实现监听针对指定事件的窗口消息。其中,virtual booleventFilter为事件过滤函数,可以用于窗口消息监听。
S209、当接收到针对目标控件的信号与槽监听指令时,在信号发生起始时刻、信号发生结束时刻,以及槽被调用起始时刻、槽被调用结束时刻,运行预先定义的回调函数,以监听目标控件的信号与槽。
本发明实施例中,为了实现监听目标控件的信号与槽,需要预先定义信号与槽发生时的回调函数,并赋值给QSignalSpyCallbackSet类型的成员变量signal_begin_callback、signal_end_callback、slot_begin_callback与slot_end_callback,然后调用qt_register_signal_spy_callbacks(QSignalSpyCallbackSet set)方法即可。
可见,在图1、2所描述的方法流程中,通过Qt界面辅助工具,可以在不查看、修改源代码的情况下,查看基于Qt的图形用户界面程序的窗口(Qt窗口)的控件的父子关系、Qt窗口的各控件的控件属性,修改控件的控件属性,监听目标控件的窗口消息、信号与槽等,从而可以提高基于Qt的图形用户界面程序的开发效率。
通过以上描述可知,在本发明实施例中,通过在从正在运行的程序中选择的目标程序的运行进程中加载目标DLL文件,显示工具主窗口,从而当检测到通过工具主窗口输入的窗口句柄获取操作时,获取该目标程序对应的目标窗口的窗口句柄,并将该窗口句柄转换为Qt指针,从而在Qt指针不为空时,在工具主窗口中输出目标窗口的控件列表;当检测到针对目标窗口中的目标控件的操作时,在工具主窗口中输出目标控件的控件属性,实现了针对基于Qt的图形用户界面程序的控件的识别。
基于上述方法实施例相同的技术构思,本发明实施例还提供了一种控件捕捉设备,可以应用于上述方法实施例中。
如图3所示,为本发明实施例提供的一种控件捕捉设备的结构示意图,可以包括:
获取模块301,用于获取正在运行的程序;
检测模块302,用于检测从所述正在运行的程序中选择的目标程序;
加载模块303,用于在所述目标程序的运行进程中加载目标DLL文件,以显示工具主窗口;
所述获取模块303,还用于当检测到通过所述工具主窗口输入的窗口句柄获取操作时,获取所述目标程序对应的目标窗口的窗口句柄;
转换模块304,用于将所述窗口句柄转换为Qt指针;
输出模块305,用于当所述Qt指针不为空时,根据所述Qt指针遍历所述目标窗口的所有子控件,并在所述工具主窗口中输出所述目标窗口的控件列表;其中,所述目标窗口的控件列表包括所述目标窗口以及所述目标窗口的所有子控件;
所述输出模块305,还用于当检测到针对所述目标窗口中的目标控件的操作时,在所述工具主窗口中输出所述目标控件的控件属性;其中,所述目标控件包括所述目标窗口或所述目标窗口的子控件。
在可选实施例中,所述加载模块303,可以具体用于在所述目标程序的进程对象中启动一个线程,通过所述线程以所述目标DLL文件的访问路径为输入参数调用指定API,以加载所述目标DLL文件。
请一并参阅图4,图4是本发明实施例公开的另一种控件捕捉设备的结构示意图。其中,图4所示的控件捕捉设备是由图3所示的控件捕捉设备进行优化得到的,与图3所示的控件捕捉设备相比,图4所示的控件捕捉设备还可以包括:
修改模块306,用于根据针对所述目标控件的控件属性的修改操作,修改所述目标子控件的控件属性。
请一并参阅图5,图5是本发明实施例公开的另一种控件捕捉设备的结构示意图。其中,图5所示的控件捕捉设备是由图3所示的控件捕捉设备进行优化得到的,与图3所示的控件捕捉设备相比,图5所示的控件捕捉设备还可以包括:
第一监听模块307,用于当所述检测模块302检测到针对目标控件的窗口消息监听指令时,以所述目标控件,以及指定事件为输入参数重载事件过滤函数,以监听该目标控件的窗口消息。
请一并参阅图6,图6是本发明实施例公开的另一种控件捕捉设备的结构示意图。其中,图6所示的控件捕捉设备是由图3所示的控件捕捉设备进行优化得到的,与图3所示的控件捕捉设备相比,图6所示的控件捕捉设备还可以包括:
第二监听模块308,用于当所述检测模块302检测到针对目标控件的信号与槽监听指令时,在信号发生起始时刻、信号发生结束时刻,以及槽被调用起始时刻、槽被调用结束时刻,运行预先定义的回调函数,以监听目标控件的信号与槽。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属技术领域的技术人员所理解。
在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,"计算机可读介质"可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPROM或闪速存储器),光纤装置,以及便携式光盘只读存储器(CDROM)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。
上述提到的存储介质可以是只读存储器,磁盘或光盘等。尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。
Claims (10)
1.一种控件捕捉方法,其特征在于,包括:
获取正在运行的程序;
检测从所述正在运行的程序中选择的目标程序;
在所述目标程序的运行进程中加载目标DLL文件,以显示工具主窗口;
当检测到通过所述工具主窗口输入的窗口句柄获取操作时,获取所述目标程序对应的目标窗口的窗口句柄,并将所述窗口句柄转换为Qt指针;
若所述Qt指针不为空,根据所述Qt指针遍历所述目标窗口的所有子控件,并在所述工具主窗口中输出所述目标窗口的控件列表;其中,所述目标窗口的控件列表包括所述目标窗口以及所述目标窗口的所有子控件;
当检测到针对所述目标窗口中的目标控件的操作时,在所述工具主窗口中输出所述目标控件的控件属性;其中,所述目标控件包括所述目标窗口或所述目标窗口的子控件。
2.如权利要求1所述的方法,其特征在于,所述在目标程序的进程对象中加载目标DLL文件,包括:
在所述目标程序的进程对象中启动一个线程,通过所述线程以所述目标DLL文件的访问路径为输入参数调用指定API,以加载所述目标DLL文件。
3.如权利要求1所述的方法,其特征在于,所述在所述工具主窗口中输出所述目标控件的控件属性之后,还包括:
根据针对所述目标控件的控件属性的修改操作,修改目标子控件的控件属性。
4.如权利要求1所述的方法,其特征在于,所述在所述工具主窗口中输出所述目标控件的控件属性之后,还包括:
当检测到针对目标控件的窗口消息监听指令时,以所述目标控件,以及指定事件为输入参数重载事件过滤函数,以监听该目标控件的窗口消息。
5.如权利要求1所述的方法,其特征在于,所述在所述工具主窗口中输出所述目标控件的控件属性之后,还包括:
当检测到针对目标控件的信号与槽监听指令时,在信号发生起始时刻、信号发生结束时刻,以及槽被调用起始时刻、槽被调用结束时刻,运行预先定义的回调函数,以监听目标控件的信号与槽。
6.一种控件捕捉设备,其特征在于,包括:
获取模块,用于获取正在运行的程序;
检测模块,用于检测从所述正在运行的程序中选择的目标程序;
加载模块,用于在所述目标程序的运行进程中加载目标DLL文件,以显示工具主窗口;
所述获取模块,还用于当检测到通过所述工具主窗口输入的窗口句柄获取操作时,获取所述目标程序对应的目标窗口的窗口句柄;
转换模块,用于将所述窗口句柄转换为Qt指针;
输出模块,用于当所述Qt指针不为空时,根据所述Qt指针遍历所述目标窗口的所有子控件,并在所述工具主窗口中输出所述目标窗口的控件列表;其中,所述目标窗口的控件列表包括所述目标窗口以及所述目标窗口的所有子控件;
所述输出模块,还用于当检测到针对所述目标窗口中的目标控件的操作时,在所述工具主窗口中输出所述目标控件的控件属性;其中,所述目标控件包括所述目标窗口或所述目标窗口的子控件。
7.如权利要求6所述的设备,其特征在于,
所述加载模块,具体用于在所述目标程序的进程对象中启动一个线程,通过所述线程以所述目标DLL文件的访问路径为输入参数调用指定API,以加载所述目标DLL文件。
8.如权利要求6所述的设备,其特征在于,所述设备还包括:
修改模块,用于根据针对所述目标控件的控件属性的修改操作,修改目标子控件的控件属性。
9.如权利要求6所述的设备,其特征在于,所述设备还包括:
第一监听模块,用于当所述检测模块检测到针对目标控件的窗口消息监听指令时,以所述目标控件,以及指定事件为输入参数重载事件过滤函数,以监听该目标控件的窗口消息。
10.如权利要求6所述的设备,其特征在于,所述设备还包括:
第二监听模块,用于当所述检测模块检测到针对目标控件的信号与槽监听指令时,在信号发生起始时刻、信号发生结束时刻,以及槽被调用起始时刻、槽被调用结束时刻,运行预先定义的回调函数,以监听目标控件的信号与槽。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510061443.6A CN104598282B (zh) | 2015-02-05 | 2015-02-05 | 一种控件捕捉方法和设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510061443.6A CN104598282B (zh) | 2015-02-05 | 2015-02-05 | 一种控件捕捉方法和设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104598282A CN104598282A (zh) | 2015-05-06 |
CN104598282B true CN104598282B (zh) | 2017-10-27 |
Family
ID=53124100
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510061443.6A Active CN104598282B (zh) | 2015-02-05 | 2015-02-05 | 一种控件捕捉方法和设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104598282B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105607985B (zh) * | 2015-09-29 | 2018-02-06 | 中国船舶重工集团公司第七0九研究所 | 基于Qt图形界面软件的操作日志记录方法及系统 |
CN108536492B (zh) * | 2018-04-08 | 2021-09-07 | 武汉斗鱼网络科技有限公司 | 一种直播间属性信息获取方法、装置、设备及存储介质 |
CN109614325B (zh) * | 2018-12-05 | 2022-06-07 | 上海科梁信息科技股份有限公司 | 一种确定控件属性的方法及装置、电子设备和存储介质 |
CN111522482B (zh) * | 2020-04-28 | 2022-01-07 | 科世达(上海)机电有限公司 | Sap系统控件id获取方法、装置、设备及存储介质 |
CN115495057B (zh) * | 2022-11-16 | 2023-02-28 | 江苏智云天工科技有限公司 | 实现windows和HDFS通信的方法和系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102103491A (zh) * | 2009-12-18 | 2011-06-22 | Tcl集团股份有限公司 | 一种界面生成系统以及方法 |
CN102830958A (zh) * | 2011-06-16 | 2012-12-19 | 奇智软件(北京)有限公司 | 一种获取界面控件信息的方法及系统 |
CN103064782A (zh) * | 2011-10-21 | 2013-04-24 | 腾讯科技(深圳)有限公司 | 一种获取控件的方法及装置 |
-
2015
- 2015-02-05 CN CN201510061443.6A patent/CN104598282B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102103491A (zh) * | 2009-12-18 | 2011-06-22 | Tcl集团股份有限公司 | 一种界面生成系统以及方法 |
CN102830958A (zh) * | 2011-06-16 | 2012-12-19 | 奇智软件(北京)有限公司 | 一种获取界面控件信息的方法及系统 |
CN103064782A (zh) * | 2011-10-21 | 2013-04-24 | 腾讯科技(深圳)有限公司 | 一种获取控件的方法及装置 |
Non-Patent Citations (7)
Title |
---|
"QWidget之Alien与Native小记";dbzhang800;《http://blog.csdn.net/dbzhang800/article/details/7006270》;20111123;第1-9页 * |
"如何查找另一外QT窗口中的控件?";980333;《http://bbs.csdn.net/topics/390966748》;20150107;第1-17页 * |
ALEAF."根据获取的窗口句柄遍历窗口Edit控件".《http://blog.163.com/sdzhangyuyin@126/blog/static/13841374820146841823473/》.2014, * |
jiaxueq."现很多主流软件都用QT编程,控件无句柄,且窗口没激活时postmessage不响应,肿么办?".《http://bbs.pediy.com/thread-196589.htm》.2015, * |
lujianfeiccie2009."QT遍历窗体的控件".《http://blog.csdn.net/lujianfeiccie2009/article/details/6017874》.2010, * |
suifenghuidong."如何获得qt对话框中控件的信息啊".《http://bbs.csdn.net/topics/390596368》.2013, * |
zyl0425."QT如何遍历控件,并依次获取控件的值啊".《http://bbs.csdn.net/topics/390329912/》.2012, * |
Also Published As
Publication number | Publication date |
---|---|
CN104598282A (zh) | 2015-05-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104598282B (zh) | 一种控件捕捉方法和设备 | |
CN106649100A (zh) | 一种自动化测试方法及系统 | |
CN109426723A (zh) | 使用释放后内存的检测方法、系统、设备及存储介质 | |
CN107193269B (zh) | 程序开发辅助装置以及程序开发辅助方法 | |
CN102799529B (zh) | 一种动态的二进制代码测试用例生成方法 | |
CN104866585B (zh) | 一种试验试飞数据综合处理系统 | |
WO2011031328A2 (en) | Systems and methods for management of projects for development of embedded systems | |
CN103605606B (zh) | 一种可自动转换的嵌入式软件测试用例批量执行方法 | |
CN101930399A (zh) | 一种对软件测试进行记录的方法 | |
CN112765020A (zh) | 一种计算机联锁系统的自动化测试方法 | |
US9286361B2 (en) | Extract-transform-load processor controller | |
CN110442510A (zh) | 一种页面属性获取方法、装置及计算机设备、存储介质 | |
CN106951365B (zh) | 一种基于面向对象软件代码的软件复杂网络模型构建方法 | |
CN108921600A (zh) | 实现信息分类的装置和方法及存储介质 | |
CN110704044A (zh) | 一种可视化编程系统 | |
CN109298882A (zh) | 接口的管理方法、计算机可读存储介质和终端设备 | |
CN109472656A (zh) | 一种虚拟物品的展示方法、装置和存储介质 | |
Heidenreich et al. | On Controlled Visualisations in Software Product Line Engineering. | |
CN113919158A (zh) | 一种用于飞行控制面板的仿真方法、装置及存储介质 | |
CN104899042B (zh) | 一种嵌入式机器视觉检测程序开发方法及系统 | |
CN103632099B (zh) | 未导出的Native API函数获取方法及装置 | |
CN104461890A (zh) | 一种航管训练系统开发中Qt程序内存使用静态检查方法 | |
KR101985491B1 (ko) | 다이어그램 방식의 시각화 수식 작성을 통한 결과 생성 및 모니터링 장치 | |
Gerlitz et al. | Flow sensitive slicing for MATLAB/Simulink models | |
CN110362767A (zh) | 埋点处理方法、装置、系统及计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information | ||
CB02 | Change of applicant information |
Address after: 510000, Guangdong Province, Guangzhou, Panyu District Town, Huambo business district, Wanda Plaza, block B1, 28 floor Applicant after: Guangzhou Huaduo Network Technology Co., Ltd. Address before: 510655, Guangzhou, Whampoa Avenue, No. 2, creative industrial park, building 3-08, Applicant before: Guangzhou Huaduo Network Technology Co., Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |