Хай All.
Народ, подскажие кто знает.
Есть задача управлять флешом, открытым в своем броузере.
Делаю:
#import "C:\WINDOWS\system32\Macromed\Flash\Flash9f.ocx" rename_namespace("Flash") named_guids
void __stdcall CExplorerWindow::OnDocumentComplete ( IDispatch* pDisp, VARIANT * URL )
{
CComPtr<Flash::IShockwaveFlash> flash;
pDisp->QueryInterface(&flash);
if (flash)
{
//сюда никогда не заходит
}
...
}
Пробовал решить вопрос через открытое окно (когда в броузере открывается флэш (скажем c:\1.swf), то создается окно MacromediaFlashPlayerActiveX)
Причем когда вызывается функция OnDocumentComplete, то окна еще нет.
LRESULT CExplorerWindow::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HWND hWnd = hAx;
hWnd = ::FindWindowEx(hWnd,NULL,"Shell Embedding", "");
hWnd = ::FindWindowEx(hWnd,NULL,"Shell DocObject View", "");
hWnd = ::FindWindowEx(hWnd,NULL,"Internet Explorer_Server", "");
hWnd = ::FindWindowEx(hWnd,NULL,"MacromediaFlashPlayerActiveX", "");
if (hWnd)
{
CAxWindow FlashWindow = hWnd;
if (FlashWindow)
{
CComPtr<Flash::IShockwaveFlash> flash;
FlashWindow.QueryControl(&flash);
if (flash)
{
//сюда никогда не заходит
}
}
}
...
}
Пробовал перебирать коллекцию элементов IHTMLElementCollection::get_all, пробовал получить в OnDocumentComplete через pDisp указатель на IWebBrowser2, через него указательна Документ, а через него уже получить доступ к флэш, но это тоже не помогло.
Само окно броузера создаю так:
hAx = ::CreateWindow(CAxWindow::GetWndClassName(),_T("{8856F961-340A-11D0-A96B-00C04FD705A2}"),
WS_CHILD|WS_VISIBLE,
MainWndRect.left,
MainWndRect.top,
MainWndRect.right - MainWndRect.left,
MainWndRect.bottom - MainWndRect.top,
this->m_hWnd,(HMENU)1,NULL,NULL);
CAxWindow wndIE = hAx;
Пробовал и wndIE.QueryControl(&flash); но тоже результатов не принесло.
Самое главное, что просто в диалоговом приложении все работает
CAxWindow ContWnd;
RECT rc;
GetClientRect(&rc);
ContWnd.Create(m_hWnd, rc, "ShockwaveFlash.ShockwaveFlash.9", WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS);
CComPtr<Flash::IShockwaveFlash> flash;
ContWnd.QueryControl(&flash);
if (flash) flash->LoadMovie(0, L"http://video.rutube.ru/a91784c6123e512da1b828b9d21756b2");
Но тут мы объект создаем сами, а мне надо подключиться к уже запущенному.
Какое великое шаманство надо совершить, чтобы все стало ок ??
Заранее спасибо.