Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
1

Эмуляция нажатия клавиатуры в ДР окне зная его хендл, помоги разобраться

15.05.2012, 22:07. Просмотров 2574. Ответов 27
Метки нет (Все метки)

вообщем есть окно состоит оно из поля ввода и двух кнопок... как сделать так чтобы можно было ввести текст в это поле для ввода из моей программы???
хендл определяю правильно, код на посылку ему Esc работает и окошко закрывается...
C++
1
PostMessage(H, WM_KEYDOWN, VK_ESCAPE, 0);
как теперь напечатать в этом окне текст???

вот как это окно выглядит...
0
Миниатюры
Эмуляция нажатия клавиатуры в ДР окне зная его хендл, помоги разобраться  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2012, 22:07
Ответы с готовыми решениями:

Обновить окно IE, зная его хендл
Народ, хилп плиз... Как обновить окно IE, знаяего хендл. Сам принцип я знаю, но надо семпл -...

Получить ID процесса, зная его хендл.
Дано: Хэндл процесса - как результат выполнения ShellExecuteEx. Нужно: Получить ID...

Удалить хендл, зная его имя
например есть handle EVENT с названием "MYHANDLE" , как закрыть handle зная только его имя и тип?

Отправка текста приложению, зная его хендл
У меня есть хэндл стороннего приложения и мне нужно отправить в него некий текст или комбинацию...

27
wtf!?
749 / 280 / 25
Регистрация: 21.05.2010
Сообщений: 732
15.05.2012, 22:21 2
Найти хендл едита и слать ему сообщения. Можно WM_SETTEXT(работает), можно эмулировать нажатия тех же клавиш ( не уверен)

а еще придет LK, и даст тебе ссылку на "мечты вуайериста"
1
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
15.05.2012, 22:32  [ТС] 3
Цитата Сообщение от Flyer Посмотреть сообщение
Найти хендл едита
ну ща и пытаюсь этим заниматься:
C++
1
cwd=FindWindowEx(H, NULL, NULL, "Edit1");
ток чтобы не искал ниче не находит

Добавлено через 4 минуты
получилось но получился чистый рандум
C++
1
cwd=FindWindowEx(H, NULL, NULL, NULL);
на шару как-то... ищется все подряд в дочернем окне первый попавший хендл я так понял... а как конкретизировать терь?
0
wtf!?
749 / 280 / 25
Регистрация: 21.05.2010
Сообщений: 732
15.05.2012, 22:36 4
Кто-то когда то написал полезную функцию
C++
1
2
3
4
5
6
7
8
HWND NextWindowElement(HWND h, LPCTSTR fasdClass, LPCTSTR fasdWindow, int level)
{
    HWND h2 = NULL;
    for (int i = 0; i < level; i++) {
        h2 = FindWindowEx(h, h2, fasdClass, fasdWindow);
    }
    return h2;
}
Использование потом
C++
1
    wnd = NextWindowElement(H, L"TEdit", NULL, 1);// то есть класс искомой вещи и ее номер что ли (не помню ) в списке всех итемов данного класса
1
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
15.05.2012, 23:35  [ТС] 5
вот так работает
C++
1
PostMessage(cwd, WM_KEYDOWN, 'a', 0);
а вот так не хочет но и ошибки не выдает
C++
1
2
char S='s';
PostMessage(cwd, WM_KEYDOWN, S, 0);
Добавлено через 14 минут
спс, вот так работает, там была очепятка у тебя... но странно почему не класс определяет TEdit а просто как Edit
C++
1
wnd = NextWindowElement(H, "Edit", NULL, 1);
как сделать чтоб по переменной выводилось?

Добавлено через 43 минуты
C++
1
2
3
4
5
6
7
    char S;
    String S1="qwerty";
    for(int i=1;i<=S1.Length();i++)
    {
        S=S1[i];
        PostMessage(wnd, WM_KEYDOWN, S, 0);
    }
