zenojm
10
2019-07-23 08:57:46
1
189

C# Windows10 PC 화면 밝기 조정 질문입니다.


안녕하세요 안드로이드 java개발하다가 C#으로 전향해서 고군분투하고 있는 개발자입니다.

windows 프로그래밍하는 건 학교다닐 땐 해봤지만 실무에서는 생각보다 어렵네요..


개발하다가 궁금한 것이 있어 질문드립니다.

아래는 트랙바로 조정 후, 버튼 클릭 시, 화면 밝기 조정하는 소스입니다.

노트북 사용하고 있고, 듀얼 모니터로 사용하고 있을 때는 메인 모니터만 밝기 조정이 됩니다.

소스 상으로는 _physicalMonitorArray[0]으로 밝기 조정하는 것으로 하고 있으니 그렇게 되는건 이해되는데


문제는 듀얼모니터를 사용하고 있지 않을 때, 노트북 모니터나, DID같은 windows10 PC에서 화면 밝기 조정이 안됩니다.


디버그 걸어서 값을 일일이 다 체크해봐도 다른 부분이 안보여서

현재 어디서부터 다시 체크해야할지 고민이네요


혹시 C#으로 화면 밝기 조정 조언 좀 구할 수 있을까요?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace SampleBrightness
{

    public partial class FrmBrightness : Form
    {
        [DllImport("user32.dll")]
        public static extern int FindWindow(string lpClassName, string lpWindowName);

        BrightnessController brightnessController = null;

        public FrmBrightness()
        {
            brightnessController = new BrightnessController((IntPtr)FindWindow(null, this.Text));
            InitializeComponent();
            trackBar1.Value = brightnessController.getFirstValue();
            label1.Text = brightnessController.getFirstValue().ToString() + " %";

            brightnessController.debugLog(label1.Text);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int val = trackBar1.Value;
            
            brightnessController.SetBrightness(val);
            label1.Text = val.ToString() + " %";

            brightnessController.debugLog(label1.Text);
        }
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct PHYSICAL_MONITOR
    {
        public IntPtr hPhysicalMonitor;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string szPhysicalMonitorDescription;
    }

    public class BrightnessController : IDisposable
    {
        [DllImport("user32.dll", EntryPoint = "MonitorFromWindow")]
        public static extern IntPtr MonitorFromWindow([In] IntPtr hwnd, uint dwFlags);

        [DllImport("dxva2.dll", EntryPoint = "DestroyPhysicalMonitors")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool DestroyPhysicalMonitors(uint dwPhysicalMonitorArraySize, ref PHYSICAL_MONITOR[] pPhysicalMonitorArray);

        [DllImport("dxva2.dll", EntryPoint = "GetNumberOfPhysicalMonitorsFromHMONITOR")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetNumberOfPhysicalMonitorsFromHMONITOR(IntPtr hMonitor, ref uint pdwNumberOfPhysicalMonitors);

        [DllImport("dxva2.dll", EntryPoint = "GetPhysicalMonitorsFromHMONITOR")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetPhysicalMonitorsFromHMONITOR(IntPtr hMonitor, uint dwPhysicalMonitorArraySize, [Out] PHYSICAL_MONITOR[] pPhysicalMonitorArray);

        [DllImport("dxva2.dll", EntryPoint = "GetMonitorBrightness")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetMonitorBrightness(IntPtr handle, ref uint minimumBrightness, ref uint currentBrightness, ref uint maxBrightness);

        [DllImport("dxva2.dll", EntryPoint = "SetMonitorBrightness")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetMonitorBrightness(IntPtr handle, uint newBrightness);

        private uint _physicalMonitorsCount = 0;
        private PHYSICAL_MONITOR[] _physicalMonitorArray;

        private IntPtr _firstMonitorHandle;

        private uint _minValue = 0;
        private uint _maxValue = 0;
        private uint _currentValue = 0;

        public int _firstValue = 0;

        public BrightnessController(IntPtr windowHandle)
        {
            uint dwFlags = 0u;
            IntPtr ptr = MonitorFromWindow(windowHandle, dwFlags);
            if (!GetNumberOfPhysicalMonitorsFromHMONITOR(ptr, ref _physicalMonitorsCount))
            {
                throw new Exception("Cannot get monitor count!");
            }
            _physicalMonitorArray = new PHYSICAL_MONITOR[_physicalMonitorsCount];


            debugLog(_physicalMonitorsCount.ToString());


            if (!GetPhysicalMonitorsFromHMONITOR(ptr, _physicalMonitorsCount, _physicalMonitorArray))
            {
                throw new Exception("Cannot get phisical monitor handle!");
            }
            _firstMonitorHandle = _physicalMonitorArray[0].hPhysicalMonitor;

            if (!GetMonitorBrightness(_firstMonitorHandle, ref _minValue, ref _currentValue, ref _maxValue))
            {
                
                throw new Exception("Cannot get monitor brightness!");
            } 
            else
            {
                _firstValue = (int) _currentValue;
            }

            debugLog("Min:" + ((int)_minValue).ToString() + " / Curr:" + ((int)_currentValue).ToString() + " / Max:" + ((int)_maxValue).ToString());
        }

        public int getFirstValue()
        {
            return _firstValue;
        }

        public void debugLog(string str)
        {
            Debug.WriteLine(str);
        }

        public void SetBrightness(int newValue)
        {
            newValue = Math.Min(newValue, Math.Max(0, newValue));
            _currentValue = (_maxValue - _minValue) * (uint)newValue / 100u + _minValue;
            SetMonitorBrightness(_firstMonitorHandle, _currentValue);
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (_physicalMonitorsCount > 0)
                {
                    DestroyPhysicalMonitors(_physicalMonitorsCount, ref _physicalMonitorArray);
                }
            }
        }
    }
}


0
0
  • 답변 1

  • zenojm
    10
    2019-07-23 09:03:53

    확인해보니, 듀얼모니터로 해서

    노트북이나, DID PC를 주모니터로 두고 밝기 조정이 아예 안되네요..

    방법이 있을까요?

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.