当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 如何获得另一个应用程序窗口中的文本

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 如何获得另一个应用程序窗口中的文本


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 198 ::
收藏到网摘: n/a


如何获得另一个应用程序窗口中的文本
编译/hangwire 
本文示范源代码
问题:
    我想从一个程序获得另一个程序编辑框的文本。用GetWindowText试了一下,它总返回NULL。请问大虾有没有办法来获得另一个程序窗口中的文本?如果能,如何实现? 另外,在VC知识库的论坛中,也有人热烈地讨论过此问题,并且自己找到的解决方案。
解答:
    噢,我喜欢讨论垒球问题;它们使我看起来很睿智。要想获得另一个进程窗口的文本,只需直接发送WM_GETTEXT。
CWnd* pWnd = GetOtherAppWindow();TCHAR buf[512];pWnd->SendMessage(WM_GETTEXT, sizeof(buf)/sizeof(TCHAR), (LPARAM)(void*)buf);
    如果您在用C编程,自然用HWND代替CWnd。有人肯定会问:嘿,等一下——如果这样做可以的话,为什么GetWindowText不起作用呢?WM_GETTEXT不就是GetWindowText发送的吗?错也,GetWindowText只在窗口属于当前进程时才发送WM_GETTEXT,否则它干别的事情。这一点文档中说得很清楚:
如果目标窗口属于另一个进程,并且有窗口标题,则GetWindowText获得窗口标题文本。如果没有窗口标题,则GetWindowText返回空串。这是设计行为,也就是说,在设计时就是这么处理的。
换句话说,你可以获得另一个进程主窗口的标题,但得不到窗口中象编辑框、组合框或者按钮这样的子窗口的文本。
    为什么会这样呢?为什么这是“设计行为”呢?因为文档又解释道:
       “它允许目标窗口所在进程挂起的情况下,应用程序无需挂起而调用GetWindowText,”真是妙哉,不是吗?GetWindowText提供了禁地(never-never land)调用保护。当然老道的程序员可能会想:那有什么好的?GetWindowText得不到文本,如果想要得到文本必须用SendMessage发送WM_GETTEXT,它可能挂起。那何以保护呢?即便不使用SendMessage!你还能用SendMessageTimeout,即使是调用进入一个死锁进程, 它肯定能返回。在多任务世界中,要考虑的繁琐事情真是太多了。
    真正的问题是:为什么微软公司的那帮家伙不让GetWindowText函数做它该做的事情?也就是说,如果窗口在当前进程中,为什么GetWindowText 不做一次SendMessage(WM_GETTEXT),而窗口在另一个进程时,做一次SendMessageTimeout呢?很好的问题。只有Window 向导(Wizard)知道。我怀疑在从伪多任务到真正的多任务过渡的过程中,微软公司的那帮家伙在处理以前遗留下来的应用时有难言之隐......
按照惯例,我写了一个小程序GWTTest作示范。GWTTest显示从GetWindowText 和 SendMessageTimeout(WM_GETTEXT) 获得的顶层窗口及其编辑框控制的文本。如图一所示: