1 引言
用到海康的一个视频播放器VSPlayer,不支持命令行参数,设置为默认播放器的话打开视频文件时只是启动了播放器而不会播放文件。因此每次都要先打开播放器然后选择文件,而且一旦打开新的文件播放器窗口都会再次回到屏幕中央,很不方便。但是该播放器支持文件拖拽到窗口播放,因此考虑自己写一个程序接受视频文件(设为海康视频默认程序)然后模拟文件拖拽到VSPlayer窗口并将窗口移动到之前的位置。
2 原理
模拟文件拖拽基本原理是向目标窗口发送WM_DROPFILES消息,同时提供文件拖拽相关参数(DROPFILES结构体和文件名),因此需要在目标进程的虚拟地址空间中申请内存存放拖拽相关参数。用到的主要结构体或函数如下
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;
进程内存操作
函数 说明 VirtualAllocEx 在指定进程的虚拟地址空间申请内存区域,msdn WriteProcessMemory 向指定进程的内存区域写数据,msdn VirtualFreeEx 释放VirtualAllocEx申请的内存区域,msdn
3 实现
为了调试时方便就用了控制台程序,因此每次打开时会闪现一个控制台窗口,不想弹窗的话可以改为Win32实现。完整代码如下(最终使用时偶尔会出现只打开播放器不播放视频的情况,感觉像是模拟拖拽有一定的概率失败,不知是程序的问题还是播放器的问题,Win10下测试)
#include <stdio.h>
#include <wind