背景

这周末闲来无事,整理了下虚拟显示器的源码,发现有几个项目都用到了,但是使用的功能不尽相同:
(1)最简单的运用仅仅是需要显示器的拔插;
(2)稍微复杂一点的是需要设置显示器的分辨率,包括标准的分辨率,如19201080,还包括非标准的分辨率,如1120900;
(3)再复杂一点的需要设置显示器名称、刷新频率、获取虚拟显示器屏幕图像信息。
再观察我的那几个项目,都重复的导入了源码,每次发现一个bug,改了一个,另外一个忘记同步了,造成代码维护的不便,所以此次将虚拟显示器部分的代码进行提取,单独封装成一个SDK,只要项目中有用到都使用这个SDK即可。

SDK的导出函数

此次SDK,为win7虚拟显示器和win10虚拟显示器做了统一处理,导出同样的接口,也就是说用户在调用时不再需要关注当前系统是win7还是win10,初步导出函数如下:

#include <Windows.h>enum
{USB_DEVICE_ERROR_SUCC = 0,USB_DEVICE_ERROR_FAILD,USB_DEVICE_ERROR_DEV_NOT_READY,/* 虚拟显示器刚刚插入,还没准备好 */USB_DEVICE_ERROR_INVALID_PARAMS/* 传入的参数不对 */
};typedef struct _VMON_INFO
{BOOL bExist;/* 虚拟显示器是否存在 */BOOL bActive;/* 虚拟显示器是否处于激活状态 */BOOL bIndependent;/* 虚拟显示器是否独立(不和其他显示器复制)*/DISPLAYCONFIG_2DREGION  m_currentResolution;/* 当前虚拟显示器分辨率 */WCHAR szDisplayName[MAX_PATH];/* 虚拟显示器显示名称(可用于枚举分辨率列表)*/
}VMON_INFO;typedef struct _MON_IMG_DATA
{UINT width;UINT height;UINT stride;PVOID pSurface;
}MON_IMG_DATA;extern "C"
{/**    创建MonitorDevice设备,用于对设备进行操作* @return    失败返回false,成功返回true*  @remark 最后需要使用DestroyUsbDevice进行销毁*/__declspec(dllexport) HANDLE CreateMonitorDevice();/** 插入虚拟显示器*    @param handle[in]:CreateMonitorDevice返回的设备句柄*  @return    见返回错误码* @remark*/__declspec(dllexport) int PlugInMonitor(HANDLE handle);/**    设置分辨率*  @param handle[in]:CreateMonitorDevice返回的设备句柄*  @param rsl[in]:需要设置的分辨率,宽度最小值为800,高度最小值为600*    @return    见返回错误码* @remark 设置低于800*600的分辨率会返回失败*/__declspec(dllexport) int SetCustomSolution(HANDLE handle, DISPLAYCONFIG_2DREGION rsl);/**   等待虚拟显示器屏幕数据,屏幕画面有更新才返回*  @param handle[in]:CreateMonitorDevice返回的设备句柄*  @return    见返回错误码* @remark*/__declspec(dllexport) int WaitforMonitorImage(HANDLE handle, MON_IMG_DATA *imageData);/** 取消等待屏幕图片,由于WaitMonitorImage是阻塞等待的,另一个线程可以取消等待,让WaitMonitorImage返回* @param handle[in]:CreateMonitorDevice返回的设备句柄*  @return    见返回错误码* @remark*/__declspec(dllexport) int CancelWaitMonitorImage(HANDLE handle);/**   拔出虚拟显示器*    @param handle[in]:CreateMonitorDevice返回的设备句柄*  @return    见返回错误码* @remark*/__declspec(dllexport) int PlugOutMonitor(HANDLE handle);/**   销毁获取虚拟显示器信息*    @param handle[in]:CreateMonitorDevice返回的设备句柄*   &paran  pInfo[out]:返回的虚拟显示器信息* @return    见返回错误码* @remark*/__declspec(dllexport) int GetvMonitorInfo(HANDLE handle, VMON_INFO *pInfo);/**    销毁MonitorDevice设备*  @param handle[in]:CreateMonitorDevice返回的设备句柄*  @return    见返回错误码* @remark*/__declspec(dllexport) int DestroyMonitorDevice(HANDLE handle);}

测试工具

SDK写完了需要验证SDK的功能是否完备,是否存在bug,所以写了个工具进行验证。
软件做成了托盘形式,运行后会在电脑右下角生成托盘,右击弹出菜单:

插入虚拟显示器


插入虚拟显示器后,我们到高级显示设置可以看到命名为DLJVMON的显示器(显示器名字可以自定义,也可以提供接口修改)。

拔出虚拟显示器

设置标准分辨率

设置自定义分辨率

后记

其他的一些接口有时间再补充测试,由于家里只有win10电脑,win7的暂时没有展现。
后续有时间再增加一些其他接口。
如需项目合作,可加微信:changshayueluchenxi

