2010-12-27 4 views
8

Как я, используя C# или C++, вставлять текст в текстовое поле другого приложения? Я сделал это давным-давно и, похоже, что-то помню об использовании приложений HWND. Но поскольку это изменение для каждого экземпляра приложения, я чувствую, что не помню полную историю. Я каким-то образом получаю список запущенных приложений, извлекаю тот, который я хочу, получаю HWND от этого, а затем ... хм .... тогда что? :)Вставить текст в текстовое поле другого приложения

ответ

11

Используйте FindWindowEx() найти ручку (HWND), а затем отправить сообщение с помощью WM_SETTEXTSendMessage()

При использовании FindWindowEx вам нужно будет сначала найти дескриптор главного окна, используя его имя класса. Затем вам нужно будет найти дескриптор любого контейнера, в котором находится текстовое поле, вызывая FindWindowEx, передавая дескриптор родителя (окна) и имя класса контейнера. Вам нужно будет повторить это, пока не дойдете до текстового поля. Вы можете использовать инструмент под названием Spy++, который по умолчанию устанавливается Visual Studio для проверки целевого приложения и определения иерархии контейнеров (все объекты действительно называются окнами в API, но я называю их контейнерами в отличие от верхнего уровня, уровня) с именами классов.

+0

Кроме того, вам может понадобиться добавить вызов InvalidateRect, как SendMessage бы изменить его и я хотел бы видеть значение в Winspector, но значение в моей форме осталась прежней , поэтому InvalidateRect вызовет перерисовку –

+0

Что делать, если приложение содержит более одного текстового поля, и я хочу прочитать данные из определенного текстового поля. Есть ли способ отличить обработчик текстовых полей? – MK446

-1

вы можете использовать класс CLIPBOARD для достижения той же

+0

, но это будет связано с пользователем обработки вместо кода – RvdK

-2

Вместо таргетинга на конкретное приложение вы можете просто отправить нажатия клавиш в текстовое поле.

private void button1_Click(object sender, EventArgs e) 
    { 
     System.Threading.Thread.Sleep(5000); 
     SendKeys.Send(send_text); 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     send_text = textBox1.Text;    
    } 
+0

Просьба также добавить некоторые объяснения – CodeWarrior

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