Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2011, 17:01   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию Очистить поле ввода другой программы

Доброго времени суток!

Стояа задача:
Написать программу которая будет писать текст в окно другой программы. С этим я справился.

А теперь зная hwnd поля ввода, как убрать оттуда текст?
Человек_Борща вне форума Ответить с цитированием
Старый 09.07.2011, 17:35   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Написать программу которая будет писать текст в окно другой программы. С этим я справился.
А запись пустого текста в качестве очистки не прокатит? Возможно в начале выделив существующий текст
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.07.2011, 17:52   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Вот код:
Код:
procedure TMainForm.sButton1Click(Sender: TObject);
var
  hWindow: HWND;
  hMDI: HWND;
  hHub: HWND;
  hEdit: HWND;
  i: integer;
  s: String;
begin
//Ищем окно
  hWindow := FindWindow(PChar(WindowClassEdit.Text), nil);
  if hWindow <> 0 then
  begin
    log('hWindow=' + IntToStr(hWindow));

    // Ищем перекладчик окна
    hMDI := FindWindowEx(hWindow, 0, PChar(WindowMDIClassEdit.Text), nil);
    if hMDI <> 0 then
    begin
      log('hMDI=' + IntToStr(hMDI));
      // Ищем окно хаба
      hHub := FindWindowEx(hMDI, 0, PChar(WindowHubClassEdit.Text), nil);
      if hHub <> 0 then
      begin
        log('hHub=' + IntToStr(hHub));
        // Ищем поле ввода
        hEdit := FindWindowEx(hHub, 0, PChar(WindowEditClassEdit.Text), nil);
        if hEdit <> 0 then
        begin
          log('hEdit=' + IntToStr(hEdit));
          s := MessageEdit.Text;
          // Посылам текст
          if Length(s) <> 0 then
          begin
            log('s=' + IntToStr(Length(s)));
            for i := 1 to Length(s) do
            begin
              SendMessage(hEdit, WM_CHAR, Ord(s[i]), 0);
            end;
          end
          else
          begin
            log('s=' + IntToStr(Length(s)));
          end;
        end
        else
        begin
          log('hEdit=0');
        end;
      end
      else
      begin
        log('hHub=0');
      end;
    end
    else
    begin
      log('hMDI=0');
    end;
  end
  else
  begin
    log('hWindow=0');
  end;
end;
Нет, нужно именно очистить поле ввода hEdit.

Последний раз редактировалось Человек_Борща; 09.07.2011 в 18:04.
Человек_Борща вне форума Ответить с цитированием
Старый 09.07.2011, 18:24   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

WM_CLEAR очищает, только не знаю выделенный текст или весь
EM_SETSEL выделяет если надо
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.07.2011 в 18:40.
Аватар вне форума Ответить с цитированием
Старый 09.07.2011, 18:56   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Сообщение от Из MSDN
WM_CLEAR Message

An application sends a WM_CLEAR message to an edit control or combo box to delete (clear) the current selection, if any, from the edit control.
А после такого кода:
Код:
            log('s=' + IntToStr(Length(s)));
            SendMessage(hEdit, WM_CLEAR, 0, 0);
            for i := 1 to Length(s) do
            begin
              SendMessage(hEdit, WM_CHAR, Ord(s[i]), 0);
            end;
            SendMessage(hEdit, WM_CLEAR, 0, 0);
Текста в edit вообще не должно быть.

hwnd правильный. Текст вставляется на ура.


Ну и ещё влпрос по той же тематике:
Как нажать enter в этом поле ввода, чтобы послаь это сообщение?

Последний раз редактировалось Человек_Борща; 09.07.2011 в 19:01.
Человек_Борща вне форума Ответить с цитированием
Старый 09.07.2011, 19:02   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

SendMessage(hEdit,EM_SETSEL,0, Length(s)-1); перед WM_CLEAR по идее должно помочь
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.07.2011, 22:24   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Это работает. Только -1 совсем не к месту. Строка с 1 а не с 0 начинается=)

Но как убрать весь текст который там уже есть(не мой текст)?
Человек_Борща вне форума Ответить с цитированием
Старый 09.07.2011, 22:42   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Но как убрать весь текст который там уже есть(не мой текст)?
А чем ваш текст отличается от не вашего? Так же и убирать, как вы свой текст убираете
Цитата:
Только -1 совсем не к месту. Строка с 1 а не с 0 начинается
Я думаю, что дело не в том, что строка с единицы начинается. Здесь как раз 0 - позиция откуда выделять текст, а Length(s) - докуда, т.е. первая позия за пределами текста
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.07.2011 в 22:45.
Аватар вне форума Ответить с цитированием
Старый 09.07.2011, 23:05   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
А чем ваш текст отличается от не вашего? Так же и убирать, как вы свой текст у
имелось ввиду текст который там уже есть, и его вводили руками.
Человек_Борща вне форума Ответить с цитированием
Старый 09.07.2011, 23:17   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
имелось ввиду текст который там уже есть, и его вводили руками.
Чет я не соображу. Послали эдиту два сообщения: выделить и очистить. А ему (эдиту) какая разница откуда текст в нем взялся?
А, врубился. Длина текста не известна.


Добавил: можно посмотреть WM_GETTEXT, WM_GETTEXTLENGTH
Есть еще WM_SETTEXT, поудобнее будет чем WM_CHAR
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.07.2011 в 23:37.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очистить поле ComboBox'а M@riy@ Общие вопросы Delphi 7 05.09.2011 14:45
очистить поле DBLookupComboBox KaimNotark БД в Delphi 7 20.08.2010 17:05
Как сделать запрет ввода букв в поле для ввода input zvezda_t PHP 1 27.12.2009 22:02
Как очистить поля ввода на форме? Lich87 C++ Builder 2 23.10.2009 14:41
После ввода в поле по Enter нужно перейти на другое поле! •ScReam•™ Помощь студентам 2 16.06.2009 08:47