![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Привет всем!
Столкнулся с такой проблемой: пишу программу для браузерной флеш игры, есть желание сделать возможным работу проги в фоновом режиме. Задачу наполовину реализовал с помощью 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)); |
|
#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 функция, устанавливающая текст любому окну у которого текст может быть.
|
|
#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)); Последний раз редактировалось angvelem, 04.09.2011 в 01:17. |
|
#7
|
|||
|
|||
|
angvelem, сорри за нубский вопрос, для ID что надо объявить в var ? А то не пускает опробовать).
Пишет ошибку Missing operator or semicolon. |
|
#8
|
||||
|
||||
|
Достаточно использовать Integer или переписать так:
Код:
SetDlgItemText(MainWnd, GetDlgCtrlID(Wnd), PChar(S)); Последний раз редактировалось angvelem, 04.09.2011 в 01:15. |
|
#9
|
|||
|
|||
|
ругается на то, что в скобках
GetDlgCtrlID(MainWnd, Wnd) Too many actual parameters.. В var дописал MainWnd: HWND; , всё равно не пускает. |
|
#10
|
||||
|
||||
|
Неужели справки нет по API? Я там ошибку допустил.
|
|
#11
|
|||
|
|||
|
Проверил, отказалась передать текст.
|
|
#12
|
||||
|
||||
|
Похоже, не в то "окно" передаёшь.
|
|
#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; |