2010-12-14 3 views
0

Мне нужно получить текст, который отображается в текстовом поле в другом окне окна Windows.получение текста из текстового поля в не моем окне C#

Любой может сказать мне, как я могу это сделать, используя C#?

+0

Использование System.OtherApplications.CaptureTextBox! это невозможно, объясните, почему вы действительно этого хотите? – 2010-12-14 23:41:59

ответ

1

Вы не можете сделать это изначально - вам придется вникать в Windows API.

Посмотрите на

Вы хотите использовать Spy ++ (или эквив.), Чтобы найти имя класса элемента, который вы ищете , Затем вам необходимо использовать PInvoke, используя комбинацию вышеупомянутых функций.

0

Не думайте, что это возможно, вызовы API Windows не позволят вам копать так далеко в другое приложение. Одна из моих идей - заставить экран снимать, а затем использовать 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

FYI, Expert-Exchange имеет только перечисленные ответы, если вас направляют через Google, поэтому ваша ссылка не работает. –

+0

Спасибо Mystere Man Я этого не знал. Поиск google для [site: experts-exchange.com Как получить текст из элемента управления Windows с помощью C#], и это должно быть вам. –

+0

спасибо, что сработало для меня! –

1

Это длинный выстрел, но я помню приложение под названием «HawkEye», что позволило вам вникать в дереве управления .NET-приложения, пока код не был запутанным или что-то вроде этого. Этот код, похоже, вышел из открытого источника, поэтому вы никогда не знаете, что вам может показаться полезным/бесполезным.

Смежные вопросы