|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Передача текста с помошью 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
|
||||
|
||||
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
|
|||
|
|||
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; По-другому дойти до нужного хендла и чтобы хотя бы клики передавались не получилось. Цитата:
Попробовал, почему-то перестало передавать текст даже если окно не свёрнуто/перекрыто. |
#4
|
||||
|
||||
Флэш-игра твоя или чужая? Если твоя, то ты и так должен знать хэндл требуемого окна, если нет, достаточно один раз вычислить. SetWindowText - API функция, устанавливающая текст любому окну у которого текст может быть.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
Флеш игра чужая. Хендл, который получает функция - от MacromediaFlashPlayerActiveX. Конкретно от окна внутри флеш игрушки, куда нужно текст передать, хендла у меня нет.
В нужное окно просто посылается клик через sendmessage, а следующим действием опять же через sendmessage пытаюсь передать текст, но в свёрнутом состоянии почему-то не хочет передавать.. Последний раз редактировалось ИльяК, 04.09.2011 в 00:15. |
#6
|
||||
|
||||
Цитата:
Код:
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)); Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 04.09.2011 в 01:17. |
#7
|
|||
|
|||
angvelem, сорри за нубский вопрос, для ID что надо объявить в var ? А то не пускает опробовать).
Пишет ошибку Missing operator or semicolon. |
#8
|
||||
|
||||
Достаточно использовать Integer или переписать так:
Код:
SetDlgItemText(MainWnd, GetDlgCtrlID(Wnd), PChar(S)); Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 04.09.2011 в 01:15. |
#9
|
|||
|
|||
ругается на то, что в скобках
GetDlgCtrlID(MainWnd, Wnd) Too many actual parameters.. В var дописал MainWnd: HWND; , всё равно не пускает. |
#10
|
||||
|
||||
Неужели справки нет по API? Я там ошибку допустил.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
|||
|
|||
Проверил, отказалась передать текст.
|
#12
|
||||
|
||||
Похоже, не в то "окно" передаёшь.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#13
|
|||
|
|||
Ну а не проще например, все это реализовать через HTTP запросы? запусти Charles снифь трафик, иуже из делфи запромссами долби! дольш это выйдет конечно, но и качественнее
|
#14
|
|||
|
|||
Всем спасибо за советы, проблему решил.
Удалил 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; |