помогите плз, почему в данном коде выводится только 1 буква??? но если сделать чтоб выводился например только char S='a' то выводится 6 раз нормально...
почему конфликт со String типом?
0
wtf!?
749 / 280 / 25
Регистрация: 21.05.2010
Сообщений: 732
15.05.2012, 23:37 6
Ты имеешь ввиду L перед "TEdit"? Это не опечатка.
У меня например даже если без переменной писать маленькую букву то не работает, а если писать большую, то вносит в едит маленькую, но вносит и с переменной и без
П.с. работает твой код, см. картинку
0
Миниатюры
Эмуляция нажатия клавиатуры в ДР окне зная его хендл, помоги разобраться  
4029 / 2319 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.05.2012, 23:44 7
Цитата Сообщение от Flyer Посмотреть сообщение
У меня например даже если без переменной писать маленькую букву то не работает, а если писать большую, то вносит в едит маленькую, но вносит и с переменной и без
Unicode виноват, может быть? Стоит попробовать AnsiString.
1
wtf!?
749 / 280 / 25
Регистрация: 21.05.2010
Сообщений: 732
15.05.2012, 23:50 8
Вообще что то странное получилось, 5 вместо qwerty
0
Миниатюры
Эмуляция нажатия клавиатуры в ДР окне зная его хендл, помоги разобраться  
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
15.05.2012, 23:51  [ТС] 9
Цитата Сообщение от Flyer Посмотреть сообщение
Ты имеешь ввиду L перед "TEdit"? Это не опечатка.
да именно это он ругается про несогласованность типов char...
Цитата Сообщение от Flyer Посмотреть сообщение
работает твой код
ок, спс, но как тогда вывести большими буквами в тот же Edit?

Добавлено через 54 секунды
5 вместо qwerty
ага а если напишешь qWERTY то он q пропустит аще и не выведет
0
wtf!?
749 / 280 / 25
Регистрация: 21.05.2010
Сообщений: 732
15.05.2012, 23:52 10
Не знаю.
А не проще сначала написать весь текст у себя, и там например по нажатию кнопки или на ливе едита или еще где то слать WM_SETTEXT ?
0
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
16.05.2012, 00:37  [ТС] 11
Цитата Сообщение от BRcr Посмотреть сообщение
Unicode виноват, может быть? Стоит попробовать AnsiString.
ошибсо, не виноват он))

все же что поделать с регистром можно??? как заставить его выводить большими буквами и без этой пятерки?

Добавлено через 11 минут
может надо эмулировать зажатие Shift?! О_о
а ну ка попробуем...

Добавлено через 32 минуты
ну вообщем был прав про то что надо реализовать эмуляцию шифта ток одно НО я реализовываю вот так:
C++
1
2
3
4
5
6
7
8
9
    char S;
    AnsiString S1="QWERTY";
    keybd_event(VK_SHIFT, 0x1D, KEYEVENTF_EXTENDEDKEY | 0, 0);//зажали шифт
    for(int i=1;i<=S1.Length();i++)
    {
        S=S1[i];
        PostMessage(Edit1->Handle, WM_KEYDOWN, S, 0);
    }
    keybd_event(VK_SHIFT, 0x1D, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);//отжали шифт
вообщем проблема в следующем если делать так то регистр не меняется!!! НО, если за комментировать отжатие шифта то получается следующее: первый раз на кнопку нажимаем и все выводится маленькими буквами, а если потом нажать то все будет выводиться большими, завершаю программу и шифт зажат все еще что в принципе и логично...
кто может объяснить в чем трабл тут?
0
Эксперт С++
8325 / 6077 / 604
Регистрация: 10.12.2010
Сообщений: 28,212
Записей в блоге: 27
16.05.2012, 02:46 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND hp= FindWindowA("TForm1","Form1");
if(!hp) {ShowMessage("Не найдено радительское окно");return;}
 
HWND h=FindWindowExA(hp,NULL,"TEdit","Edit2");
if(!h) {ShowMessage("Не найдено дочернее окно");return;}
 