windows虚拟显示器SDK开发和提供相关推荐

  1. 非常不错的虚拟光驱工具- Windows虚拟光驱(Daemon Tools Lite)提供下载

    DaemonToolsLite虚拟光驱软件(Daemon Tools Lite)是一款非常不错的虚拟光驱工具,支持win9x/win2k,支持ps,支持加密光盘,装完不需启动即可用.是一个先进的模拟备 ...

  2. 推荐微软Windows 8 Metro应用开发虚拟实验室

    Kevin Fan分享开发经验,记录开发点滴 推荐微软Windows 8 Metro应用开发虚拟实验室 2012-07-19 05:23 by jv9, 1940 阅读, 4 评论, 收藏, 编辑 微 ...

  3. SDK开发mp3播放器

    一.概述 mp3播放器软件设计需要硬件平台,硬件仿真器件,软件平台,软件开发底台SDK等等,做起来很麻烦. 先考虑在windows上用SDK开发MP3播放器,源代码开发完成后再向硬件平台转移,可以方便 ...

  4. Windows Mobile 6 中为开发人员提供的新功能(1)

    Windows Mobile 6 中为开发人员提供的新功能(1) 2007年06月10日 星期日 10:29 Jim Wilson,JW Hedgehog, Inc. 摘要 Windows Mobil ...

  5. Kinect for Windows SDK开发入门

    Kinect for Windows SDK开发入门(一):开发环境配置 首先来看一下Kinect设备: 1. Kinect设备 黑色的Kinect设备如下图:基座和感应器之间有一个电动的马达,通过程 ...

  6. Windows系统下多显示器模式开发

    转载:开发日记地址 http://blog.sina.com.cn/s/blog_4078ccd60100049a.html 这几天研究了一下Windows系统的多显示器模式的编程,实现了Window ...

  7. [译]Kinect for Windows SDK开发入门(八):骨骼追踪进阶 上

    前7篇文件我们介绍了Kinect SDK中各种传感器的各种基本知识,我们用实验的方式演示了这些基本对象和方法的如何使用,这些都是Kinect开发最基本的知识.了解了这些基本知识后,就可以开发出一个基于 ...

  8. 基于Windows Mobile 2003 的 Pocket PC 为开发人员提供的新功能(转)

    对于 Pocket PC 用户和开发人员来说,基于 Microsoft® Windows Mobile® 2003 的 Pocket PC 是一个非常重要的里程碑.Pocket PC 2003 基于新 ...

  9. Windows Mobile 5.0 中为开发人员提供的新功能(3)

    Windows Mobile 5.0 中为开发人员提供的新功能(3) Pocket Outlook 增强功能 Pocket Outlook 向用户和应用程序开发人员提供了易于使用的 PIM.将 Poc ...

  10. [译]Kinect for Windows SDK开发入门(二):基础知识 上

    上篇文章介绍了Kinect开发的环境配置,这篇文章和下一篇文章将介绍Kinect开发的基本知识,为深入研究Kinect for Windows SDK做好基础. 每一个Kinect应用都有一些基本元素 ...

最新文章

  1. 【转】 ubuntu12.04更新源
  2. XML DOM 解析器概述
  3. SAP HUMO VLMOVE不支持E库存发货到成本中心
  4. idea窗口下方滚动条不明显设置
  5. intellij idea 15,webstorm 最新注册破解
  6. 单例带来的线程安全问题
  7. java学习(66):局部类内方法访问
  8. CSDN博客如何调整文字的字体、大小、颜色
  9. oracle 中的日志在处理,ORACLE在存储过程中记录日志的处理包
  10. 若想学 HTML,应从何入手?
  11. php 模拟客户端访问,PHP通过伪造和模拟客户端COOKIE登陆来采集抓取远程网址
  12. 关于RAM的空间使用超过限度的时候报错
  13. 显示出eclipse文件层次
  14. 数据库死锁,导致CPU异常增长
  15. 史上最经典Java入门基础视频,没有之一!
  16. div 设置a4大小_打印A4网页大小设置
  17. ubuntu 20.04网卡驱动安装(rtl8812au)
  18. 在成都,30岁的人最焦虑
  19. “精致穷”的年轻人养出百亿小样经济
  20. 《C++语言基础》网络课程主页

热门文章

  1. SpeedFan 控制风扇转速
  2. 前端进阶(1)Web前端性能优化
  3. 平民版均线量化交易模型
  4. 干货全拿走-用Excel构建股票量化交易模型
  5. 计算机语言编程入门基础
  6. 图的存储--十字链表
  7. 车站计算机系统sc英文,城市轨道交通信号系统常见英文缩写大全(二)
  8. Java自定义生成PDF报告
  9. c语言程序设计职工信息管理系统,C语言程序设计-职工信息管理系统.doc
  10. commons-io之FileUtils