Проблемы с Macromedia Flash
От: vfrizen  
Дата: 27.11.06 10:27
Оценка:
Здравствуйте.

Не могли бы вы подсказать в чем суть следующей проблемы.
Программа, написаная на WTL, как ActiveX хостит Macromedia Flash. На флешке имеется поле ввода для текста. Проблема состоит в том, что при попытке нажать Ctrl+C, V... и несколько других подобных комбинаций, в текстовом поле появляется квадратик, а самого действия горячих клавиш (например копи/паста при нажатии CTRL+C/Ctrl+V) не происходит. Так же родительское окно не получает никаких уведомлений, что была нажата какая-либо клавиша на клавиатуре.
Если на упомянутом выше текстовом поле нажать правой кнопкой мыши, появляется стандартное меню с cut/copy/past/delete. С его помощью все копирается нормально, без глюков. Родительское окно так же получает уведомление о нажатии клавиши мыши.
Еще было замечено, что во флеше работают несколько комбинаций Ctrl+... В частности отрабатывает комбинация Ctrl+J и еще несколько других.
Если же флэш вставить в IE, все работает замечательно.

Если кто-то знает, подскажите, в какую сторону копать? Может я как-нибудь его неправильно поднимаю?
#import "progid:ShockwaveFlash.ShockwaveFlash" raw_interfaces_only no_namespace

#include "resource.h"
class CTutorial
    : public CAxDialogImpl<CTutorial>
    , public CComObjectRootEx<CComSingleThreadModel>
    , public CComCoClass<CTutorial>
    , public IDispEventImpl<IDC_SHOCKWAVEFLASH1,CTutorial,&__uuidof(_IShockwaveFlashEvents), &__uuidof(__ShockwaveFlashObjects), 1, 0>
    , public CDialogResize<CTutorial>

....

public:
    enum { IDD = IDD_DIALOG1};

    BEGIN_MSG_MAP(CTutorial)
        CHAIN_MSG_MAP(CAxDialogImpl<CTutorial>)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        MESSAGE_HANDLER(WM_CLOSE, OnCloseDialog)
        COMMAND_ID_HANDLER(IDOK, OnOK)
        CHAIN_MSG_MAP(CDialogResize<CTutorial>)
        REFLECT_NOTIFICATIONS()
    END_MSG_MAP()

    BEGIN_DLGRESIZE_MAP(CTutorial)        
        DLGRESIZE_CONTROL(IDC_SHOCKWAVEFLASH1, (DLSZ_SIZE_Y | DLSZ_REPAINT))
    END_DLGRESIZE_MAP();

    BEGIN_SINK_MAP(CTutorial)
        SINK_ENTRY_EX(IDC_SHOCKWAVEFLASH1, __uuidof(_IShockwaveFlashEvents), 150, FSCommandShockwaveflash)
        SINK_ENTRY_EX(IDC_SHOCKWAVEFLASH1, __uuidof(_IShockwaveFlashEvents), 197, FlashCallShockwaveflash)
        SINK_ENTRY_EX(IDC_SHOCKWAVEFLASH1, __uuidof(_IShockwaveFlashEvents), 1958, OnProgressShockwaveflash)
        SINK_ENTRY_EX(IDC_SHOCKWAVEFLASH1, __uuidof(_IShockwaveFlashEvents), DISPID_READYSTATECHANGE, OnReadyStateChangeShockwaveflash)
    END_SINK_MAP()

private:
    CComPtr<IShockwaveFlash> m_pIFlash;

....

    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
        DlgResize_Init();

        ......

        void* init = GetProcAddress(LoadLibrary(_T("atl")),"AtlAxWinInit"); _asm call init;
        CAxWindow wndFlash = GetDlgItem(IDC_SHOCKWAVEFLASH1);
        wndFlash.QueryControl(&m_pIFlash);
        if (m_pIFlash)
        {
            m_pIFlash->put_Movie(bsInitFlash);
            m_pIFlash->Play();
        }
    }


Сам флэш (IDC_SHOCKWAVEFLASH1) вставлен в ресурс диалога (IDD_DIALOG1) на этапе разработки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.