...
 
Commits (2)
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
// playlist" and "current playlist" to "the playlist" [t] // playlist" and "current playlist" to "the playlist" [t]
import "ocidl.idl"; import "ocidl.idl";
#include <olectl.h>
#include <idispids.h>
[ [
uuid(DF2BBE39-40A8-433b-A279-073F48DA94B6), uuid(DF2BBE39-40A8-433b-A279-073F48DA94B6),
...@@ -149,6 +151,26 @@ library AXVLC ...@@ -149,6 +151,26 @@ library AXVLC
void MediaPlayerUnmuted(); void MediaPlayerUnmuted();
[id(DISPID_MediaPlayerAudioVolumeEvent), helpstring("Audio volume changed")] [id(DISPID_MediaPlayerAudioVolumeEvent), helpstring("Audio volume changed")]
void MediaPlayerAudioVolume([in] float volume); void MediaPlayerAudioVolume([in] float volume);
[id(DISPID_CLICK)]
void Click();
[id(DISPID_DBLCLICK)]
void DblClick( );
[id(DISPID_KEYDOWN)]
void KeyDown( short* KeyCode, short Shift );
[id(DISPID_KEYPRESS)]
void KeyPress( short* KeyAscii );
[id(DISPID_KEYUP)]
void KeyUp( short* KeyCode, short Shift );
[id(DISPID_MOUSEDOWN)]
void MouseDown( short Button , short Shift , long x , long y);
[id(DISPID_MOUSEMOVE)]
void MouseMove( short Button , short Shift , long x , long y);
[id(DISPID_MOUSEUP)]
void MouseUp( short Button , short Shift , long x, long y);
}; };
[ [
......
...@@ -346,7 +346,20 @@ VLCDispatchEvent::~VLCDispatchEvent() ...@@ -346,7 +346,20 @@ VLCDispatchEvent::~VLCDispatchEvent()
if( _dispParams.rgvarg != nullptr ) if( _dispParams.rgvarg != nullptr )
{ {
for(unsigned int c = 0; c < _dispParams.cArgs; ++c) for(unsigned int c = 0; c < _dispParams.cArgs; ++c)
{
if ( (_dispParams.rgvarg[c].vt & VT_BYREF) )
{
switch ( _dispParams.rgvarg[c].vt ) {
case VT_I2|VT_BYREF:
delete _dispParams.rgvarg[c].piVal;
break;
case VT_I4|VT_BYREF:
delete _dispParams.rgvarg[c].plVal;
break;
}
}
VariantClear(_dispParams.rgvarg + c); VariantClear(_dispParams.rgvarg + c);
}
CoTaskMemFree(_dispParams.rgvarg); CoTaskMemFree(_dispParams.rgvarg);
} }
if( _dispParams.rgdispidNamedArgs != nullptr ) if( _dispParams.rgdispidNamedArgs != nullptr )
......
...@@ -51,9 +51,18 @@ ...@@ -51,9 +51,18 @@
#include <servprov.h> #include <servprov.h>
#include <shlwapi.h> #include <shlwapi.h>
#include <wininet.h> #include <wininet.h>
#include <windowsx.h>
using namespace std; using namespace std;
#define LEFT_BUTTON 0x01
#define RIGHT_BUTTON 0x02
#define MIDDLE_BUTTON 0x04
#define SHIFT_MASK 0x01
#define CTRL_MASK 0x02
#define ALT_MASK 0x04
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//class factory //class factory
...@@ -87,9 +96,14 @@ static LRESULT CALLBACK VLCInPlaceClassWndProc(HWND hWnd, UINT uMsg, WPARAM wPar ...@@ -87,9 +96,14 @@ static LRESULT CALLBACK VLCInPlaceClassWndProc(HWND hWnd, UINT uMsg, WPARAM wPar
} }
return 0L; return 0L;
} }
default: case WM_CHAR:
return DefWindowProc(hWnd, uMsg, wParam, lParam); case WM_SYSKEYUP:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_KEYDOWN:
p_instance->OnKeyEvent(uMsg, wParam, lParam);
} }
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}; };
VLCPluginClass::VLCPluginClass(LONG *p_class_ref, HINSTANCE hInstance, REFCLSID rclsid) : VLCPluginClass::VLCPluginClass(LONG *p_class_ref, HINSTANCE hInstance, REFCLSID rclsid) :
...@@ -219,7 +233,7 @@ extern HMODULE DllGetModule(); ...@@ -219,7 +233,7 @@ extern HMODULE DllGetModule();
VLCPlugin::VLCPlugin(VLCPluginClass *p_class, LPUNKNOWN pUnkOuter) : VLCPlugin::VLCPlugin(VLCPluginClass *p_class, LPUNKNOWN pUnkOuter) :
_inplacewnd(NULL), _inplacewnd(NULL),
_WindowsManager(DllGetModule(), _ViewRC, &m_player, this), _WindowsManager(DllGetModule(), _ViewRC, &m_player, this, this),
_p_class(p_class), _p_class(p_class),
_i_ref(1UL), _i_ref(1UL),
_i_codepage(CP_ACP), _i_codepage(CP_ACP),
...@@ -579,6 +593,83 @@ BOOL VLCPlugin::isInPlaceActive(void) ...@@ -579,6 +593,83 @@ BOOL VLCPlugin::isInPlaceActive(void)
return (NULL != _inplacewnd); return (NULL != _inplacewnd);
} }
static short _shiftState()
{
short shift = (GetKeyState(VK_SHIFT) < 0) ? SHIFT_MASK : 0;
short ctrl = (GetKeyState(VK_CONTROL) < 0) ? CTRL_MASK : 0;
short alt = (GetKeyState(VK_MENU) < 0) ? ALT_MASK : 0;
return (shift | ctrl | alt);
}
void VLCPlugin::OnKeyEvent(UINT uKeyMsg, WPARAM wParam, LPARAM lParam)
{
USHORT nChar = (USHORT)wParam;
USHORT nShiftState = _shiftState();
switch (uKeyMsg) {
case WM_SYSKEYDOWN:
case WM_KEYDOWN:
fireKeyDownEvent(nChar , nShiftState);
break;
case WM_CHAR:
fireKeyPressEvent(nChar);
break;
case WM_SYSKEYUP:
case WM_KEYUP:
fireKeyUpEvent(nChar , nShiftState);
break;
}
}
void VLCPlugin::OnMouseEvent(UINT uMouseMsg, WPARAM wParam, LPARAM lParam)
{
short state = _shiftState();
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
switch (uMouseMsg) {
case WM_MOUSEMOVE:
{
short button = 0;
button |= (wParam & MK_LBUTTON) ? LEFT_BUTTON : 0;
button |= (wParam & MK_MBUTTON) ? MIDDLE_BUTTON : 0;
button |= (wParam & MK_RBUTTON) ? RIGHT_BUTTON : 0;
fireMouseMoveEvent( button, state, x, y );
break;
}
case WM_RBUTTONDBLCLK:
case WM_MBUTTONDBLCLK:
case WM_LBUTTONDBLCLK:
fireDblClickEvent();
break;
case WM_RBUTTONDOWN:
fireMouseDownEvent( RIGHT_BUTTON, state , x, y );
break;
case WM_MBUTTONDOWN:
fireMouseDownEvent( MIDDLE_BUTTON, state , x, y );
break;
case WM_LBUTTONDOWN:
fireMouseDownEvent( LEFT_BUTTON, state , x, y );
break;
case WM_RBUTTONUP:
fireMouseUpEvent( RIGHT_BUTTON, state , x, y );
fireClickEvent();
break;
case WM_MBUTTONUP:
fireMouseUpEvent( MIDDLE_BUTTON, state , x, y );
fireClickEvent();
break;
case WM_LBUTTONUP:
fireMouseUpEvent( LEFT_BUTTON, state , x, y );
fireClickEvent();
break;
default:
break;
}
}
HRESULT VLCPlugin::onActivateInPlace(LPMSG, HWND hwndParent, LPCRECT lprcPosRect, LPCRECT lprcClipRect) HRESULT VLCPlugin::onActivateInPlace(LPMSG, HWND hwndParent, LPCRECT lprcPosRect, LPCRECT lprcClipRect)
{ {
RECT clipRect = *lprcClipRect; RECT clipRect = *lprcClipRect;
...@@ -1125,20 +1216,121 @@ void VLCPlugin::fireOnMediaPlayerLengthChangedEvent(long length) ...@@ -1125,20 +1216,121 @@ void VLCPlugin::fireOnMediaPlayerLengthChangedEvent(long length)
vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerLengthChangedEvent, &params); vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerLengthChangedEvent, &params);
} }
#if LIBVLC_VERSION_INT >= LIBVLC_VERSION(3, 0, 0, 0) void VLCPlugin::fireClickEvent()
void VLCPlugin::fireOnMediaPlayerChapterChangedEvent(int chapter) {
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
vlcConnectionPointContainer->fireEvent(DISPID_CLICK, &dispparamsNoArgs);
}
void VLCPlugin::fireDblClickEvent()
{
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
vlcConnectionPointContainer->fireEvent(DISPID_DBLCLICK, &dispparamsNoArgs);
}
void VLCPlugin::fireMouseDownEvent(short nButton, short nShiftState, int x, int y)
{
DISPPARAMS params;
params.cArgs = 4;
params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs);
memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs);
params.rgvarg[3].vt = VT_I2;
params.rgvarg[3].iVal = nButton;
params.rgvarg[2].vt = VT_I2;
params.rgvarg[2].iVal = nShiftState;
params.rgvarg[1].vt = VT_I4;
params.rgvarg[1].lVal = x;
params.rgvarg[0].vt = VT_I4;
params.rgvarg[0].lVal = y;
params.rgdispidNamedArgs = NULL;
params.cNamedArgs = 0;
vlcConnectionPointContainer->fireEvent(DISPID_MOUSEDOWN, &params);
}
void VLCPlugin::fireMouseMoveEvent(short nButton, short nShiftState, int x, int y)
{
DISPPARAMS params;
params.cArgs = 4;
params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs);
memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs);
params.rgvarg[3].vt = VT_I2;
params.rgvarg[3].iVal = nButton;
params.rgvarg[2].vt = VT_I2;
params.rgvarg[2].iVal = nShiftState;
params.rgvarg[1].vt = VT_I4;
params.rgvarg[1].lVal = x;
params.rgvarg[0].vt = VT_I4;
params.rgvarg[0].lVal = y;
params.rgdispidNamedArgs = NULL;
params.cNamedArgs = 0;
vlcConnectionPointContainer->fireEvent(DISPID_MOUSEMOVE, &params);
}
void VLCPlugin::fireMouseUpEvent(short nButton, short nShiftState, int x, int y)
{
DISPPARAMS params;
params.cArgs = 4;
params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs);
memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs);
params.rgvarg[3].vt = VT_I2;
params.rgvarg[3].iVal = nButton;
params.rgvarg[2].vt = VT_I2;
params.rgvarg[2].iVal = nShiftState;
params.rgvarg[1].vt = VT_I4;
params.rgvarg[1].lVal = x;
params.rgvarg[0].vt = VT_I4;
params.rgvarg[0].lVal = y;
params.rgdispidNamedArgs = NULL;
params.cNamedArgs = 0;
vlcConnectionPointContainer->fireEvent(DISPID_MOUSEUP, &params);
}
void VLCPlugin::fireKeyDownEvent(short nChar, short nShiftState)
{
DISPPARAMS params;
params.cArgs = 2;
params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs);
memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs);
//freed by VLCDispatchEvent::~VLCDispatchEvent
params.rgvarg[1].vt = VT_I2 | VT_BYREF;
params.rgvarg[1].piVal = new short(nChar);
params.rgvarg[0].vt = VT_I2;
params.rgvarg[0].iVal = nShiftState;
params.rgdispidNamedArgs = NULL;
params.cNamedArgs = 0;
vlcConnectionPointContainer->fireEvent(DISPID_KEYDOWN, &params);
}
void VLCPlugin::fireKeyPressEvent(short nChar)
{ {
DISPPARAMS params; DISPPARAMS params;
params.cArgs = 1; params.cArgs = 1;
params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs) ; params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs);
memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs); memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs);
//freed by VLCDispatchEvent::~VLCDispatchEvent
params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].piVal = new short(nChar);
params.rgdispidNamedArgs = NULL;
params.cNamedArgs = 0;
vlcConnectionPointContainer->fireEvent(DISPID_KEYPRESS, &params);
}
void VLCPlugin::fireKeyUpEvent(short nChar, short nShiftState)
{
DISPPARAMS params;
params.cArgs = 2;
params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs);
memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs);
//freed by VLCDispatchEvent::~VLCDispatchEvent
params.rgvarg[1].vt = VT_I2 | VT_BYREF;
params.rgvarg[1].piVal = new short(nChar);
params.rgvarg[0].vt = VT_I2; params.rgvarg[0].vt = VT_I2;
params.rgvarg[0].iVal = chapter; params.rgvarg[0].iVal = nShiftState;
params.rgdispidNamedArgs = NULL; params.rgdispidNamedArgs = NULL;
params.cNamedArgs = 0; params.cNamedArgs = 0;
vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerChapterChangedEvent, &params); vlcConnectionPointContainer->fireEvent(DISPID_KEYUP, &params);
} }
#endif
void VLCPlugin::fireOnMediaPlayerVoutEvent(int count) void VLCPlugin::fireOnMediaPlayerVoutEvent(int count)
{ {
...@@ -1180,6 +1372,21 @@ void VLCPlugin::fireOnMediaPlayerAudioVolumeEvent(float volume) ...@@ -1180,6 +1372,21 @@ void VLCPlugin::fireOnMediaPlayerAudioVolumeEvent(float volume)
} }
#endif #endif
#if LIBVLC_VERSION_INT >= LIBVLC_VERSION(3, 0, 0, 0)
void VLCPlugin::fireOnMediaPlayerChapterChangedEvent(int chapter)
{
DISPPARAMS params;
params.cArgs = 1;
params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs) ;
memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs);
params.rgvarg[0].vt = VT_I2;
params.rgvarg[0].iVal = chapter;
params.rgdispidNamedArgs = NULL;
params.cNamedArgs = 0;
vlcConnectionPointContainer->fireEvent(DISPID_CLICK, &params);
}
#endif
/* */ /* */
void VLCPlugin::set_player_window() void VLCPlugin::set_player_window()
......
...@@ -73,7 +73,8 @@ private: ...@@ -73,7 +73,8 @@ private:
}; };
class VLCPlugin class VLCPlugin
: public IUnknown, private vlc_player_options : public IUnknown, private vlc_player_options,
public VLCWindowsManager::InputObserver
{ {
public: public:
VLCPlugin(VLCPluginClass *p_class, LPUNKNOWN pUnkOuter); VLCPlugin(VLCPluginClass *p_class, LPUNKNOWN pUnkOuter);
...@@ -219,6 +220,10 @@ public: ...@@ -219,6 +220,10 @@ public:
BOOL isInPlaceActive(void); BOOL isInPlaceActive(void);
//VLCWindowsManager::InputObserver methods
virtual void OnKeyEvent(UINT uKeyMsg, WPARAM wParam, LPARAM lParam) override;
virtual void OnMouseEvent(UINT uMouseMsg, WPARAM wParam, LPARAM lParam) override;
/* /*
** container events ** container events
*/ */
...@@ -270,6 +275,15 @@ public: ...@@ -270,6 +275,15 @@ public:
void fireOnMediaPlayerAudioVolumeEvent(float volume); void fireOnMediaPlayerAudioVolumeEvent(float volume);
#endif #endif
void fireClickEvent();
void fireDblClickEvent();
void fireMouseDownEvent(short nButton, short nShiftState, int x, int y);
void fireMouseMoveEvent(short nButton, short nShiftState, int x, int y);
void fireMouseUpEvent(short nButton, short nShiftState, int x, int y);
void fireKeyDownEvent(short nChar, short nShiftState);
void fireKeyPressEvent(short nChar);
void fireKeyUpEvent(short nchar, short shiftState);
// controlling IUnknown interface // controlling IUnknown interface
LPUNKNOWN pUnkOuter; LPUNKNOWN pUnkOuter;
......
...@@ -580,6 +580,7 @@ LRESULT VLCHolderWnd::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -580,6 +580,7 @@ LRESULT VLCHolderWnd::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
} }
case WM_SET_MOUSE_HOOK:{ case WM_SET_MOUSE_HOOK:{
MouseHook(true); MouseHook(true);
KeyboardHook(true);
break; break;
} }
case WM_PAINT:{ case WM_PAINT:{
...@@ -616,6 +617,7 @@ LRESULT VLCHolderWnd::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -616,6 +617,7 @@ LRESULT VLCHolderWnd::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
} }
break; break;
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
WM().OnMouseEvent(uMsg, wParam, lParam);
if (_CtrlsWnd && (_oldMouseCoords.x != GET_X_LPARAM(lParam) || if (_CtrlsWnd && (_oldMouseCoords.x != GET_X_LPARAM(lParam) ||
_oldMouseCoords.y != GET_Y_LPARAM(lParam))) _oldMouseCoords.y != GET_Y_LPARAM(lParam)))
{ {
...@@ -623,9 +625,28 @@ LRESULT VLCHolderWnd::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -623,9 +625,28 @@ LRESULT VLCHolderWnd::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
_oldMouseCoords = MAKEPOINTS(lParam); _oldMouseCoords = MAKEPOINTS(lParam);
} }
break; break;
case WM_MBUTTONDBLCLK:
case WM_LBUTTONDBLCLK: case WM_LBUTTONDBLCLK:
WM().OnMouseEvent(uMsg); case WM_RBUTTONDBLCLK:
case WM_XBUTTONDBLCLK:
case WM_MBUTTONUP:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_XBUTTONUP:
case WM_MBUTTONDOWN:
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_XBUTTONDOWN:
WM().OnMouseEvent(uMsg, wParam, lParam);
return VLCWnd::WindowProc(uMsg, wParam, lParam);
break; break;
case WM_CHAR:
case WM_KEYUP:
case WM_KEYDOWN:
WM().OnKeyEvent(uMsg, wParam, lParam);
return VLCWnd::WindowProc(uMsg, wParam, lParam);
case WM_MOUSE_EVENT_NOTIFY:{ case WM_MOUSE_EVENT_NOTIFY:{
// This is called synchronously, though handling it directly from the mouse hook // This is called synchronously, though handling it directly from the mouse hook
// deadlocks (quite likely because we're destroying the windows we're being called from) // deadlocks (quite likely because we're destroying the windows we're being called from)
...@@ -634,7 +655,32 @@ LRESULT VLCHolderWnd::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam) ...@@ -634,7 +655,32 @@ LRESULT VLCHolderWnd::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
return WM_MOUSE_EVENT_NOTIFY_SUCCESS; return WM_MOUSE_EVENT_NOTIFY_SUCCESS;
} }
case WM_MOUSE_EVENT_REPOST: case WM_MOUSE_EVENT_REPOST:
WM().OnMouseEvent(wParam); {
//on click set focus to the parent of MP to receice key events
switch (wParam) {
case WM_RBUTTONUP:
case WM_MBUTTONUP:
case WM_LBUTTONUP:
case WM_XBUTTONUP:
{
HWND mphwnd = FindMP_hWnd();
if (mphwnd)
SetFocus(GetParent(mphwnd));
break;
}
}
WM().OnMouseEvent(uMsg, wParam, lParam);
break;
}
case WM_KEYBOARD_EVENT_NOTIFY:{
PostMessage(hWnd(), WM_KEYBOARD_EVENT_REPOST, wParam, lParam);
return WM_KEYBOARD_EVENT_NOTIFY_SUCCESS;
}
case WM_KEYBOARD_EVENT_REPOST:
if ((lParam & 0xA0000000) == 0)
WM().OnKeyEvent(WM_KEYDOWN, wParam, lParam);
else
WM().OnKeyEvent(WM_KEYUP, wParam, lParam);
break; break;
default: default:
return VLCWnd::WindowProc(uMsg, wParam, lParam); return VLCWnd::WindowProc(uMsg, wParam, lParam);
...@@ -655,11 +701,22 @@ void VLCHolderWnd::DestroyWindow() ...@@ -655,11 +701,22 @@ void VLCHolderWnd::DestroyWindow()
LRESULT CALLBACK VLCHolderWnd::MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK VLCHolderWnd::MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{ {
bool AllowReceiveMessage = true;
if(nCode >= 0){ if(nCode >= 0){
switch(wParam){ switch(wParam){
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
case WM_LBUTTONDBLCLK:{ case WM_RBUTTONDBLCLK:
case WM_MBUTTONDBLCLK:
case WM_LBUTTONDBLCLK:
case WM_XBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_LBUTTONDOWN:
case WM_XBUTTONDOWN:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
case WM_LBUTTONUP:
case WM_XBUTTONUP:
{
MOUSEHOOKSTRUCT* mhs = reinterpret_cast<MOUSEHOOKSTRUCT*>(lParam); MOUSEHOOKSTRUCT* mhs = reinterpret_cast<MOUSEHOOKSTRUCT*>(lParam);
//try to find HolderWnd and notify it //try to find HolderWnd and notify it
...@@ -669,20 +726,32 @@ LRESULT CALLBACK VLCHolderWnd::MouseHookProc(int nCode, WPARAM wParam, LPARAM lP ...@@ -669,20 +726,32 @@ LRESULT CALLBACK VLCHolderWnd::MouseHookProc(int nCode, WPARAM wParam, LPARAM lP
hNotifyWnd = GetParent(hNotifyWnd); hNotifyWnd = GetParent(hNotifyWnd);
SMRes = ::SendMessage(hNotifyWnd, WM_MOUSE_EVENT_NOTIFY, wParam, 0); SMRes = ::SendMessage(hNotifyWnd, WM_MOUSE_EVENT_NOTIFY, wParam, 0);
} }
AllowReceiveMessage = WM_MOUSEMOVE==wParam || (WM_MOUSE_EVENT_NOTIFY_SUCCESS != SMRes);
break; break;
} }
} }
} }
LRESULT NHRes = CallNextHookEx(NULL, nCode, wParam, lParam); return CallNextHookEx(NULL, nCode, wParam, lParam);
if(AllowReceiveMessage)
return NHRes;
else
return 1;
} }
LRESULT CALLBACK VLCHolderWnd::KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode != HC_ACTION)
return CallNextHookEx(NULL, nCode, wParam, lParam);
//try to find HolderWnd and notify it
HWND hNotifyWnd = ::GetFocus();
LRESULT SMRes = ::SendMessage(hNotifyWnd, WM_KEYBOARD_EVENT_NOTIFY, wParam, lParam);
while( hNotifyWnd && WM_KEYBOARD_EVENT_NOTIFY_SUCCESS != SMRes){
hNotifyWnd = GetParent(hNotifyWnd);
SMRes = ::SendMessage(hNotifyWnd, WM_KEYBOARD_EVENT_NOTIFY, wParam, lParam);
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
void VLCHolderWnd::MouseHook(bool SetHook) void VLCHolderWnd::MouseHook(bool SetHook)
{ {
if(SetHook){ if(SetHook){
...@@ -709,6 +778,33 @@ void VLCHolderWnd::MouseHook(bool SetHook) ...@@ -709,6 +778,33 @@ void VLCHolderWnd::MouseHook(bool SetHook)
} }
} }
void VLCHolderWnd::KeyboardHook(bool SetHook)
{
if(SetHook){
HWND hMPWnd = FindMP_hWnd();
const DWORD WndThreadID = (hMPWnd) ? GetWindowThreadProcessId(hMPWnd, NULL) : 0;
if( _hKeyboardHook &&( !hMPWnd || WndThreadID != _KeyboardHookThreadId) ){
//unhook if something changed
KeyboardHook(false);
}
if(!_hKeyboardHook && hMPWnd && WndThreadID){
_KeyboardHookThreadId = WndThreadID;
_hKeyboardHook =
SetWindowsHookEx(WH_KEYBOARD, VLCHolderWnd::KeyboardHookProc,
NULL, WndThreadID);
}
}
else{
if(_hKeyboardHook){
UnhookWindowsHookEx(_hKeyboardHook);
_KeyboardHookThreadId=0;
_hKeyboardHook = 0;
}
}
}
HWND VLCHolderWnd::FindMP_hWnd() HWND VLCHolderWnd::FindMP_hWnd()
{ {
if(_CtrlsWnd) if(_CtrlsWnd)
...@@ -800,10 +896,20 @@ LRESULT CALLBACK VLCFullScreenWnd::FSWndWindowProc(HWND hWnd, UINT uMsg, WPARAM ...@@ -800,10 +896,20 @@ LRESULT CALLBACK VLCFullScreenWnd::FSWndWindowProc(HWND hWnd, UINT uMsg, WPARAM
} }
break; break;
} }
case WM_KEYDOWN: {
case WM_CHAR:
case WM_SYSKEYUP:
case WM_KEYUP:
if (fs_data) if (fs_data)
fs_data->_WindowsManager->OnKeyDownEvent(wParam); fs_data->_WindowsManager->OnKeyEvent(uMsg, wParam, lParam);
break; return DefWindowProc(hWnd, uMsg, wParam, lParam);
case WM_SYSKEYDOWN:
case WM_KEYDOWN: {
if (fs_data) {
fs_data->_WindowsManager->OnKeyEvent(uMsg, wParam, lParam);
fs_data->_WindowsManager->OnKeyDownEvent(uMsg, wParam, lParam);
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
} }
default: default:
return DefWindowProc(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
...@@ -832,9 +938,10 @@ VLCFullScreenWnd* VLCFullScreenWnd::CreateFSWindow(VLCWindowsManager* WM) ...@@ -832,9 +938,10 @@ VLCFullScreenWnd* VLCFullScreenWnd::CreateFSWindow(VLCWindowsManager* WM)
//VLCWindowsManager //VLCWindowsManager
/////////////////////// ///////////////////////
VLCWindowsManager::VLCWindowsManager(HMODULE hModule, const VLCViewResources& rc, VLCWindowsManager::VLCWindowsManager(HMODULE hModule, const VLCViewResources& rc,
vlc_player* player, const vlc_player_options* po) vlc_player* player, const vlc_player_options* po,
InputObserver* observer)
:_rc(rc), _hModule(hModule), _po(po), _hWindowedParentWnd(0), _vp(player), :_rc(rc), _hModule(hModule), _po(po), _hWindowedParentWnd(0), _vp(player),
_HolderWnd(0), _FSWnd(0), _b_new_messages_flag(false), Last_WM_MOUSEMOVE_Pos(0) _HolderWnd(0), _FSWnd(0), _InputObserver(observer), _b_new_messages_flag(false), Last_WM_MOUSEMOVE_Pos(0)
{ {
VLCFullScreenWnd::RegisterWndClassName(hModule); VLCFullScreenWnd::RegisterWndClassName(hModule);
} }
...@@ -960,9 +1067,9 @@ bool VLCWindowsManager::IsFullScreen() ...@@ -960,9 +1067,9 @@ bool VLCWindowsManager::IsFullScreen()
return 0!=_FSWnd && 0!=_HolderWnd && GetParent(_HolderWnd->hWnd())==_FSWnd->getHWND(); return 0!=_FSWnd && 0!=_HolderWnd && GetParent(_HolderWnd->hWnd())==_FSWnd->getHWND();
} }
void VLCWindowsManager::OnKeyDownEvent(UINT uKeyMsg) void VLCWindowsManager::OnKeyDownEvent(UINT uKeyMsg, WPARAM wParam, LPARAM lParam)
{ {
switch(uKeyMsg){ switch(wParam){
case VK_ESCAPE: case VK_ESCAPE:
case 'F': case 'F':
EndFullScreen(); EndFullScreen();
...@@ -971,20 +1078,34 @@ void VLCWindowsManager::OnKeyDownEvent(UINT uKeyMsg) ...@@ -971,20 +1078,34 @@ void VLCWindowsManager::OnKeyDownEvent(UINT uKeyMsg)
} }
} }
void VLCWindowsManager::OnMouseEvent(UINT uMouseMsg) void VLCWindowsManager::OnKeyEvent(UINT uKeyMsg, WPARAM wParam, LPARAM lParam)
{ {
switch(uMouseMsg){ if (_InputObserver)
case WM_LBUTTONDBLCLK: this->_InputObserver->OnKeyEvent(uKeyMsg, wParam, lParam);
ToggleFullScreen(); }
break;
case WM_MOUSEMOVE:{ void VLCWindowsManager::OnMouseEvent(UINT uMouseMsg, WPARAM wParam, LPARAM lParam)
DWORD MsgPos = GetMessagePos(); {
if(Last_WM_MOUSEMOVE_Pos != MsgPos){ if (uMouseMsg == WM_MOUSE_EVENT_REPOST)
Last_WM_MOUSEMOVE_Pos = MsgPos; {
_HolderWnd->ControlWindow()->NeedShowControls(); DWORD MsgPos = GetMessagePos();
switch(wParam){
case WM_LBUTTONDBLCLK:
ToggleFullScreen();
break;
case WM_MOUSEMOVE:{
DWORD MsgPos = GetMessagePos();
if(Last_WM_MOUSEMOVE_Pos != MsgPos){
Last_WM_MOUSEMOVE_Pos = MsgPos;
_HolderWnd->ControlWindow()->NeedShowControls();
}
break;
} }
break;
} }
if (_InputObserver)
this->_InputObserver->OnMouseEvent(wParam, lParam, MsgPos);
} }
else if (_InputObserver)
this->_InputObserver->OnMouseEvent(uMouseMsg, wParam, lParam);
} }
...@@ -33,8 +33,11 @@ ...@@ -33,8 +33,11 @@
enum{ enum{
WM_MOUSE_EVENT_NOTIFY = WM_APP + 1, WM_MOUSE_EVENT_NOTIFY = WM_APP + 1,
WM_MOUSE_EVENT_REPOST, WM_MOUSE_EVENT_REPOST,
WM_KEYBOARD_EVENT_NOTIFY,
WM_KEYBOARD_EVENT_REPOST,
WM_SET_MOUSE_HOOK, WM_SET_MOUSE_HOOK,
WM_MOUSE_EVENT_NOTIFY_SUCCESS = 0xFF WM_MOUSE_EVENT_NOTIFY_SUCCESS = 0xFE,
WM_KEYBOARD_EVENT_NOTIFY_SUCCESS = 0xFF
}; };
...@@ -154,7 +157,9 @@ public: ...@@ -154,7 +157,9 @@ public:
protected: protected:
VLCHolderWnd(HINSTANCE hInstance, VLCWindowsManager* WM) VLCHolderWnd(HINSTANCE hInstance, VLCWindowsManager* WM)
: VLCWnd(hInstance), _hMouseHook(NULL), _MouseHookThreadId(0), : VLCWnd(hInstance),
_hMouseHook(NULL), _MouseHookThreadId(0),
_hKeyboardHook(NULL), _KeyboardHookThreadId(0),
_wm(WM), _hBgBrush(0), _CtrlsWnd(0), _oldMouseCoords() {} _wm(WM), _hBgBrush(0), _CtrlsWnd(0), _oldMouseCoords() {}
bool Create(HWND hWndParent); bool Create(HWND hWndParent);
...@@ -171,6 +176,7 @@ public: ...@@ -171,6 +176,7 @@ public:
private: private:
static LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);
HWND FindMP_hWnd(); HWND FindMP_hWnd();
...@@ -178,6 +184,11 @@ private: ...@@ -178,6 +184,11 @@ private:
DWORD _MouseHookThreadId; DWORD _MouseHookThreadId;
void MouseHook(bool SetHook); void MouseHook(bool SetHook);
HHOOK _hKeyboardHook;
DWORD _KeyboardHookThreadId;
void KeyboardHook(bool SetHook);
VLCWindowsManager& WM() VLCWindowsManager& WM()
{return *_wm;} {return *_wm;}
inline vlc_player* VP() const; inline vlc_player* VP() const;
...@@ -238,9 +249,19 @@ private: ...@@ -238,9 +249,19 @@ private:
/////////////////////// ///////////////////////
class VLCWindowsManager class VLCWindowsManager
{ {
public:
class InputObserver
{
public:
virtual ~InputObserver() {}
virtual void OnKeyEvent(UINT uKeyMsg, WPARAM wParam, LPARAM lParam) = 0;
virtual void OnMouseEvent(UINT uMouseMsg, WPARAM wParam, LPARAM lParam) = 0;
};
public: public:
VLCWindowsManager(HMODULE hModule, const VLCViewResources& rc, VLCWindowsManager(HMODULE hModule, const VLCViewResources& rc,
vlc_player* player, const vlc_player_options* = 0); vlc_player* player, const vlc_player_options* = 0,
InputObserver* observer = 0);
~VLCWindowsManager(); ~VLCWindowsManager();
VLCWindowsManager(const VLCWindowsManager&) = delete; VLCWindowsManager(const VLCWindowsManager&) = delete;
VLCWindowsManager& operator=(const VLCWindowsManager&) = delete; VLCWindowsManager& operator=(const VLCWindowsManager&) = delete;
...@@ -266,8 +287,9 @@ public: ...@@ -266,8 +287,9 @@ public:
bool getNewMessageFlag() const bool getNewMessageFlag() const
{return _b_new_messages_flag;}; {return _b_new_messages_flag;};
public: public:
void OnKeyDownEvent(UINT uKeyMsg); void OnKeyEvent(UINT uMouseMsg, WPARAM wParam, LPARAM lParam);
void OnMouseEvent(UINT uMouseMsg); void OnKeyDownEvent(UINT uKeyMsg, WPARAM wParam, LPARAM lParam);
void OnMouseEvent(UINT uMouseMsg, WPARAM wParam, LPARAM lParam);
private: private:
const VLCViewResources& _rc; const VLCViewResources& _rc;
...@@ -281,6 +303,8 @@ private: ...@@ -281,6 +303,8 @@ private:
VLCHolderWnd* _HolderWnd; VLCHolderWnd* _HolderWnd;
VLCFullScreenWnd* _FSWnd; VLCFullScreenWnd* _FSWnd;
InputObserver* _InputObserver;
bool _b_new_messages_flag; bool _b_new_messages_flag;
private: private:
......