[英]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 / FindWindowEx和SendMessage & 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.