Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.09.2011, 22:58
ИльяК ИльяК вне форума
Прохожий
 
Регистрация: 04.05.2011
Адрес: Краснодар
Сообщения: 11
Репутация: 10
По умолчанию Передача текста с помошью Sendmessage Flash игре

Привет всем!
Столкнулся с такой проблемой: пишу программу для браузерной флеш игры, есть желание сделать возможным работу проги в фоновом режиме. Задачу наполовину реализовал с помощью sendmessage - клики в свёрнутое окно передаёт, а вот текст передать в нужное окно игры не выходит (получается передать только если приложение не свёрнуто и окно, куда нужно текст передать не перекрыто другими приложениями/окнами).

Просьба помочь, если кто сталкивался с подобным, имеет представление.

кусок кода, с помощью которого сейчас передаю текст в окно проги:

Код:
procedure TForm1.tmr8Timer(Sender: TObject);
var i, g, t, p, w,c: Integer; s:string; wnd: HWND;
begin
 g:=StrToInt(edt8.text);
 i:=StrToInt(edt7.text) + random(g);
 edt11.text:=IntToStr(i);
    Application.ProcessMessages;
  wnd:=form1.Wb1.Handle;
  wnd:=GetSubChild(wnd);
  wnd:=GetSubChild(wnd);
  wnd:=GetSubChild(wnd);
   s:=edt11.text;
    for i:=1 to Length(s) do
        PostMessage(wnd, WM_CHAR, Word(s[i]), 0);

  tmr8.Enabled:=false;
end;
Ответить с цитированием
  #2  
Старый 03.09.2011, 23:11
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

1. Если, как говоришь, прогу пишешь сам, то зачем такая ерунда с получение окна?
2. PostMessage и SendMessage несколько разные сообщения и данные передают по-разному. PostMessage может потерять информацию.
Код:
  PostMessage(wnd, WM_CHAR, Word(s[i]), 0);
пиши так:
Код:
  SetWindowText(wnd, PChar(s));
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 03.09.2011, 23:24
ИльяК ИльяК вне форума
Прохожий
 
Регистрация: 04.05.2011
Адрес: Краснодар
Сообщения: 11
Репутация: 10
По умолчанию

angvelem, идею получения хендла окна я брал с этой темы.

Использую функцию
Код:
function GetSubChild(wd: HWnd):HWnd;
Var 
  Cw:HWnd;
Begin
  Result:=0;
  If WD=0 then Exit;
  Cw := FindWindowEx(Wd, 0, nil, nil);
  while (Cw <> 0) do
    begin
       Result:=cw;
       GetSubChild(Cw);
       Cw := FindWindowEx(Wd, Cw, nil, nil);
     End;
end;

По-другому дойти до нужного хендла и чтобы хотя бы клики передавались не получилось.

Цитата:
Сообщение от angvelem
пиши так:
Код:
SetWindowText(wnd, PChar(s));

Попробовал, почему-то перестало передавать текст даже если окно не свёрнуто/перекрыто.
Ответить с цитированием
  #4  
Старый 03.09.2011, 23:48
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Флэш-игра твоя или чужая? Если твоя, то ты и так должен знать хэндл требуемого окна, если нет, достаточно один раз вычислить. SetWindowText - API функция, устанавливающая текст любому окну у которого текст может быть.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 04.09.2011, 00:11
ИльяК ИльяК вне форума
Прохожий
 
Регистрация: 04.05.2011
Адрес: Краснодар
Сообщения: 11
Репутация: 10
По умолчанию

Флеш игра чужая. Хендл, который получает функция - от MacromediaFlashPlayerActiveX. Конкретно от окна внутри флеш игрушки, куда нужно текст передать, хендла у меня нет.

В нужное окно просто посылается клик через sendmessage, а следующим действием опять же через sendmessage пытаюсь передать текст, но в свёрнутом состоянии почему-то не хочет передавать..

Последний раз редактировалось ИльяК, 04.09.2011 в 00:15.
Ответить с цитированием
  #6  
Старый 04.09.2011, 00:24
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от ИльяК
куда нужно текст передать, хендла у меня нет.
А это что?
Код:
  for i:=1 to Length(s) do
    PostMessage(wnd, WM_CHAR, Word(s[i]), 0);
Итоговое полученное окно.
Можно попробовать так:
Код:
  // MainWnd = form1.Wb1.Handle
  ID := GetDlgCtrlID(Wnd);
  SetDlgItemText(MainWnd, ID, PChar(S));
что однозначно функции SetWindowText
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 04.09.2011 в 01:17.
Ответить с цитированием
  #7  
Старый 04.09.2011, 00:50
ИльяК ИльяК вне форума
Прохожий
 
Регистрация: 04.05.2011
Адрес: Краснодар
Сообщения: 11
Репутация: 10
По умолчанию

angvelem, сорри за нубский вопрос, для ID что надо объявить в var ? А то не пускает опробовать).

Пишет ошибку Missing operator or semicolon.
Ответить с цитированием
  #8  
Старый 04.09.2011, 00:52
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Достаточно использовать Integer или переписать так:
Код:
  SetDlgItemText(MainWnd, GetDlgCtrlID(Wnd), PChar(S));
Я тут приврал, теперь исправил.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 04.09.2011 в 01:15.
Ответить с цитированием
  #9  
Старый 04.09.2011, 01:05
ИльяК ИльяК вне форума
Прохожий
 
Регистрация: 04.05.2011
Адрес: Краснодар
Сообщения: 11
Репутация: 10
По умолчанию

ругается на то, что в скобках

GetDlgCtrlID(MainWnd, Wnd)

Too many actual parameters..
В var дописал MainWnd: HWND; , всё равно не пускает.
Ответить с цитированием
  #10  
Старый 04.09.2011, 01:16
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Неужели справки нет по API? Я там ошибку допустил.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 04.09.2011, 01:28
ИльяК ИльяК вне форума
Прохожий
 
Регистрация: 04.05.2011
Адрес: Краснодар
Сообщения: 11
Репутация: 10
По умолчанию

Проверил, отказалась передать текст.
Ответить с цитированием
  #12  
Старый 04.09.2011, 01:50
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Похоже, не в то "окно" передаёшь.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #13  
Старый 04.09.2011, 22:18
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию

Ну а не проще например, все это реализовать через HTTP запросы? запусти Charles снифь трафик, иуже из делфи запромссами долби! дольш это выйдет конечно, но и качественнее
Ответить с цитированием
  #14  
Старый 05.09.2011, 23:47
ИльяК ИльяК вне форума
Прохожий
 
Регистрация: 04.05.2011
Адрес: Краснодар
Сообщения: 11
Репутация: 10
По умолчанию

Всем спасибо за советы, проблему решил.

Удалил 1 строчку в коде и текст в игру начал нормально передаваться и в свёрнутое окно.

Код:
procedure TForm1.tmr8Timer(Sender: TObject);
var i, g, t, p, w,c: Integer; s:string; wnd: HWND;
begin
 g:=StrToInt(edt8.text);
 i:=StrToInt(edt7.text) + random(g);
 edt11.text:=IntToStr(i);
   Application.ProcessMessages; // удалил
  wnd:=form1.Wb1.Handle;
  wnd:=GetSubChild(wnd);
  wnd:=GetSubChild(wnd);
  wnd:=GetSubChild(wnd);
   s:=edt11.text;
    for i:=1 to Length(s) do
        sendmessage(wnd, WM_CHAR, Word(s[i]), 0); //postmessage заменил на sendmessage

  tmr8.Enabled:=false;
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter