VC模拟文件拖拽

为了解决海康视频播放器VSPlayer不支持命令行参数的问题,本文介绍了如何创建一个程序,通过模拟文件拖拽到播放器窗口来实现视频播放。原理是利用WM_DROPFILES消息和DROPFILES结构体,在目标进程内存中申请空间存放文件信息。代码实现中,由于使用控制台程序,运行时会有短暂的控制台窗口出现,可改为Win32程序避免。在实际应用中,偶尔会出现播放失败的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 引言

用到海康的一个视频播放器VSPlayer,不支持命令行参数,设置为默认播放器的话打开视频文件时只是启动了播放器而不会播放文件。因此每次都要先打开播放器然后选择文件,而且一旦打开新的文件播放器窗口都会再次回到屏幕中央,很不方便。但是该播放器支持文件拖拽到窗口播放,因此考虑自己写一个程序接受视频文件(设为海康视频默认程序)然后模拟文件拖拽到VSPlayer窗口并将窗口移动到之前的位置。

2 原理

模拟文件拖拽基本原理是向目标窗口发送WM_DROPFILES消息,同时提供文件拖拽相关参数(DROPFILES结构体和文件名),因此需要在目标进程的虚拟地址空间中申请内存存放拖拽相关参数。用到的主要结构体或函数如下

  1. DROPFILES结构体,定义了CF_HDROP剪贴板的格式,后面跟着一个双null-terminated的文件名列表(可能有多个文件,中间用'\0'间隔,最后双null-terminated)

    typedef struct _DROPFILES {
      DWORD pFiles;         // 结构体后紧跟的文件名的偏移量,等于结构体的大小
      POINT pt;             // 拖拽点坐标
      BOOL  fNC;            // 指示pt的坐标类型,FALSE:客户区坐标,TRUE:非客户区点的屏幕坐标
      BOOL  fWide;          // 文件字符集,FALSE:ANSI,TRUE:Unicode
    } DROPFILES, *LPDROPFILES;
  2. 进程内存操作

    函数 说明
    VirtualAllocEx 在指定进程的虚拟地址空间申请内存区域,msdn
    WriteProcessMemory 向指定进程的内存区域写数据,msdn
    VirtualFreeEx 释放VirtualAllocEx申请的内存区域,msdn

3 实现

为了调试时方便就用了控制台程序,因此每次打开时会闪现一个控制台窗口,不想弹窗的话可以改为Win32实现。完整代码如下(最终使用时偶尔会出现只打开播放器不播放视频的情况,感觉像是模拟拖拽有一定的概率失败,不知是程序的问题还是播放器的问题,Win10下测试)

#include <stdio.h>
#include <wind
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值