日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2023/12/10 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的暫時沒有展現。
后續有時間再增加一些其他接口。
如需項目合作,可加微信:changshayueluchenxi

總結

以上是生活随笔為你收集整理的windows虚拟显示器SDK开发和提供的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。