使用C#Windows窗体应用程序中的Windows API读取非C#应用程序文本框

问题描述:

我们有一个用C++编写的旧Windows 32位应用程序,它执行一些操作并显示类似于文本框的结果。使用C#Windows窗体应用程序中的Windows API读取非C#应用程序文本框

我被要求在C#中编写一个应用程序,该应用程序从旧应用程序中读取数据,然后进一步处理数据。

问题是如何阅读旧应用程序中的文本框?

有人告诉我,我可以使用Windows API获取应用程序的“句柄”,然后逐步控制,然后读取每个数据!这是真的,如果是的话,我将如何从C#做到这一点?

这是一个.Net 4 Windows窗体应用程序。

非常感谢

你可能将不得不使用一些互操作要求做到这一点,特别是使用的FindWindow/FindWindowExSendMessage & WM_GETTEXT/WM_GETTEXTLENGTH的组合。

这是关于这个问题的一个article(在C++中,但是相同的概念只需要移植到P/Invoke),这有点过时,但我认为它应该与您的情况非常相关。

+0

谢谢你这个我现在正在工作:) – Adrian

+0

如果主窗口打开另一个窗体并隐藏它本身返回0作为手柄!在这种情况下,我如何获得父母手柄或孩子的手柄? – Adrian

您可以使用Spy ++应用程序(附带VisualStudio)来检查您的本机应用程序并找到您要查找的控件的类名称。

有了这样的,你可以得到你的原生应用程序的主窗口句柄,这是很容易,如果你是负责从您的C#应用​​程序启动该应用:

 
... 
var proc = Process.Start(); 
var mainWndHandle = proc.MainWindowHandle; 

否则,你将不得不寻找其他途径发现那个窗口,fe。你可以使用下面描述的功能在你的桌面上寻找那个窗口(参见msdn页面获取更多信息)

如果你有这一切,那么你可以使用FindWindowEx函数(以及你可以使用它来查找主窗口,通过传递NULL作为hwndParent)。

并且,当您处理此文本框时,您可以通过WM_GETTEXTsending message来读取它的内容。

如果你还没有PInvoke'ing很多,你可以检查http://pinvoke.net/作为参考如何从你的C#程序调用WINAPI函数。

+0

非常感谢这也帮助我。 – Adrian

您真的需要C++应用程序的用户界面吗?因为拥有2个独立的用户界面和不同的消息泵是非常不舒服的。你需要在更新值时同步这个混乱。

为什么不正确地从C++应用程序中剥离逻辑代码并将其公开在Interop CLR项目(C++/CLI)中?如果你不需要添加更多的功能到C++应用程序,这似乎是非常简单的我

+0

不幸由于内部政治原因,我无法访问原始资料!但感谢你的回复 – Adrian