[咨询贴]外部程序表格控制

jxqn_liu 2012-10-19 03:26:43
大家好!

小弟现在使用Delphi软件开发一个辅助工具,需要涉及到控制外部程序,此处的控制涉及到外部程序内容的变更。

至于内容的变更和按钮的操作,小弟现在这边已经处理了一部分。即文本框和按钮的操作暂时已经处理完成。

现在遇到一个问题就是涉及到表格的控制。

对于表格,通过窗口句柄能扫描到表格控件的句柄,但是对于表格列的控制却无从下手。有哪位大哥做过类似的功能还往指点下小弟。

这里的外部程序,指不定是通过什么工具开发的,所以对于表格控件是什么类型的无从得知。网上下了个一个相关的例子,那个例子是针对TStringGrid控件进行读取数据,但是这样就是有针对性的了,如果是非DELPHI开发的,这样还是不靠谱!
...全文
216 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxqn_liu 2012-10-30
  • 打赏
  • 举报
回复

问题暂时性的解决了,算是走了一个偏门吧。把方法分享下。
实现的步骤:
1、获取表格列的X/Y坐标,X坐标是固定的,Y坐标在起始坐标上加行数*行高
2、设置控制外部程序前置和表格获取相应的焦点
3、将鼠标移动到对应的列上
4、模拟鼠标点击,以表格进入选中状态
5、将需要设置的值拷贝到剪贴板
6、根据表格去设置表格列进入输入状态,由于我的当前表格是TStringGrid,需要输入一个字母进入状态,然后删除值
7、模拟键盘CTRL+V粘帖数据到表格列

以上大概就是我的目前实现步骤,如果各位有啥想法欢迎提供!谢谢


附上示例源码,提供参考:

var
i, j, iHeight: Integer;
Str: string; //设置需要输入的表格列值,这里的示例就是一个固定的值
StrList: TStringList; //这个是存储表格列的所有列的位置
begin
iHeight := 0;
//添加测试表格列的位置
StrList := TStringList.Create;
StrList.Add('330');
StrList.Add('480');
StrList.Add('550');
StrList.Add('610');
StrList.Add('670');
StrList.Add('730');
StrList.Add('800');
StrList.Add('860');
StrList.Add('920');

//根据句柄设置窗体前置
SetForegroundWindow(198156);
//根据表格句柄设置表格获取焦点
Windows.SetFocus(67248);

//这里模拟的是3行数据
for j := 0 to 2 do
begin
iHeight := 380 + j * 23; //这里设置的行高是23,每增一行增加相应的高度
for i := 0 to StrList.Count - 1 do
begin
//将鼠标移动到相应的表格列
SetCursorPos(StrToInt(StrList[i]), iHeight);
//模拟鼠标左键点击
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

//设置表格列的数据,这里模拟的是一个固定值
Str := 'TEST';
//将值拷贝到剪贴板
Clipboard.AsText := Str;

//因为我这模拟的是TStringGrid,需要先获取输入状态(试过,模拟鼠标再次点击不能进入输入状态)
keybd_event(Ord('A')+i, 0, 0, 0);
keybd_event(Ord('A')+i, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_BACK, 0, 0, 0);
keybd_event(VK_BACK, 0, KEYEVENTF_KEYUP, 0);

--模拟键盘CTRL+V粘帖数据到表格列
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0);
keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);

--等待20毫秒
Sleep(20);
end;
end;
//清空对象
FreeAndNil(StrList);

//设置当前自己的程序前置
SetForegroundWindow(Handle);
end;

jxqn_liu 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

stringgrid没有所谓的列句柄,这不是win32标准控件,是DELPHI自己用panel画出来的,整个stringgrid是一个整体,只有一个大句柄
[/Quote]
这个知道,也不是说STRINGGRID,其他的表格控件也没有。
后面想了下,表格列不可能有句柄,这样一个表格,多行多列,就算是列有句柄,该列所对应的行也没有,毕竟表格的行列是位置的,所以表格列不允许有句柄。
后来走了一个偏门,详情在11楼
hsfzxjy 2012-10-30
  • 打赏
  • 举报
