windows虛擬顯示器SDK開發和提供

背景

這週末閒來無事,整理了下虛擬顯示器的源碼,發現有幾個項目都用到了,但是使用的功能不盡相同:
(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的暫時沒有展現。
後續有時間再增加一些其他接口。
如需項目合作,可加微信:Magic-TP-Group

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章