qt调用vlc响应windows消息

转载 2015年07月10日 13:41:20

调用vlc的时候,vlc将会托管所有鼠标消息,键盘消息(因为vlc内置一个dvd menu功能,将会使用到这些消息),然而我们便不能定制自己的行为了,比如本人需要获取鼠标点击的坐标。
查询资料发现有5种解决方案。如下
1.全局hook,都说能成功。没有尝试过。
2.在事件到达vlc部件之前拦截鼠标消息,按照windows消息传递机制,外部消息是由父到子(顶层窗口,子窗口,部件……),可以在父部件上面设置时间过滤器,取消到子部件事件分发
3.libvlc_video_set_mouse_input(,false);禁用鼠标事件(视频渲染窗口不处理鼠标消息),google上面查询到事件到达视频窗口后会直接传递到父窗口,本人曾经测试成功,后来不知道什么原因cursor直接被吃掉了。(键盘有对应的 libvlc_video_set_key_input)
4.编译vlc源码,收到消息后转发。本人测试成功,但是自己编译的vlc几乎比官方大一半,而且稳定性相对较弱。
5.调用windows API,禁用掉vlc事件处理窗口,这样事件不能够到达vlc。和第二条原理类似。本人最终采用这条方案。
注:vlc接收到传入的窗口句柄后,会派生两个窗口,一个用于渲染视频,一个时间处理
引用自:https://forum.videolan.org/viewtopic.php?f=32&t=92568#
Ok, vlc creates two child windows into window you pass in the libvlc_media_player_set_hwnd function every time you play a video. One of these windows is maked to get mouse events, and the other window is used to output the video.

Windows schema :
1 MyWindow
2 -VlcEnvetWindow
3 –VlcOutputWindow

You need get handle of VlcEventWindow. To get these handle i use a timer when video starts to play and into these timer i use EnumChildWindows passing in the hWnd MyWindow to search the inmediate child. I use a timer because vlc windows take some time to be created.

CODE: SELECT ALL
// First step is start a timer when you play a video,

// Second step : in the timer function i call :
EnumChildWindows(MyWindow_HWND, EnumerateVLC, NULL);

// Third step : if EnumerateVlc get some child window these window is the VlcEventWindow, and need disable it, to reach mouse events on MyWindow
BOOL CALLBACK EnumerateVLC(HWND hWndvlc, LPARAM lParam) {
EnableWindow(hWndvlc, FALSE);
// And kill timer, i only need get this handle one time.
return TRUE;
}

// When EnumerateVLC is called all mouse events are redirected to MyWindow

And remember, when you stop/finish the video vlcwindows are destroyed, and you need to get new handle every time after this ocours on your play function.

Another thing is, when you pause the video, vlcwindows are not destroyed, and its not necesary get VlcEventWindow handle again.

Sorry for my poor english again, and Good luck.

相关文章推荐

Qt调用VLC写的视频播放器源码

http://www.bcwhy.com/thread-18482-1-1.html 最近因为工作需要,做了个视频播放器,能播放目前绝大多数格式,也能播放流媒体文件,界面是用Qt做的,这...

qt在windows环境下截取消息

  • 2017年06月14日 11:33
  • 15.53MB
  • 下载

在QT4中处理windows消息

为了能处理某些qt无法处理的事件,或者在Qt将消息封装之前能做某些操作等等,我们可以自己处理windows事件。 处理windows事件是重写QApplication::winEventFilter(...
  • sryan
  • sryan
  • 2011年09月02日 19:18
  • 10307

Qt之进程间通信(Windows消息)

简述通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信。简述 效果 发送消息 自定义类型与接收窗体 发送数据 接收消息 设置标题 重写na...

QT 中使用 Windows API----SendMessage() 进行窗体间消息传递

概述    在处理 qt 间窗体间消息传递时,一般都是使用信号槽函数的方式来进行,只需要在发送消息窗体 emit 消息,在接受窗体响应 slot 槽函数即可,不过这一般都是在子窗体和父窗体或子控件和...

Qt之Windows键盘消息学习

对产生可显示字符的按键组合,Windows不仅给程序发送按键消息,而且还发送字符消息。这些东西,Qt是如何转换到自己的事件系统的呢?...

【Qt】Qt之进程间通信(Windows消息)【转】

简述 通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信。 简述 效果 发送消息 自定义类型与接收窗体 发送数据 接收消息 设...

windows鼠标消息响应

  • 2011年05月09日 13:33
  • 256KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:qt调用vlc响应windows消息
举报原因:
原因补充:

(最多只允许输入30个字)