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应用程序的控制树的应用程序。代码似乎已经开放源代码,所以你永远不知道你会发现哪里有用/无用。