Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Ввод данных в чужое окно.


Автор: HAS 26.7.2006, 09:38
Следующим кодом, если запущен блокнот, то он вызывает окно редактора шрифта
Код

procedure SendKey(Key: Word);
begin
  keybd_event(Key,0,0,0);
  keybd_event(Key,0,KEYEVENTF_KEYUP,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    font:HWND;
    cols:array[1..3] of HWND;
    H:hWnd;
    i:integer;
begin
 H := FindWindow( nil, 'Безымянный - Блокнот');
 SetForegroundWindow(H);

 sleep(10);
 SetForegroundWindow(H);
 sleep(10);
 SendKey(VK_MENU);

   for i:=1 to 2 do
   SendKey(VK_RIGHT);
   sendkey(VK_RETURN);
   sendkey(vk_down);
   sendkey(VK_RETURN);
end;

А как можно при помощи апи послать сообщение об измене шрифта или размера шрифта ?!
спасибо. 

Автор: Yanis 26.7.2006, 09:59
HAS
Посмотри пример Rennigth'а.
http://forum.vingrad.ru/index.php?showtopic=58277 

Автор: HAS 26.7.2006, 11:41
мне необходимо при помощи API в одно из окошек что-нибудь вписать smile  

Автор: Romikgy 26.7.2006, 11:51
Цитата(HAS @  26.7.2006,  10:41 Найти цитируемый пост)
 одно из окошек

в каком окошке? в разных окошках по разному пишется 

Автор: HAS 26.7.2006, 12:29
Romikgy, вот я для примера и использую notepad.
Код сверху вызывает окно редактора шрифта.
ВОт я хочу узнать, как можно послать сообщение с изменением названия шрифта или размера шрифта ?! 

Автор: Yanis 26.7.2006, 13:31
HAS
http://forum.vingrad.ru/index.php?showtopic=60006 

Автор: Romikgy 26.7.2006, 13:50
причем здесь 
Цитата(HAS @  26.7.2006,  10:41 Найти цитируемый пост)
мне необходимо при помощи API в одно из окошек что-нибудь вписать

к
Цитата(HAS @  26.7.2006,  11:29 Найти цитируемый пост)
как можно послать сообщение с изменением названия шрифта или размера шрифта ?!

???????????????777 

Автор: HAS 26.7.2006, 14:04
Вы меня непоняли.
Я говорю, что это я использую для того, что бы разобраться в winapi.
Это я использую просто для практики. Т.е. я хочу научиться работать с winapi.
Мне необходимо вызвать окно редактора шрифта - вызвал.
теперь, где поле шрифт, мне необходимо, при помощи winapi вписать произвольный текст, например test.

Я спрашиваю это именно для того, что бы научиться вписывать даныые в поля чужих окон !!!
т.е. вместо блокнота могло оказаться совсем другое приложение, блокнот я использую для наглядности !!!

Добавлено @ 14:06 
надеюсь Вы меня поняли ! 

Автор: Romikgy 26.7.2006, 14:44
в диалоге редактора шрифта используется , как бы , копонент Tedit , 
ему можно послать соосбщение на изменение текста
WM_SETTEXT

Добавлено @ 14:45 
в диалоге редактора шрифта используется , как бы , копонент Tedit , 
ему можно послать соосбщение на изменение текста
WM_SETTEXT 

Автор: HAS 26.7.2006, 15:31
Romikgy, вот какраз меня это и интересует, как послать сообщение на изменение текста и куда ее посылать. smile  

Автор: Romikgy 26.7.2006, 16:40
HAS, ищешь окно кому слать , его хендл
FindWindow
далее юзаешь функцию апи
SendMessage 
с параметром 
Цитата(Romikgy @  26.7.2006,  13:44 Найти цитируемый пост)
WM_SETTEXT 

и оно отсылается smile
PS читаем хелп по вин апи 

Автор: HAS 26.7.2006, 17:05
Romikgy, ты же сам знаешь, что все не так просто smile smile 
А если там несколько edit'ов ?! и вообще, как узнать "адрес" каждого эдита ?! smile  

Автор: Romikgy 26.7.2006, 17:07
по очереди перебирай если несколько 
и не адрес , а хендл , он ищется файндвиндомом 

Автор: HAS 26.7.2006, 18:18
Romikgy, как ?! smile  

Автор: Yanis 26.7.2006, 18:21
HAS, 
А сразу написать так как в HAS Дата 26.7.2006, 15:04 нельзя было??? Неужели нельзя сразу вопрос сформулировать прежде чем на форум лезть....
Код
const
  SLEEP_TIME = 100;

var
  x: Byte;
  s: string;
  hNotepad, hFontDlg, hFontDlgCb: DWORD;
begin
  // ищем первый запущеный блокнот
  hNotepad := FindWindow('Notepad', nil);
  if hNotepad <> 0 then
    begin
      // пункт "Шрифт..." в главном меню Блокнота имеет ID = 33
      // "нажимаем" пункт меню:
      PostMessage(hNotepad, WM_COMMAND, MakeWParam(33, 1), 0);

      // требуется небольшая задержка, что бы
      // диалог выбора шрифта успел отобразиться
      Sleep(SLEEP_TIME);

      // находим диалог смены шрифта
      // для большей универсальности
      // заголовок я не указываю
      hFontDlg := FindWindow('#32770', nil);
      if hFontDlg <> 0 then
        begin
          // на форме hFondDlg 3 ComboBox'а
          // по идее при первом выове должен находиться самый первый
          // он то нам и нужен
          hFontDlgCb := FindWindowEx(hFontDlg, 0, 'ComboBox', nil);

          // название шрифта - текст который будет присвоен найденому ComboBox
          s := 'Courier New';
          SendMessage(hFontDlgCb, WM_SETTEXT, 0, Integer(@s[1]));
        end;
    end;
end;


P. S. Код нажатия кнопки OK думаю писать не нужно? 

Автор: HAS 26.7.2006, 18:37
Yanis, зачем же так иронично ?!
ОГРОМНОЕ ТЕБЕ СПАСИБО ! ! ! smile  

Автор: Yanis 26.7.2006, 18:48
HAS,
Пожалуйста.

Добавлено @ 18:49 
Добавлю немного...
Не обязательно нажимать кнопку OK достаточно тому же hFontDlgCb послать нажатие VK_ENTER. 

Автор: Romikgy 26.7.2006, 20:16
Цитата(Yanis @  26.7.2006,  17:21 Найти цитируемый пост)
// на форме hFondDlg 3 ComboBox'а
          // по идее при первом выове должен находиться самый первый
          // он то нам и нужен

странно а у меня небыло комбобоксов одни едиты smile
Цитата(Yanis @  26.7.2006,  17:21 Найти цитируемый пост)

можно еще так искать
hFontDlg := FindWindow(nil, 'Font'); 

Автор: Yanis 27.7.2006, 09:03
Romikgy
Это странно так как должны быть 3 ComboBox'а со стилем csSimple.
Скачай программу http://s0m.narod.ru/iws.html. Через неё посмотри что у тебя там на форме: edit или combobox.  

Автор: Romikgy 27.7.2006, 10:03
Цитата(Yanis @  27.7.2006,  08:03 Найти цитируемый пост)
Скачай программу iws. Через неё посмотри что у тебя там на форме: edit или combobox.  

дык с помощью ее и смотрел
кса у меня вин 2000 мож изза этого ? 

Автор: Yanis 27.7.2006, 10:14
Цитата(Romikgy @  27.7.2006,  11:03 Найти цитируемый пост)
кса у меня вин 2000 мож изза этого ?

Может быть. Негде проверить. А парент у этого edit'а кто? 

Автор: Romikgy 27.7.2006, 10:44
Цитата(Yanis @  27.7.2006,  09:14 Найти цитируемый пост)
 А парент у этого edit'а кто? 

ComboBox 

Автор: Yanis 27.7.2006, 10:58
Цитата(Romikgy @  27.7.2006,  11:44 Найти цитируемый пост)
ComboBox

smile Что и требовалось доказать smile 

Автор: _sten_ 13.12.2006, 00:01
Мона SetWindowText использовать smile

Автор: Kenni 22.5.2007, 20:15
У меня есть чюжое окно, там 2 Edit'a, как обратиться к этому окну и выснить кто есть кто, и во второй нужно вписать необходимую инфу...
Заранее спасибо!

Автор: Yanis 23.5.2007, 12:59
Цитата(Kenni @  22.5.2007,  21:15 Найти цитируемый пост)
У меня есть чюжое окно, там 2 Edit'a, как обратиться к этому окну и выснить кто есть кто, и во второй нужно вписать необходимую инфу...

Искать их в чужом окне (Поиск кстати обсуждался в этом топике. Поиск по форуму тоже поможет).
Находить нужный Edit, различая его по ID. ID содержится в информации о окне. Т.е.:
Код
LONG GetWindowLong(          HWND hWnd,
    int nIndex
);

+
Цитата(MSDN)
GWL_ID
Retrieves the identifier of the window.

Автор: darkmamba 13.3.2009, 19:41
А как перебирать то ? как получить другой дескриптор компонента под одним названием если их напрмер там 5 ? 

Код

LONG GetWindowLong(          HWND hWnd,
    int nIndex
);


неподходит ибо ID у парочки = 0.
Проще перебрать дескрипторы на наичие чилдовых но как это сделать ?)

Автор: darkmamba 13.3.2009, 20:15
Код

begin
  h1 := FindWindow('Afx:00400000:0', nil);
  h2 := FindWindowEx(h1, 0, 'Afx:00400000:8:00010011:00000000:00000000', 0);
  repeat
    h3 := FindWindowEx(h2, 0, 'Static', 0);
    if h3 <> 0 then begin
      showmessage('Static');
      h4 := FindWindowEx(h3, 0, 'AfxWnd70su', 0);
        if h4 <> 0 then begin
          showmessage('AfxWnd70su');
          h5 := FindWindowEx(h4, 0, 'RichEdit20W', 0);
            if h5 <> 0 then begin
            showmessage('RichEdit20W');

        end;
    end;
    h2 := GetNextWindow(h2, GW_HWNDNEXT);
  until h2 = 0;
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)