没人回答的问题!!!已知消息框的title,如何得到消息框中的文本?

liuyu202 2006-03-22 01:04:05
谁能解决这个问题我给500分!!!
急啊!!!!!!!!!!!!!!!!!!!!!!!!!!!

原问题:
http://community.csdn.net/Expert/topic/4596/4596676.xml?temp=.7726557
...全文
349 43 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
xixuemao 2006-03-24
  • 打赏
  • 举报
回复
看来这个问题真值得好好试试了再.........
xixuemao 2006-03-24
  • 打赏
  • 举报
回复
但很奇怪,xixuemao 和 csnight 的说法,似乎已经可以解决大部分的情况了
===================================
和系统相关的我想这个办法应该都可以解决。
但如果是三方程序自己做的消息框,比如上面的文本是个TPanel或TLabel类的话,好像就不行了@_@
csnight 2006-03-23
  • 打赏
  • 举报
回复
aiirii 大虾说的类似于屏幕取词的技术,我看了一些关于屏幕取词的帖子
但是屏幕取词需要移动鼠标,将鼠标停在取词的文本上!!!
我需要程序自动的获取对话框中的文本,怎么实现呢

------------------------------------------------------
当错误提示框弹出来的时候,在如果在错误提示框弹上按CTRL+C,就可以把内容复制进剪贴板。
楼主可以试下按照这个思路来获取,先让错误提示框获得焦点,再模拟键盘的CTRL+C,然后就可以从剪贴板中获取错误提示内容
xixuemao 2006-03-23
  • 打赏
  • 举报
回复
测试代码:
procedure TForm1.Button1Click(Sender: TObject);
var
hTitle: HWND;
hTitle1: HWND;
pText: array[0..254] of Char;
begin
hTitle := FindWindow(nil, '删除文件或文件夹时出错');
//这里的title只是测试你说的这种错误情况,实际需要HOOK来获得。
if hTitle <> 0 then
begin
hTitle1:= findwindowex(hTitle,0,'Static',nil);
SendMessage(hTitle1, WM_GETTEXT, 256, LPARAM(@pText));
while pText = '' do
begin
hTitle1:= GetNextWindow(hTitle1,GW_HWNDNEXT);
SendMessage(hTitle1, WM_GETTEXT, 256, LPARAM(@pText));
end;
edit1.Text:= pText;
end;
end;
xixuemao 2006-03-23
  • 打赏
  • 举报
回复
这个很容易啊,比如说:你试图删除一个已经打开的word文档!
就会弹出一个对话框“无法删除temp.doc ... ”
============================
这个我也测试过了,没问题,可以获得信息啊。晕
xixuemao 2006-03-23
  • 打赏
  • 举报
回复
奇怪,就我知道,如果是 static类型的, 如 Tlabel类的,
是无法通过简单的
SendMessage(.. WM_GETTEXT, ...);
Getwindowtext
来取得的,楼上这么多人说可以,倒把我搞糊涂了
=========================
可是我试了几个系统的提示消息框、错误信息框,用Spy查看到都是Static类的,都是可以通过WM_GETTEXT获得的,而且测试成功了。
不知系统的消息框是否还有其它类结构的。
liuyu202 2006-03-23
  • 打赏
  • 举报
回复
"xixuemao 和 csnight 的说法,似乎已经可以解决大部分的情况了"

xixuemao 的办法我试过了,确实可以取到特定的窗口中的信息,但是并不能取到所有应用程序的弹出错误窗口的信息。我是想要用hook取到所有的错误窗口中的错误信息,但是我没用过hook,所以一用hook程序就死了,水平不够啊!!!

aiirii 2006-03-23
  • 打赏
  • 举报
回复
>>当错误提示框弹出来的时候,在如果在错误提示框弹上按CTRL+C,就可以把内容复制进剪贴板。

如果是标准的,好像这样就可以了!!

