Здравствуйте.
Не могли бы вы подсказать в чем суть следующей проблемы.
Программа, написаная на 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) на этапе разработки.