簡體   English   中英

Read a non C# Apps textbox using windows API from a C# Windows forms App

[英]Read a non C# Apps textbox using windows API from a C# Windows forms App

我們有一個用 C++ 編寫的舊 Windows 32 位應用程序,它做了一些事情並在類似於文本框的地方顯示結果。

我被要求在 C# 中編寫一個應用程序,該應用程序從舊應用程序中讀取數據,然后進一步處理數據。

問題是如何閱讀舊應用程序中的文本框?

有人告訴我,我可以使用 windows API 獲取應用程序的“句柄”並逐步執行控件,然后讀取每個數據? 這是真的嗎?如果是這樣,我將如何從 C# 中做到這一點?

這是一個.Net 4 Windows forms 應用程序。

非常感謝

您可能必須使用一些互操作調用來完成此操作,特別是使用FindWindow / FindWindowExSendMessage & WM_GETTEXT / WM_GETTEXTLENGTH的組合。

這是一篇關於該主題的文章(在 c++ 中,但是只需移植相同的概念即可使用P/Invoke ),它有點過時了,但我相信它應該與您的情況非常相關。

您可以使用 Spy++ 應用程序(VisualStudio 附帶)來檢查您的本機應用程序並找到您正在尋找的控件的 class 名稱。

有了它,您可以獲得本機應用程序的主 window 句柄,如果您負責從 c# 應用程序啟動該應用程序,這很容易:

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

否則,您將不得不尋找其他方法來找到 window, fe。 您可以使用我在下面描述的 function 在桌面上查找 window(有關更多信息,請參見 msdn 頁面)

如果您擁有所有這些,則可以使用FindWindowEx function 獲取文本框控件的句柄(也可以使用它來查找主 window,通過將 Z6C3E226B4D4795D518AB341B0824EC2 作為 h 傳遞)。

當你處理這個文本框時,你可以通過發送WM_GETTEXT的消息來閱讀它的內容。

If you haven't been PInvoke'ing much, you can check http://pinvoke.net/ for reference on how to call WINAPI function from your c# program.

您真的需要 C++ 應用程序的 UI 嗎? 因為擁有 2 個具有不同消息泵的獨立 UI 會非常不舒服。 您需要在更新值時同步這種混亂。

為什么不正確地從 C++ 應用程序中剝離邏輯代碼並將其公開在 Interop CLR 項目 (C++/CLI) 中? 如果您不需要向 C++ 應用程序添加更多功能,對我來說似乎很簡單

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM