WM_MOVE & WM_LBUTTONDOWN & SendMessage
Почитав немного я набрел на такуб весчь - в окне приложения программно можно реализовать определенные события при помощи
SendMessage.
Point.x=pos[1]+Form1->Left+66;
Point.y=pos[0]+Form1->Top+230;
// перемещаем мышку в координаты
SendMessage(Form1->Handle,WM_MOVE,0,(LPARAM) &Point);
// нажимаем кнопку мышки
SendMessage(Form1->Handle,WM_LBUTTONDOWN,MK_LBUTTON,(LPARAM) &Point);
//отпускаем кнопку мышки
SendMessage(Form1->Handle,WM_LBUTTONUP,MK_LBUTTON,(LPARAM) &Point);
Вообщем вот так вот делаю. Но кнопочка почему-то ненажимается. МОжет я что-то делаю не так или что-то забыл?
Нам надо посылать сообщение кнопке ! У сообщения WM_LBUTTONUP нет флага MK_LBUTTON ! Почему SendMessage ? В твоем случае ответа на сообщение прийти не должно, поэтому ждать пока завершится функция обработки сообщения не нужно. А значит достаточно использовать PostMessage. Нам нужен только Handle кнопки, чтобы сэмулировать нажатие. Зачем играться с координатами вообще ? Если программа чужая, то посмотри в сторону функций WindowFromPoint и ChildWindowFromPoint, ну и FindWindow/FindWindiwEx/EnumWindows. Почему надо нажатие мышкой эмулировать, а не пробелом или Enter'ом ? В общем вот:
::PostMessage(Button1->Handle,WM_LBUTTONUP,0,0);
Грубо говоря есть штмл страничка, на ней флеш игрушка, в которой есть кнопочки.... Как нажать кнопочку во флеш игрушке?*
Грубо говоря есть штмл страничка, на ней флеш игрушка, в которой есть кнопочки.... Как нажать кнопочку во флеш игрушке?*[/QUOTE]
mouse_event
mouse_event(MOUSEEVENTF_LEFTDOWN,pos[1]+Form1->Left+66,pos[0]+Form1->Top+230,0,0); mouse_event(MOUSEEVENTF_LEFTUP,pos[1]+Form1->Left+66,pos[0]+Form1->Top+230,0,0);
не работает =(
Если курсор навести на кнопку, то срабатывает =(
pt.x = (long)Button1->Left; // пихаем клиентские координаты
pt.y = (long)Button1->Top;
::ClientToScreen(Handle,&pt); // конвертим клиентские коодиранты главной формы в глобальные экранные
::SetCursorPos(pt.x, pt.y); // установим позицию курсора мышки на верхний левый угол кнопки
::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Так работает, но перемещение курсора видно. У mouse_event координаты передаются в какой-то нестандартном формате "mickeys", где экран делится на пиксели 65535x65535, при переводе стандартных координат в Mickeys из-за погрешности в округлении позиция курсора может быть не на нужной точке.
Про СетКурсор я знаю =)
Для меня важно именно чтобы нажать кнопочку =).
[COLOR=#0000bb]MOUSEEVENTF_LEFTDOWN[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000bb]0[/COLOR]
[COLOR=#0000bb]вот тут параметры, один из них отвечает за координаты, или я не прав?*[/COLOR]
Параметры координат влияют только если установлены флаги на перемещение курсора. Без установки курсора в нужную позицию произвести клик нельзя. А т.к. эта флешка, то вообще непонятно обрабатывает она хоть какие-то виндовые сообщения или нет.
Хм... Т.е. обязательно нада дергать курсор?* а через АктивX ни как? Слух...
флешка обмениваеЦЦа в режиме реального времени данными с сервером, если не ошибаюсь то через метод ПОст. Как можно перехватить то что она шлет браузеру?
Я юзаю CppWebBrowser
Хм... Т.е. обязательно нада дергать курсор?* а через АктивX ни как? Слух...
флешка обмениваеЦЦа в режиме реального времени данными с сервером, если не ошибаюсь то через метод ПОст. Как можно перехватить то что она шлет браузеру?
Я юзаю CppWebBrowser[/QUOTE]
Сниффером посмотри что получает и что отсылает.
Я просто думал что в любой точке экрана моно программно создать событие... лан, придеЦЦа поломать голову.... Хотя где-то видел что флешкой программно из билдера управляют, правда запуск и остановку....
http://www.adobe.com/support/flash/publishexport/scriptingwithflash/scriptingwithflash_03.html
http://www.delphiflash.com - тут посмотри "TShockwaveFlashEx methods", у этого компонента есть события OnClick.
Возьми например Ethereal
http://www.ethereal.com/
Лови TCP пакеты с твоей программы и анализируй. Вобще флэшь насколько я помню может как просто делать HTTP запросы так и создавать TCP сокеты на любой порт выше 1024. Есть еще там возможность сетевого соединение по RTMP протоколу, но там помоему только видео можно передавать. Так что анализируй траффик и напиши потом вручную эти запросы.
Еще помоему есть какието декодировщики флэшевого файла обратно в исходники. Поищи в гугле на предмет декодирования.
Дак может найти свою флешу в коллекции OBJECT и попробовать нажать на кнопку - IHTMLEventObj?
Хм.... а как в Евент объекте найти кнопочку??? Тупым циклом?
Книг по данной тематике я не встречал... Есть что-то похожее, но там вообще полные дебри углубляюшиеся в устройство Винды, перехват функций с помощью инжектирования и прочей лабуды.
Короче из справочников - MSDN =) только.
Чо почитать - копать на форумах (попробуй за бугром поискать, на отечественных форумах достаточно мало инфы по этой теме), искать решение самому.
if(SUCCEEDED(iHTMLDoc2_El->get_all(&pAll)) && pAll)
{
......
}
Вообщем я нашел флешку в IHTMLElementCollection по ее имени... получил на нее IDispatch. Как теперь используя IDispatch получить HWND либо послать SendMessage элементу этому? ( ппц. Чувствую себя извращенцем =(
Проблема была решена? кто может подробно на примере показать как управлять мышью в неактивном окне:confused: