win11下显示器亮度频繁被重置为100

现象:

  1 win10升级win11后设置亮度

  

 

 

 

  2 在重启、注销重登录,、睡眠唤醒,、休眠唤醒、接入或拔出外置显示器等操作后

  3 虽然操作系统显示的亮度设置未变, 但是人眼实际物理上看到的显示器亮度是100

  

 

  4 手工拖动亮度滑块后, 实际亮度与亮度滑块的值同步

分析:

  网上看到一般认为是显卡驱动过时或者是安装损坏

 

常规解决方式

  针对显卡驱动安装损坏

    1 参照intel官网操作卸载旧的显卡驱动后重新安装最新显卡驱动

    2 如1未解决则重装操作系统, 重新安装驱动

  针对显卡驱动不兼容

     回退旧版操作系统

 

不能重装或回退的临时解决方式:

  概述:

   观察亮度被重置时的事件, 在事件发生后通过计划任务或者程序调用命令将亮度再调整回期望的值

  详述

   1 下面脚本可以调整亮度, 其中的25是准备设置的亮度值, 26是临时值, ping是一个简单命令为了延时, 模拟亮度调整滑块滑动的效果, 将脚本另存为brightness.bat并放到C:\Zip\brightness目录, 如果没有该目录可以创建目录

      Powershell -Command "& {(Get-WmiObject -Namespace root/WMI -Class WmiMonitorBrightnessMethods).WmiSetBrightness(1, 26)}"
      ping 127.0.0.1 -n 1
      Powershell -Command "& {(Get-WmiObject -Namespace root/WMI -Class WmiMonitorBrightnessMethods).WmiSetBrightness(1, 25)}"

   2 下面脚本可以隐藏bat启动时的窗口, 将脚本另存为brightness.vbs并存放到C:\Zip\brightness目录
      set ws =WScript.CreateObject("WScript.Shell")
      ws.Run "C:\Zip\brightness\brightness.bat",0

   3  创建执行brightness.vbs的计划任务, 触发器设置为启动时、登录时、连接到用户会话时、从工作会话断开时、工作站锁定时、工作站解锁时、发生事件

    

 

 

     

 

 

     

   4 编辑程序监听外接显示器的插拔, 编译后保存为my_display_listener.exe, 并存放到C:\Zip\brightness, 下面的代码会监听显示器的数量, 当显示器数量发生变化意味着插/拔了, 程序执行上文中编辑的brightness.vbs脚本调整亮度

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// display.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
 
#include "pch.h"
#include "framework.h"
#include "display.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
 
// 唯一的应用程序对象
 
CWinApp theApp;
 
using namespace std;
 
BOOL CALLBACK MyInfoEnumProc(
    HMONITOR hMonitor,
    HDC hdcMonitor,
    LPRECT lprcMonitor,
    LPARAM dwData
)
{
    //打印显示设备信息(显卡等)
    MONITORINFOEX mi;
    ZeroMemory(&mi, sizeof(mi));
    mi.cbSize = sizeof(mi);
    GetMonitorInfo(hMonitor, &mi);
    wprintf(L"DisplayDevice: %s\n", mi.szDevice);
    return TRUE;
}
 
int main()
{
    CreateMutex(NULL, FALSE, L"my_display_listener");
    if (GetLastError() == ERROR_ALREADY_EXISTS)
        return 1;
    int numMonitor;
    int lastNumMonitor=0;
    int run = 0;
    while (1)
    {
        printf("*********************%d****************\n", run);
        run++;
        if (run > INT_MAX-1) {
            run = 0;
        }
        printf("\n\n\EnumDisplayDevices\n\n\n");
        DISPLAY_DEVICE dd;
        ZeroMemory(&dd, sizeof(dd));
        dd.cb = sizeof(dd);
        for (int i = 0; EnumDisplayDevices(NULL, i, &dd, 0); i++)
        {
            //EnumDisplayDevices(NULL, i, &dd, 0);
            wprintf(L"\n\nDevice %d:", i);
            wprintf(L"\n    DeviceName:   '%s'", dd.DeviceName);
            wprintf(L"\n    DeviceString: '%s'", dd.DeviceString);
            wprintf(L"\n    StateFlags:   %s%s%s%s",
                ((dd.StateFlags &
                    DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) ?
                    L"desktop " : L""),
                ((dd.StateFlags &
                    DISPLAY_DEVICE_PRIMARY_DEVICE) ?
                    L"primary " : L""),
                ((dd.StateFlags & DISPLAY_DEVICE_VGA_COMPATIBLE) ?
                    L"vga " : L""),
                ((dd.StateFlags &
                    DISPLAY_DEVICE_MULTI_DRIVER) ?
                    L"multi " : L""),
                ((dd.StateFlags &
                    DISPLAY_DEVICE_MIRRORING_DRIVER) ?
                    L"mirror " : L""));
 
            // Get more info about the device
            DISPLAY_DEVICE dd2;
            ZeroMemory(&dd2, sizeof(dd2));
            dd2.cb = sizeof(dd2);
            EnumDisplayDevices(dd.DeviceName, 0, &dd2, 0);
            wprintf(L"\n    DeviceID: '%s'", dd2.DeviceID);
            wprintf(L"\n    Monitor Name: '%s'", dd2.DeviceString);
        }
        printf("\n\n\nEnumDisplayMonitors\n\n\n");
        EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, 0);
 
        numMonitor = GetSystemMetrics(SM_CMONITORS);
        if (numMonitor != lastNumMonitor) {
            printf("显示器数量由%d变为了%d\n", lastNumMonitor,numMonitor);
            system("C:/Zip/brightness/brightness.vbs");
        }
        lastNumMonitor = numMonitor;
        printf("GetSystemMetrics: %d\n", numMonitor);
        Sleep(1*1000);
    }
}

  5 将下面脚本另存为my_display_listener.vbs并存放到C:\Zip\brightness

    set ws =WScript.CreateObject("WScript.Shell")
    ws.Run "C:\Zip\brightness\my_display_listener.exe",0

  6 将my_display_listener.vbs添加到开机启动的计划任务

 

参考:

  https://blog.csdn.net/shallen320/article/details/45070477?utm_medium=distribute.wap_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-1-45070477-null-null.wap_agg_so&utm_term=%E6%8F%92%E6%8B%94%E6%98%BE%E7%A4%BA%E5%99%A8%E4%BA%8B%E4%BB%B6

  

posted @   为了生活更好  阅读(449)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示