windows虚拟显示器SDK开发和提供

windows虚拟显示器SDK开发和提供背景这周末闲来无事,整理了下虚拟显示器的源码,发现有几个项目都用到了,但是使用的功能不尽相同:(1)最简单的运用仅仅是需要显示器的拔插;(2)稍微复杂一点的是需要设置显示器的分辨率,包括标准的分辨率,如19201080,还包括非标准的分辨率,如1120900;(3)再复杂一点的需要设置显示器名称、刷新频率、获取虚拟显示器屏幕图像信息。再观察我的那几个项目,都重复的导入了源码,每次发现一个…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

背景

这周末闲来无事,整理了下虚拟显示器的源码,发现有几个项目都用到了,但是使用的功能不尽相同:
(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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171789.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL8.0 – 新特性 – Descending Index

    MySQL8.0 – 新特性 – Descending Index前言在MySQL8.0之前的版本中,innodbbtree索引中的记录都是严格按照的key的顺序来存储的,但有些时候当我们需要倒序扫描时,效率就会很低。为了解决这个问题,从MySQL8.0版本开始支持在索引Key中倒序存储。你可以按照实际的sql负载来决定如何创建索引,例如你的查询中有Orderbyadesc,basc,就可以创建索引key…

    2022年10月29日
    0
  • 多态的基本知识<多态的前提是继承哟!!!!>

    多态的基本知识<多态的前提是继承哟!!!!>

    2021年5月24日
    143
  • c语言也能写植物大战僵尸吗_植物大战僵尸僵尸写的纸条

    c语言也能写植物大战僵尸吗_植物大战僵尸僵尸写的纸条不少同学都玩过《植物大战僵尸》,最近PopCap公司又带来了新版的消息,这次高兴的轮到Xbox的用户了,日前PopCap公司公布了《植物大战僵尸》XBLA版的截图,这个版本的《植物大战僵尸》引入了多人合作与对抗模式,看图就知道好玩多了又刺激多了。 详见游戏说明,游戏视频于是,我在非常强烈的好奇心和求知欲下,自己动手写了一个简易的双人

    2022年10月23日
    0
  • malloc函数的用法(超级白话版)[通俗易懂]

    malloc函数的用法(超级白话版)[通俗易懂]malloc函数的用法在这里,我不讲什么原理性的东西,我就单纯讲讲怎么用。首先malloc()函数返回的是void*类型,所以用的时候要进行强制类型转换malloc函数用完后,记得使用free()函数来释放空间,不然只分配不释放会出问题例L=(int*)malloc(sizeof(int));我们看到了先用int*进行了强制类型转换,说明L的类型为int*,⚠️如果你不进行强制类型转换,分配空间会报错sizeof(int)的意思是分配的字节数,分配和int类型一样的字节数,当然,

    2022年4月29日
    55
  • feiler包(prim算法)

    背景Weisfeiler-Lehman算法(威斯费勒-莱曼算法)是测试图同构的经典算法之一,我在这儿记录一下它的实现原理,参考文章为Weisfeiler-LehmanGraphKernels伪代码论文中的伪代码如下所示假设要测试同构的两张图为G和G`,那么在结点v的第i次迭代里,算法都分别做了四步处理:标签复合集定义、复合集排序、标签压缩和重标签。标签复合集定义如果是第一次迭代,v的标签复合集里只有一个元素,就是v的标签。如果不是第一次迭代,v的标签复合集元素就是v的..

    2022年4月10日
    61
  • 百度刷排名,刷流量,刷下拉软件【完全免费】胖虎图图-互动点击系统

    百度刷排名,刷流量,刷下拉软件【完全免费】胖虎图图-互动点击系统软件绿色免安装,打开即可使用。软件大小:1.4MB支持平台:win2000/win2003/winxp/win7/win8下载地址:http://www.phtoto.com/download/胖虎图图-互动点击.rar【2013-8-12】更新日志:修复无法停止任务的bug; 【2013-8-11】更新日志:新增支持谷歌搜索;新增支持360搜索;新增支持搜

    2022年9月27日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号