Вставить текст в текстовое поле другого приложения

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


person inquam    schedule 27.12.2010    source источник


Ответы (4)


Используйте FindWindowEx(), чтобы найти дескриптор (HWND) и затем отправьте сообщение WM_SETTEXT, используя SendMessage()

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

person Xavier Poinas    schedule 27.12.2010
comment
Кроме того, вам МОЖЕТ понадобиться добавить вызов InvalidateRect, так как SendMessage изменит его, и я увижу значение в Wspector, но значение в моей форме останется прежним, поэтому InvalidateRect вызовет перерисовку. - person Dean Hiller; 17.01.2012
comment
Что делать, если приложение содержит более одного текстового поля, и я хочу прочитать данные из определенного текстового поля. Есть ли способ отличить обработчик текстовых полей? - person MK446; 08.02.2018

Затем SendMessage(), WM_SETTEXT

person Hans Passant    schedule 27.12.2010

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

  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;            
    }
person Roblox    schedule 21.06.2014
comment
Пожалуйста, добавьте некоторые пояснения - person CodeWarrior; 21.06.2014
comment
Это сработало потрясающе. Большое спасибо за то, что поделились! Я не могу поверить, что за это проголосовали. Да ладно, люди, только потому, что это не идеальное решение в вашем контексте, не означает, что оно бесполезно! - person Jeff; 14.11.2018

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

person TalentTuner    schedule 27.12.2010
comment
но это потребует обработки пользователем вместо выполнения кода - person RvdK; 27.12.2010