開始是一位朋友有這個需求,他給了我一個英偉達官網的開發包,名字是:R410-developer.zip(諸位可以自己到英偉達官網下載),里面提供了一些示例,包含自定義分辨率、顯示器顏色設置等,但是顯示器色彩設置的例子一致沒有跑通,而且我也沒有找到哪個參數是可以設置數字振動值的,所以憋屈了很多天。但直到看到了一個 AHK 版本實現的設置工具通過代碼發現,其實實現方法是通過 nvapi.dll 動態庫導出的一個查詢函數地址的方法,將指定接口導出來執行具體業務。在加上在 github 上搜索的各類示例,最終實現了這個功能,下面詳細介紹實現步驟。
設置數字振動數值需要先通過 nvapi.dll
導出的 NvAPI_QueryInterface_t 方法獲取 NvAPI_Initialize_t
方法來初始化 NvAPI。然后依次獲取顯示器句柄、獲取當前顯示器數字振動值、設置數字振動值的函數地址,他們的聲明分別對應如下:
// 查詢在 nvapi.dll 中函數的地址方法函數聲明typedef int*(*NvAPI_QueryInterface_t)(unsigned int offset);// 初始化 NvAPI 的方法typedef int(*NvAPI_Initialize_t)();// 根據 ID 枚舉顯示器句柄的方法typedef int(*NvAPI_EnumNvidiaDisplayHandle_t)(int thisEnum, int* pNvDispHandle);// 獲取數字振動當前值typedef int(*NvAPI_GetDVCInfoEx_t)(int hNvDisplay, int outputId, NV_DISPLAY_DVC_INFO_EX* pDVCInfo);// 設置數字振動值typedef int(*NvAPI_SetDVCLevelEx_t)(int hNvDisplay, int outputId, NV_DISPLAY_DVC_INFO_EX* pDVCInfo);
其中設置和獲取數字振動值需要一個結構體 NV_DISPLAY_DVC_INFO_EX
,其聲明如下:
typedef struct{ unsigned int version; // 結構體版本 int currentLevel; // 當前級別 int minLevel; // 最低級別 int maxLevel; // 最高級別 int defaultLevel; // 默認級別} NV_DISPLAY_DVC_INFO_EX, *PNV_DISPLAY_DVC_INFO_EX;
我們首先 Load nvapi.dll 然后得到 nvapi_QueryInterface
方法的地址,然后通過 nvapi_QueryInterface
方法查詢另外一些接口的地址。如下所示:
bool NvController::Initialize(){ hModule = LoadLibraryW(TEXT("nvapi.dll")); if (hModule == nullptr) { std::cerr << "Failed to load nvapi.dll." << std::endl; return false; } NvAPI_QueryInterface = (NvAPI_QueryInterface_t)GetProcAddress(hModule, "nvapi_QueryInterface"); NvAPI_Initialize = (NvAPI_Initialize_t)(*NvAPI_QueryInterface)(_NvAPI_Initialize); NvAPI_EnumNvidiaDisplayHandle = (NvAPI_EnumNvidiaDisplayHandle_t)(*NvAPI_QueryInterface)(_NvAPI_EnumNvidiaDisplayHandle); NvAPI_GetDVCInfoEx = (NvAPI_GetDVCInfoEx_t)(*NvAPI_QueryInterface)(_NvAPI_GetDVCInfoEx); NvAPI_SetDVCLevelEx = (NvAPI_SetDVCLevelEx_t)(*NvAPI_QueryInterface)(_NvAPI_SetDVCLevelEx); _NvAPI_Status status = (_NvAPI_Status)(*NvAPI_Initialize)(); if (status != NVAPI_OK) { std::cerr << "NvAPI initialization failed." << std::endl; return false; } return true;}
其中以下劃線開頭的枚舉名字是每個函數在 dll 中的對應地址,這些是寫死的,如下所示:
enum NvAPIs{ _NvAPI_Initialize = 0x150E828, _NvAPI_EnumNvidiaDisplayHandle = 0x9ABDD40D, _NvAPI_GetAssociatedNvidiaDisplayName = 0x22A78B05, _NvAPI_GetDVCInfoEx = 0x0E45002D, _NvAPI_SetDVCLevelEx = 0x4A82C2B1};
你可能會問,你怎么知道這些函數地址的?其實我也是搜索到的,也看了以前 NvAPI 老版本提供的代碼,可以搜索到相關痕跡。點擊查看此文件里面有完整的所有函數地址。
得到了各個函數的地址,我們就可以設置數字振動值了,代碼如下:
bool NvController::SetDVCLevelEx(int nDisp, int level){ int NvDispHandle; if (EnumNvidiaDisplayHandle(nDisp, &NvDispHandle) != 0) { NV_DISPLAY_DVC_INFO_EX oldInfo = GetDvcInfoEx(nDisp); NV_DISPLAY_DVC_INFO_EX info; info.version = oldInfo.version; info.currentLevel = level; info.minLevel = oldInfo.minLevel; info.maxLevel = oldInfo.maxLevel; info.defaultLevel = oldInfo.defaultLevel; _NvAPI_Status status = (_NvAPI_Status)(*NvAPI_SetDVCLevelEx)(NvDispHandle, 0, &info); if (status != NVAPI_OK) { return false; } return true; } return false;}
我們首先獲得用戶傳入的顯示器編號所對應的句柄,然后根據這個句柄獲取當前數字振動的數值,然后修改其 currentLevel
成員數值來設置數字振動效果。這樣處理后就可以使用了。代碼參考地址:https://github.com/nmgwddj/nvapi-example
Post Views: 5
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
手機上有按鍵精靈嗎,怎么下載?三星手機下載軟件為您提供以下方法。請參考:1.通過手機中的app store搜索需要的軟件并下載安裝。2.通過手機瀏覽器(自己的瀏覽器,下載的安裝包保存在我的文件-下載文件夾)搜索需要的軟件下載和安裝。3.通過第三方助手軟件下載并安裝所需程序。4.通過電腦下載APK格式的安裝包,然后傳輸到手機上進行安裝。新天龍八部按鍵精靈能用嗎?可以使用。新《天龍八部》不禁止使用腳...
1922年汕頭臺風的介紹?1922年臺風汕頭是1922年太平洋臺風季的熱帶氣旋。這場風暴于7月27日形成,8月3日消散,持續了一周。這次臺風對菲律賓和造成了損害,特別是汕頭,造成了嚴重的生命和經濟財產損失,因此被氣象局列為20世紀十大氣象災害。汕頭遭遇過的臺風有哪些?1922年8月2日,太平洋臺風在廣東汕頭登陸。晚上9點,臺風登陸,撼山撼山,樹連根拔起,屋毀人亡。3日凌晨3時,風力加大到12級,潮...
沈陽廣全中學報名需要什么條件?沈陽市廣泉中學只要有學籍和初中都可以報名。廣泉沖蕩是一所民辦高中,省級高級示范中學。這個學校的軟硬件條件不錯,但是學費不低。廣全中學高中部在沈陽排名?高級中學在沈陽排名靠前,廣泉中學也是非常有名的民辦中學。它的教學質量很好,高考升學率很高,所以在沈陽的排名是名列前茅的。沈陽廣泉中學建立時間?沈陽市廣泉中學創建于1993年,是沈陽市一所歷史悠久的民辦中學,也是沈陽市升學...