回复
stringgrid没有所谓的列句柄,这不是win32标准控件,是DELPHI自己用panel画出来的,整个stringgrid是一个整体,只有一个大句柄
jxqn_liu 2012-10-26
  • 打赏
  • 举报
回复
汗,没人了吗?

再请问一下,有没有什么函数可以在鼠标移动到指定位置后,发一个指令,字段在鼠标所在的位置上输入值!


求教啊求教啊
jxqn_liu 2012-10-24
  • 打赏
  • 举报
回复
在网上搜索了API函数,找到一个ChildWindowFromPoint,看这介绍好像是可以获取组合控件上的子控件句柄,但是我怎么也获取不到,是我获取有误还是根本就获取不到?

var
ChildHandle, MainHandle: THandle;
P: TPoint;
begin
P.X := 60;
P.Y := 30;
MainHandle := StringGrid1.Handle; //获取StringGrid1的句柄
//MainHandle := Handle; //获取窗体的句柄

ChildHandle := ChildWindowFromPoint(MainHandle, P);
end;

通过这样的方式获取到的还是StringGrid1的Handle

现在这有几个疑问,想请教一下。
1.MainHandle的值是传主窗体的还是组合控件的句柄。我的理解是:如果想获取StringGrid1的列句柄(假如能获取),那这里传的值应该是StringGrid1的句柄;如果传的是主窗体的句柄的话,我想这获得的句柄是捕捉的应该是主窗体下指定点的第一个子控件,而不是子控件中的其他子控件。

2.P点的位置问题。P点的位置是相对应屏幕的位置或主窗体的下的相对位置或MainHandle对应控件的下的相对位置,获取是其他的位置,这点不明白。

来个大神吧
yxbv84267 2012-10-24
  • 打赏
  • 举报
回复
不懂,期待高手参与,学习!
jxqn_liu 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

这里的外部程序,指不定是通过什么工具开发的
那靠什么取得它的表格内容呢?

以前做过一个连连看的外挂,是截屏判断每个图块的内容取得它是什么
[/Quote]
外部程序就是不确定的因素太多了,所以赋值的话就不好处理。
这里不是需要获取他的值,而是需要设置他的值。当然,如果指定获取的话,逆向复制应该也不是很大的问题了
jxqn_liu 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

不同的开发环境会有不同的grid的制作方式和效果,如果想要选中一个项,一般是计算出该项的坐标,再模拟点击事件。毕竟表格非标准win32控件,没有明确的消息处理
[/Quote]
模拟点击的我也考虑过了,这样模拟点击的话,那外部程序的窗口就必须激活,要不接受不到事件。表格的值多行多列赋值的话,这样做的话就需要窗口来回的切换吧?
jxqn_liu 2012-10-22
  • 打赏
  • 举报
回复
么人接触过类似的开发吗?

人工置顶
haitao 2012-10-20
  • 打赏
  • 举报
回复
这里的外部程序,指不定是通过什么工具开发的
那靠什么取得它的表格内容呢?

以前做过一个连连看的外挂,是截屏判断每个图块的内容取得它是什么
hsfzxjy 2012-10-19
  • 打赏
  • 举报
回复
不同的开发环境会有不同的grid的制作方式和效果,如果想要选中一个项,一般是计算出该项的坐标,再模拟点击事件。毕竟表格非标准win32控件,没有明确的消息处理
jxqn_liu 2012-10-19
  • 打赏
  • 举报
