Конференция "WinAPI" » Ввести текст (в TEdit) и нажать кнопку (TButton) в другой проге [D6, WinXP]
 
  • TComponent © (20.03.10 23:13) [0]
    На форме программы имеются строка ввода (TEdit) и кнопка (TButton). Как из другой программы программно ввести в TEdit нужный текст и нажать на кнопку? Название программы, заголовок формы, идентификаторы строки ввода и кнопки известны: допустим – Project1, Form1, Edit1, Button1.
  • tippa © (21.03.10 09:18) [1]

    H1:=FindWindow(nil,'Form1');//хэндл проги
    H2:=FindWindowEx(H1,0,'Button','Button1');//хэндл кнопки
    SendMessage(H2,BM_CLICK,0,0);//нажать на кнопку
    H3:=FindWindowEx(H1,0,'Edit','Edit11');//хэндл эдита
    SendMessage(H3,WM_SETTEXT,0,lparam(LPCTSTR('Вводимый текст')));//посылаешь текст в эдит
  • tippa © (21.03.10 09:37) [2]
    сори, 'Button'->'TButton', 'Edit'->'TEdit', 'Edit11'->'Edit1'
  • TComponent © (21.03.10 16:39) [3]
    Проверил. Хэндлы эдита и кнопки не определяются (h2=0, h3=0). И, наверно, поэтому не работают сообщения для них. :(
  • tippa © (21.03.10 18:26) [4]
    Логично, код в студию.
  • TComponent © (21.03.10 20:52) [5]
    procedure TMaiFrm.Item1Click(Sender: TObject);
    var
     H, H3, H2: HWND;
    begin
    H:=FindWindow(nil, 'Form1');
     if H<>0 then
     begin
     H3:=FindWindowEx(H,0,'TEdit','Edit1');
       if H3<>0 then ShowMessage('хэндл эдита'); //сообщение не появляется
     SendMessage(H3,WM_SETTEXT,0,lparam(LPCTSTR('UPT')));
     H2:=FindWindowEx(H,0,'TButton','Button1');
       if H2<>0 then ShowMessage('хэндл кнопки'); //сообщение не появляется
     SendMessage(H2,BM_CLICK,0,0);
     end;
    end;

  • DVM © (21.03.10 21:14) [6]
    с чего вы взяли H3:=FindWindowEx(H,0,'TEdit','Edit1'); ?
    Классы окон узнать неплохо бы для начала. Spy++ в руки и вперед.
  • TComponent © (21.03.10 22:15) [7]
    Подскажите, откуда можно БЕЗ ПРОБЛЕМ скачать Spy++?
  • tippa © (21.03.10 22:37) [8]
  • TComponent © (22.03.10 00:55) [9]

    > DVM ©   (21.03.10 21:14) [6]
    >
    > с чего вы взяли H3:=FindWindowEx(H,0,'TEdit','Edit1'); ?
    >
    > Классы окон узнать неплохо бы для начала. Spy++ в руки и
    > вперед.

    Значение какого параметра из свойств, к примеру, нашего TEdit'a считать классом окна (по проге Spy++)?

    Если брать хэндл "окна" эдита, то всё работает, но это не решение, т.к. после перезапуска проги с эдитом хэндл изменяется ...
  • DVM © (22.03.10 01:03) [10]

    > Значение какого параметра из свойств, к примеру, нашего
    > TEdit'a считать классом окна (по проге Spy++)?

    Который Class Name на закладке Class в окне которое появляется если дважды щелкнуть по окну в дереве окон Spy++
  • Германн © (22.03.10 01:40) [11]

    >
    > Значение какого параметра из свойств, к примеру, нашего
    > TEdit'a считать классом окна (по проге Spy++)?
    >
    > Если брать хэндл "окна" эдита, то всё работает, но это не
    > решение, т.к. после перезапуска проги с эдитом хэндл изменяется
    > ...
    >

    Похоже без чтения учебников тут не обойтись. Спутать класс окна с хэндлом окна способен только неуч.
  • TComponent © (22.03.10 17:24) [12]

    > DVM ©   (21.03.10 21:14) [6]
    >
    > с чего вы взяли H3:=FindWindowEx(H,0,'TEdit','Edit1');?
    >
    > Классы окон узнать неплохо бы для начала. Spy++ в руки и
    > вперед.



    > Который Class Name на закладке Class в окне которое появляется
    > если дважды щелкнуть по окну в дереве окон Spy++


    Не знаю, как у Вас, но в той проге Spy++, которую скачал я Class Name на закладке Class=TEdit. Поэтому я и задал вопрос: значение класса окна определённое прогой Spy++ =TEdit, что вызывает непонимание сообщения № [6].


    > Похоже без чтения учебников тут не обойтись. Спутать класс
    > окна с хэндлом окна способен только неуч.


    Читать надо ВНИМАТЕЛЬНО, если хотите КОНСТРУКТИВНО прокритиковать что-то! Я потому и спросил про класс окна, т.к. он равен TEDit в проге spy++. А про хэндл окна я сказал, потому его применение решает задачу, но только для одного сеанса работы проги с эдитом.

    И, вообще, Вам, Германн, следует прочитать Правила поведения на форумах!
  • DVM © (22.03.10 18:17) [13]

    > TComponent ©   (22.03.10 17:24) [12]


    > что вызывает непонимание сообщения № [6].

    Я не говорю что класс и имя окна обязательно другие, я спросил лишь о том, точно ли вы уверены в названиях. Ибо если что-то одно будет не таким, то ничего найдено само собой и не будет. Это качается и полей ввода и самой формы. Например, я не могу гарантировать, что вы нашли оно той формы что требуется, ибо может быть несколько таких окон.
  • DVM © (22.03.10 18:20) [14]

    > TComponent ©

    То что возвращает H:=FindWindow(nil, 'Form1'); равно хендлу искомого окна в Spy++ ? (он может подсветить нужное окно рамкой)

    Сдается мне что у тебя два окна Form1 (одно из той программы в которой ты хочешь нажимать кнопки, а второе из той программы которая должна кнопки нажимать) и твой код берет не то что надо.
  • TComponent © (22.03.10 21:17) [15]
    Заработало! Нашёл ошибку!
    Благодарю за помощь tippa и DVM!!!
  • Германн © (23.03.10 02:05) [16]

    > И, вообще, Вам, Германн, следует прочитать Правила поведения
    > на форумах!


    > Заработало! Нашёл ошибку!

    Правила я знаю наизусть.
    А вот книжки тебе всё же прочитать полезно. Ибо "метод ненаучного тыка" пригоден только некоторым.

    Ну и формирование своих сообщения таким вот образом:

    > Значение какого параметра из свойств, к примеру, нашего
    > TEdit'a считать классом окна (по проге Spy++)?
    >
    > Если брать хэндл "окна" эдита, то всё работает, но это не
    > решение, т.к. после перезапуска проги с эдитом хэндл изменяется
    > ...
    >

    тоже свидетельствует о недостатке образования.


    > Читать надо ВНИМАТЕЛЬНО, если хотите КОНСТРУКТИВНО прокритиковать
    > что-то!

    Читаю я внимательно. Именно поэтому и отреагировал КОНСТРУКТИВНО
 
Конференция "WinAPI" » Ввести текст (в TEdit) и нажать кнопку (TButton) в другой проге [D6, WinXP]
Есть новые Нет новых   [134432   +18][b:0][p:0.001]