SetWindowText(h,"Новый текст");
}
//---------------------------------------------------------------------------
1
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
16.05.2012, 13:13  [ТС] 13
если для Edit то пойдет, пытался запихнуть в окно в которое мне над слова передать - не сработало ток по одной букве понимает
C++
1
SetWindowText(h,"Новый текст");
немног разобрался с верхним регистром, вот так делаю я:
C++
1
2
3
4
5
6
7
        for(int i=1;i<=S1.Length();i++)
        {
            S=S1[i];
            keybd_event(VK_SHIFT, NULL, KEYEVENTF_EXTENDEDKEY | 0, 0);
            PostMessage(wnd, WM_KEYDOWN, S, 0);
            keybd_event(VK_SHIFT,NULL,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        }
но странно один и тот же код не на всех компьютерах одинаково работает... на некоторых сбоит и выводит не все слово большими, а только некоторые буквы этого слова, может получиться что все буквы большими или что все маленькие... ерунда какая-то... в чем может быть трабл? и как от этого избавиться?

Добавлено через 11 минут
перепробовал все возможные варианты если через тотал эту программу запускать то не срабатывает аще
C++
1
HWND h=FindWindowEx(hp,NULL,"TEdit",---любой эдит---);
а если через проводник то только
C++
1
h2 = FindWindowEx(h, h2, "Edit", NULL);
0
Эксперт С++
8325 / 6077 / 604
Регистрация: 10.12.2010
Сообщений: 28,212
Записей в блоге: 27
16.05.2012, 13:22 14
если для Edit то пойдет, пытался запихнуть в окно в которое мне над слова передать - не сработало ток по одной букве понимает
Ну либо окно хитро устроено, либо не тому окну сообщение шлешь...
Дерево окон Spy или Poz_Handl -лом проверь, по тому как там может быть еще куча подокон.

Добавлено через 5 минут
http://vsokovikov.narod.ru/New... _event.htm
http://vsokovikov.narod.ru/New... dinput.htm

Но поидее для этих ф-ций нужно утсанавливать активным окно SetForegraundWindow() и передавать фокус окну-полю-ввода
1
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
16.05.2012, 13:50  [ТС] 15
не тому окну сообщение шлешь..
C++
1
GetWindowText(H,Pch,128); //получает доступ к названию окна и сохраняет его
я таким макаром ищу нужное мне окно и вывожу в мемо в процессе отладки вывожу Pch чтоб убедиться и шлю все время в нужное окно... остается вопрос в нужное ли дочернее эт уже др дело хотя там ток одно оно может быть...

Добавлено через 14 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Дерево окон Spy
проверил нашел процесс, в нем нашел элемент с именем класса Edit... я его именно и ищу...
C++
1
FindWindowEx(h, h2, "Edit", NULL);
тогда почему на другом компе именно так не определяет? 0_o
0
Эксперт С++
8325 / 6077 / 604
Регистрация: 10.12.2010
Сообщений: 28,212
Записей в блоге: 27
16.05.2012, 14:10 16
тогда почему на другом компе именно так не определяет? 0_o
не определяет Spy?
0
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
16.05.2012, 18:01  [ТС] 17
на работе спай определил как TAltEdit , код подправил, но проблема с регистром осталась, как-то глючно выводит на работе, а дома все гуд только в проводнике...
0
Эксперт С++
8325 / 6077 / 604
Регистрация: 10.12.2010
Сообщений: 28,212
Записей в блоге: 27
16.05.2012, 18:23 18
Может лучше по имени окна, а не по классу обращаться тогда?

keybd_event вроде как устаревшая ф-ция может из-за этого ?
Да и сомневаюсь что ее совместно с PostMessage можно использовать- их обработка просто во времени может не совпадать..

А вообще чем
C++
1
SetWindowText(h,"Новый текст");
не устраивает?
0
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
16.05.2012, 21:45  [ТС] 19
ну я же писал выше чем мне не нравится... мне как раз нравится а вот окну в которое передаю вообще не нравится... ему ток я понял единичное нажатие передавать надо...
на счет keybd_event как иначе можно зажать шифт?
0
Эксперт С++
8325 / 6077 / 604
Регистрация: 10.12.2010
Сообщений: 28,212
Записей в блоге: 27
16.05.2012, 22:58 20
Для начала попробывать
Добавлено через 1 минуту
ну я же писал выше чем мне не нравится
Но тогда вы не знали что окно меняет тип, а значит неправильно определяется...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2012, 22:58

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Найти хендл чужого окна, зная его атом
как можно найти хендл чужого окна по атому??

Как получить адрес текущего окна зная его Хендл
Добрый день! У меня есть приложение на ВинФорм, и возникла необходимость использовать в этом...

Послать сообщение элементу управления в другую программу зная его хендл
Доброго дня суток всем Разбираюсь с управлением внешней программой. Разобрался с заполнением...

Эмуляция нажатия мыши в свёрнутом окне
Всем доброго времения суток. Задача следующая, необходимо сэмулировать нажитие мыши в свёрнутом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.