пишу ActiveX control (MFC C++) для проигрывания видео. сразу столкнулся с проблемой...
для отображения я использую фильтр Video Renderer и Panel для отображения (демка на C#).
если кликнуть на этой панели во время проигрывания основное окно становиться неактивным а панелька для отображения (или сам контрол если отображать на нем) — активными. как это побороть?
вот код установки параметром IVideoWindow
FullScreen = false
OwnerHWND — панелька
AppHWND — основное окно
вторая проблема — сделал pVideoWindow->put_MessageDrain(AppHWND) но тоже не работает (сообщения не приходят)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: проблемы с IVideoWindow
От:
Аноним
Дата:
15.07.07 09:56
Оценка:
Здравствуйте, squid, Вы писали:
S>вторая проблема — сделал pVideoWindow->put_MessageDrain(AppHWND) но тоже не работает (сообщения не приходят)
Я у себя эту траблу решил так:
// доступ к окну видео
pVideoHWnd = pDSUtilFunc.GetHwndVideoWindow(piGraphBuilder);
if(pVideoHWnd != NULL)
{ // устанавливаем свою оконную процедуру
oldprocVideoWnd = (WNDPROC) SetWindowLong(pVideoHWnd, GWL_WNDPROC, (LONG) SubclassVideoWndProc);
}
т.е. идея такова — получаю доступ к видео-окну, затем устанавливаю для него свою оконную процедуру.
Кстати, проблема с получением оконных сообщений возникает только при работе с обычными видео-файлами, а вот при построении графа для воспр. DVD-видео с исп. DVD-навигатора такой проблемы почему-то нет, т.е. сообщения от видео-окна отлавливаются в WindowProc к примеру.
Че за фигня, кто знает ?
S>>вторая проблема — сделал pVideoWindow->put_MessageDrain(AppHWND) но тоже не работает (сообщения не приходят)
А>Я у себя эту траблу решил так: А>// доступ к окну видео А>pVideoHWnd = pDSUtilFunc.GetHwndVideoWindow(piGraphBuilder); А>if(pVideoHWnd != NULL) А>{ // устанавливаем свою оконную процедуру А> oldprocVideoWnd = (WNDPROC) SetWindowLong(pVideoHWnd, GWL_WNDPROC, (LONG) SubclassVideoWndProc); А>} А>т.е. идея такова — получаю доступ к видео-окну, затем устанавливаю для него свою оконную процедуру.
спасибо но я не понял как вы хэндл окна получили...
Здравствуйте, squid, Вы писали:
S>пишу ActiveX control (MFC C++) для проигрывания видео. сразу столкнулся с проблемой...
S>для отображения я использую фильтр Video Renderer и Panel для отображения (демка на C#). S>если кликнуть на этой панели во время проигрывания основное окно становиться неактивным а панелька для отображения (или сам контрол если отображать на нем) — активными. как это побороть?
// This checks to see whether the window has a drain. An application can in
// most environments set the owner/parent of windows so that they appear in
// a compound document context (for example). In this case, the application
// would probably like to be told of any keyboard/mouse messages. Therefore
// we pass these messages on untranslated, returning TRUE if we're successful
BOOL WINAPI PossiblyEatMessage(HWND hwndDrain, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (hwndDrain != NULL && !InSendMessage())
{
switch (uMsg)
{
case WM_CHAR:
case WM_DEADCHAR:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MBUTTONDBLCLK:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_MOUSEACTIVATE:
case WM_MOUSEMOVE:
// If we pass this on we don't get any mouse clicks
//case WM_NCHITTEST:
case WM_NCLBUTTONDBLCLK:
case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONUP:
case WM_NCMBUTTONDBLCLK:
case WM_NCMBUTTONDOWN:
case WM_NCMBUTTONUP:
case WM_NCMOUSEMOVE:
case WM_NCRBUTTONDBLCLK:
case WM_NCRBUTTONDOWN:
case WM_NCRBUTTONUP:
case WM_RBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_SYSCHAR:
case WM_SYSDEADCHAR:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
DbgLog((LOG_TRACE, 2, TEXT("Forwarding %x to drain")));
PostMessage(hwndDrain, uMsg, wParam, lParam);
return TRUE;
}
}
return FALSE;
}
У меня IVideoWindow клент пнели которая лежит на главном окне. Естественно возникло желание таскать окно программы за любую точку.
В итоге в процедре главного окна:
case uMsg of
..........
WM_NCHITTEST: Result:=HTCAPTION;
..........
else
Result:=DefWindowProc(hwnd,uMsg,wParam,lParam);
end;
В процедуре панели на которой лужит IVideoWindow
case uMsg of
WM_NCHITTEST: Result:=HTTRANSPARENT;
..................
WM_MOUSEFIRST..WM_MOUSELAST:
begin
Cp:=Point($FFFF and LPARAM,LPARAM shr 16);
ClientToScreen(hFrameWnd,Cp);
with Cp do
PostMessage(hMainWnd,(uMsg and $F) or $A0,HTCAPTION,MakeLParam(X,Y)); ///hMainWnd — хэндл главного окна
Result:=0;
end;
.....................
else
Result:=DefWindowProc(hwnd,uMsg,wParam,lParam);
end;
Ну и само собой, при настройке вдеоокна:
FVideoWindow.put_Owner(hPanelWnd);
FVideoWindow.put_MessageDrain(hPanelWnd);