>>但是屏幕取词需要移动鼠标,将鼠标停在取词的文本上!!!
如果是用 hook api 的方法,可以用遍历上面的控件,然后过滤,
给关键的那个 发送个 repaint 的消息让他重新刷新

但很奇怪,xixuemao 和 csnight 的说法,似乎已经可以解决大部分的情况了

csnight 2006-03-23
  • 打赏
  • 举报
回复
这个问题看来确实很有难度,再帮你顶一下
liuyu202 2006-03-23
  • 打赏
  • 举报
回复
如果能够用hook来获取错误提示框中的信息,那就最理想了,因为错误提示框的是随机出现的!
liuyu202 2006-03-23
  • 打赏
  • 举报
回复
to csnight(午夜飞行)

我是想程序自动获取错误提示框中的信息,你的办法也许可行,但是实现较复杂!
xixuemao 2006-03-23
  • 打赏
  • 举报
回复
如果调用的消息框都和系统相关,应该不会有问题,但如果第三方程序的消息框是自己实现的,那这个办法的确不行了。
liuyu202 2006-03-23
  • 打赏
  • 举报
回复
多谢各位的回复!!!

xixuemao() 的办法 只能针对一种情况!
我说的删除word文档出错,只是一个例子而已,实际的应用程序(第三方程序)在运行时,可能出现各种各样的错误对话框,我的目的是要获取这些错误对话框中的内容!!!
liuyu202 2006-03-22
  • 打赏
  • 举报
回复
aiirii 大虾说的类似于屏幕取词的技术,我看了一些关于屏幕取词的帖子
但是屏幕取词需要移动鼠标,将鼠标停在取词的文本上!!!
我需要程序自动的获取对话框中的文本,怎么实现呢?
liuyu202 2006-03-22
  • 打赏
  • 举报
回复
我用hook可以得到消息窗口的title ,但是得不到窗口中的文本消息!!!
liuyu202 2006-03-22
  • 打赏
  • 举报
回复
楼上的大虾说到问题的关键之处了,请大虾帮帮忙!!!
我急着解决这个问题啊!!!!!
aiirii 2006-03-22
  • 打赏
  • 举报
回复
奇怪,就我知道,如果是 static类型的, 如 Tlabel类的,
是无法通过简单的
SendMessage(.. WM_GETTEXT, ...);
Getwindowtext
来取得的,楼上这么多人说可以,倒把我搞糊涂了

我知道的做法,是 Hook 系统的 drawtext, drawtextEx 之类的函数,
然后发个repaint的消息给那个窗口,这样来取得,
实际写代码,还是有点小麻烦,需要调试
cuteant 2006-03-22
  • 打赏
  • 举报
回复
用一个Timer定时来捕捉,如果标题确定的话。
merkey2002 2006-03-22
  • 打赏
  • 举报
回复
var
h,k: HWND;
vClassName,vText:array [0..1024] of char;
begin
h := FindWindow(nil, 'Microsoft Word');
if h = 0 then
ShowMessage('A');
k:=GetWindow(h,GW_CHILD) ; //子控件- 最後一个产生的控件
while k<>0 do
begin
getClassName(k,vclassname,1024);
if SameText(vclassname,'Static') or SameText(vclassname,'MSOUNISTAT') then
begin
Getwindowtext(k, vText,1024);
if vText <> '' then
ShowMessage(vText);
end;
k:=GetWindow(k,GW_HWNDNEXT) ; //上一个产生的子控件
end;

//word里弹出的提示框要找类名是'MSOUNISTAT',要是其它的提示框还是找不到,就把
if SameText(vclassname,'Static') or SameText(vclassname,'MSOUNISTAT') then
这句话注释掉, showmessage(vclassname)出来,看看它到底是哪个类
liuyu202 2006-03-22
  • 打赏
  • 举报
回复
“系统的消息框应该也是这种结构,你用我的Project2试试看了吗??”
我试过了,不行,根本就得不到对话框中的文本信息
加载更多回复(23)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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