回复
这是要沉了吗?还是没人做过类似的
越的访问速度和负载能力 Discuz! 从创立之初即以提高产品效率为突破口,随着编译模板,语法生成内核,数据缓存和自动更新机制等独创或独有技术的应用,和坚固的数据结构及最少化数据库查询设计,使得 Discuz! 可以在极为繁忙的服务器环境下快速稳定运行,切实节约企业成本,提升企业形象。 强大而完善的功能 除了一般论坛所具有的功能外, Discuz! 还提供了很大限度的个性化设定。众多功能在后台预留开关,可按企业需要启用。前台全部采用编译模板技术构建,更换界面易如反掌。完善的权限设定,使管理员可控制到每个用户,每个组及所在每个分论坛的各种权限。 国际化和标准化的产品架构 目前发布的版本分为简体中文,繁体中文和英文三个版本。自 Discuz! 2.0 以来,因其高效国际化内核的应用,使其成功走出国门,步入海外市场,商业客户遍及中国大陆,香港,台湾,北美,欧洲,澳洲,马来西亚等国家和地区。 周密的安全部署和攻击防护 Discuz! 能有效处理页面格式,保证页面及表格的完整性。安全检查应用于每一个 Discuz! 代码中,可自动屏蔽子及签名等中的恶意代码和跨站脚本攻击。独有的全程操作记录,使论坛运行情况随时有据可查。 持久的创新和广阔的前景 Discuz! 拥有一支富于创新的开发队伍,持续性的技术优势和不断增长的市场经验,除了强化已有的市场竞争力以外,更增强了已有和潜在客户的信心,我们并不满足于现有成果,我们时刻关注国内外相关领域内的最新进展和动态,不断的进步和创新,已使越来越多的人相信 Discuz! 辉煌的明天。 操作系统要求 Discuz! 具备跨平台特性,可以运行于 Linux/FreeBSD/Unix 及微软 Windows 2000/2003 等各种操作系统环境下。我们已在软件中针对上述操作系统做了大量的测试和实地检验,保证 Discuz! 可以在上述系统中安全稳定的运行,但您仍然需要做好服务器操作系统级的安全防备措施,例如Windows用户需更改 MySQL for Windows 的初始 root 密码,避免跨目录的文件读写。类 Unix 用户需避免使用过于简单的密码,避免跨用户目录的文件读写,做好服务器上其他相关软件(如 Sendmail、ftpd、httpd)等的安全防范,使用较新的软件版本等。 如果您租用虚拟主机,一般正规和技术力量较强的虚拟主机提供商会已经做好操作系统的各项准备,用户可不必关注此部分。 推荐使用 Linux/FreeBSD 操作系统,不仅完全免费,而且可以获得更好的稳定性和负载能力。如果使用Windows 系统,请将 PHP 以 ISAPI(非 CGI)方式安装。 语言及数据库支撑环境要求 Discuz! 需要服务器上装有如下软件: 可用的httpd服务器(如 Apache、Zeus、IIS 等) PHP 4.1.0 及以上 Zend Optimizer 2.5.7 及以上 MySQL 3.23 及以上(仅针对 MySQL 版 Discuz! ) 以上软件除了 httpd 软件有可能需要购买以外,其余均为跨平台的免费软件,推荐使用以上软件的最新稳定版本,不仅拥有更多的功能,而且通常已修复了已知老版本的安全漏洞。 如果您租用虚拟主机,请咨询虚拟主机提供商,您的空间服务器是否已安装了上述软件。由于 Discuz! 的数据表具有前缀设计,因此通常情况下可以将 Discuz! 与其他软件安装在同一个数据库中,或采用不同的前缀名从而在同一个数据库中安装多个 Discuz! 论坛而不产生冲突。 您的 MySQL 数据库账号应当拥有 CREATE、DROP、ALTER等执行权限,同时文件空间需不低于 2M,数据库空间不低于 5M,通常您的虚拟空间都会满足这个条件,以满足包括 Discuz! 在内的绝大多数网络软件的正常运行。如果您不了解具体情况,请咨询您的空间提供商。 Discuz! 7.0.0 更新日志 【全新】社区 UI 设计,开创性操作引导和页面布局,大幅度提升会员使用体验 【全新】风格模板体系,打造个性化论坛风格更容易,论坛展现效果更突出 【全新】论坛风格可视化编辑器,支持在线设计风格,可实时预览设计效果 【全新】论坛风格管理系统,风格安装、卸载一键完成,支持风格效果图 【内置】16 款精心设计的炫酷风格和 7 套模板,供各种类型的站点选用,个性十足 【全新】论坛任务系统,进一步增强社区会员的互动行为,可利用任务增强社区的粘性、增加活跃度 【内置】会员类、帖子类、红包类、推广类、头像类 5 种论坛任务,轻松设计各种论坛任务 【支持】任务衍生,每类任务可根据申请条件、完成条件、奖励内容衍生出无数种任务 【支持】自定义任务脚本,内置自定义任务的安装、升

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