2010-12-14 54 views

回答

1

你不能在本地完成 - 你必須深入研究Windows API。

看看

您需要使用間諜++(或同等)找到你要找的元素的類名。然後,您需要使用上述功能的組合使用PInvoke

0

不要認爲這是可能的,windows API調用不會讓你深入挖掘到另一個應用程序。我擁有的一個想法是強制執行屏幕截圖,然後在生成的圖像上使用OCR,但是在被黑客入侵的解決方案計量器中這個排名很高。有沒有你想要完成的東西,如確定一個特定的過程完成?

0

您必須獲取託管文本框的應用程序的窗口句柄,然後獲取要從中獲取文本的實際控件的句柄。然後,您可以發送WM_GETTEXT消息到該控件以讀取該控件的值。您需要使用某個窗口間諜應用程序來獲取託管在窗口中的控件的詳細信息,例如AutoIt窗口信息工具。

我能找到一個關於Expert Exchange的例子,詳細說明如何執行上面的讀取記事本中編輯控件的細節:http://www.experts-exchange.com/Programming/Languages/.NET/Visual_CSharp/Q_23748618.html(滾動到底部尋找答案)。

private const int WM_GETTEXTLENGTH  = 0x000E; 
private const int WM_GETTEXT  = 0x000D; 

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

[DllImport("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, StringBuilder lParam); 

[DllImport("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); 

IntPtr notepad = FindWindow("notepad", null); 
IntPtr editx = FindWindowEx(notepad, IntPtr.Zero, "edit", null); 
int length = SendMessage(editx, WM_GETTEXTLENGTH, 0, 0); 
StringBuilder text = new StringBuilder(length); 
int hr = SendMessage(editx, WM_GETTEXT, length, text); 
Console.WriteLine(text); 
+0

僅供參考,如果您是通過谷歌提交的,專家交換隻會列出所有答案,因此您的鏈接不起作用。 – 2010-12-15 00:21:49

+0

謝謝Mystere Man我不知道。搜索谷歌[網站:experts-exchange.com如何從一個Windows控件使用C#]文本],並應該讓你到那裏。 – 2010-12-15 00:26:47

+0

謝謝,這對我工作! – 2010-12-15 14:13:29

1

這是一個長鏡頭,但我記得叫「HawkEye」那你能只要代碼沒有被混淆或像這樣深入到一個.NET應用程序的控制樹的應用程序。代碼似乎已經開放源代碼,所以你永遠不知道你會發現哪裏有用/無用。