Giter Site home page Giter Site logo

emoacht / monitorian Goto Github PK

View Code? Open in Web Editor NEW
3.1K 26.0 152.0 8.28 MB

A Windows desktop tool to adjust the brightness of multiple monitors with ease

Home Page: https://www.microsoft.com/store/apps/9nw33j738bl0

License: MIT License

C# 100.00%
monitor display brightness luminance ddc-ci

monitorian's Introduction

Monitorian

Monitorian is a Windows desktop tool to adjust the brightness of multiple monitors with ease.

Screenshot
(DPI: 200%)

The user can change the brightness of monitors, including external ones, either individually or in unison. For the system with an ambient light sensor, the adjusted brightness can be shown along with configured one.

Screenshot
(DPI: 100%)

In addition, the user can change the adjustable range of brightness and contrast for each monitor seamlessly.

Screenshot  Screenshot

Usage.mp4

Additional languages:

  • Arabic (ar) by @MohammadShughri
  • Catalan (ca) by @ericmp33
  • German (de) by @uDEV2019
  • Spanish (es) by @josemirm and @ericmp33
  • French (fr) by @AlexZeGamer and @Rikiiiiiii
  • Greek (el-GR) by @NickMihal
  • Italian (it) by @GhostyJade
  • Japanese (ja-JP) by @emoacht
  • Korean (ko-KR) by @VenusGirl
  • Dutch (nl-NL) by @JordyEGNL
  • Polish (pl-PL) by @Daxxxis and @FakeMichau
  • Portuguese (pt-BR) by @guilhermgonzaga
  • Romanian (ro) by @calini
  • Russian (ru-RU) by @SigmaTel71 and @San4es
  • Turkish (tr-TR) by @webbudesign
  • Ukrainian (uk-UA) by @kaplun07
  • Simplified Chinese (zh-Hans) by @ComMouse, @zhujunsan, @XMuli, @FISHandCHEAP and @FrzMtrsprt
  • Traditional Chinese (zh-Hant) by @toto6038 and @XMuli

Requirements

  • Windows 7 or newer
  • .NET Framework 4.8
  • An external monitor must be DDC/CI enabled. OSD

Download

Install/Uninstall

If you wish to place executable files on your own, you can extract them from installer file (.msi) by the following command:

msiexec /a [source msi file path] targetdir=[destination folder path (absolute path)] /qn

In such case, please note the following:

  • The settings file (and other file) will be created at: [system drive]\Users\[user name]\AppData\Local\Monitorian\
  • When you check [Start on sign in], a registry value will be added to: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

Remarks

  • The monitor name shown in main window can be changed to distinguish monitors easily. To change the name, press and hold it until it turns to be editable.
  • To adjust the brightness by a touchpad, place two fingers on it and swipe horizontally. The touchpad must be a precision touchpad.
  • The number of monitors shown at a time is up to 4.
  • In case an external monitor is not shown, read detection of external monitors.
  • This app identifies each monitor by an unique identifier given by the OS. Even with the same PC and monitor, this identifier may vary depending on the type of connection (e.g. USB-C DisplayPort Alt mode) or the selection of connectors of the same type. Consequently, if a monitor is reconnected to the different connector, it may not be regarded as the same monitor and some functions may not work as expected.

Add-on Features

Add-on features are available for Microsoft Store version on a subscription basis.

Hot keys & Shortcut keys

Screenshot

All hot keys for brightness can be switched to contrast by To contrast hot key. It can be switched back to brightness by To brightness hot key.

Command-line options

You can use command-line options to get/set the brightness or contrast.

Actions Options
Get brightness of a monitor. /get
Get brightness of a specified monitor. /get [Device Instance ID]
Get brightness of all monitors. /get all
Set brightness of a monitor. /set [Brightness]
Set brightness of a specified monitor. /set [Device Instance ID] [Brightness]
Set brightness of all monitors. /set all [Brightness]

The device instance ID is an unique identifier given by the OS to each monitor. It must be enclosed in quotes.

You can switch to contrast by inserting contrast after /get or /set (e.g. /get contrast all).

If this app is called with /get or /set, it will return

[Device Instance ID] [Monitor name] [Brightness] B

'B' at the end indicates brightness. In addition, '*' will be added in the case of a selected monitor.

If this app is called with /get contrast or /set contrast, it will return

[Device Instance ID] [Monitor name] [Contrast] C

'C' at the end indicates contrast. If contrast is not supported by a monitor, '-' will be shown instead.

The brightness or contrast ranges from 0 to 100%. When you use /set option, it can be specified with the number itself (e.g. 20), increase (e.g. +10) or decrease (e.g. -10).

The options can be executed consecutively (e.g. monitorian /set 20 /set contrast 40).

You can call this app by its name Monitorian in command prompt or bat file. From Task Scheduler, it can be performed by the path to its alias %LOCALAPPDATA%\Microsoft\WindowsApps\Monitorian.exe. For example, to increase brightness of all monitors by 30%, the Action will be the following:

Task Scheduler

The code for add-on features is not included in this repository.

Detection of external monitors

This app checks if each external monitor is controllable through DDC/CI and shows only controllable ones.

For this purpose, this app requests a monitor to send its capabilities information through DDC/CI and checks if it includes the capabilities to get/set the brightness. If capabilities information is not received or these capabilities are not included, such monitor will be regarded as not controllable through DDC/CI.

This function has been tested and worked well in most cases. Therefore, if a monitor is not shown, it is most likely caused by hardware-oriented reasons that cannot be solved by this app. Such reasons include:

  1. The monitor model does not support DDC/CI.

  2. The monitor's DDC/CI setting is OFF. You may need to change the setting by OSD menu.

  3. The monitor's DDC/CI function is weird. Some monitors are found not to return correct capabilities information.

  4. The PC's connector does not support DDC/CI.

  5. The cable, converter, or docking station which connects the PC and the monitor is not compatible with DDC/CI. Thunderbolt/USB-C cables are generally compatible but converters aren't. Surface Dock and Surface Dock 2 are known to be compatible.

  6. The monitor or the PC have issues including contact failure in connector. This is particularly the case for old monitors.

If you think it is worth to report, read reporting and then create an issue with logs and other relevant information.

Development

This app is a WPF app developed and tested with Surface Pro series.

Reporting

The controllability of an external monitor depends on whether the monitor successfully responds to DDC/CI commands. Even if a monitor is expected to be DDC/CI compatible, it may fail to respond typically when the system starts or resumes.

In any case, reporting on the controllability of a monitor MUST include probe.log and operation.log described below. The logs will be the starting point to look into the issue.

Probe

  • You can check the compatibility of your monitor by probe.log. It will include raw information on monitors, including capabilities through DDC/CI, from various APIs that are used to find accessible monitors. To get this log, tap Probe into monitors in the hidden menu described below.
  • To open the hidden menu, click app title at the top of menu window 3 times.

Rescan

  • As part of testing, you can manually trigger to rescan monitors via Rescan monitors in the hidden menu. A system sound will be played when completed.

Operations

  • As part of testing, you can set this app to record operations to scan monitors and reflect their states. To enable the recording, check Make operation log in the hidden menu. After some information is recorded, you will be able to copy operation.log by Copy operation log.
  • If you notice an issue, enable the recording and then wait until the issue happens. When you notice the issue again, copy this log and check the information including the change before and after the issue.

Command-line arguments

  • As part of testing, you can store persistent arguments in Command-line arguments in the hidden menu. They will be tested along with current arguments when this app starts.
  • For example, if you want this app to always use English language (default), set /lang en in this box.

Exceptions

  • If anything unexpected happens, exception.log will be saved. It will be useful source of information when looking into an issue.

Setup

  1. Install Visual Studio.
  2. In Visual Studio Installer, go to the Individual components tab and make sure the following components are checked and installed. The version must match the corresponding field of project (.csproj) file of each project.
Components Fields
.NET Framework 4.8 SDK
.NET Framework 4.8 targeting pack
TargetFrameworkVersion
Windows 10 SDK (10.0.19041.0) TargetPlatformVersion
  1. Load the solution by specifying /Source/Monitorian.sln. Then go to the solution explorer and right click the solution name and execute Restore NuGet Packages.
  2. To open installer project, install WiX Toolset Build Tools and WiX Toolset Visual Studio Extension.

Globalization

An alternative language can be shown by adding a Resources (.resx) file into /Source/Monitorian.Core/Properties folder. Each Resources file stores name/value pairs for a specific language and will be selected automatically depending on the user's environment.

  • The file name must be in Resources.[language-culture].resx format.
  • The name of a name/value pair must correspond to that in the default Resources.resx file to override it.

Reference

History

Ver 4.6 2023-12-8

  • Modify app icon
  • Add Greek (el-GR) language. Thanks to @NickMihal!

Ver 4.5 2023-9-29

  • Modify behaviors and so on

Ver 4.4 2023-6-20

  • Fix bugs and so on

Ver 4.3 2023-4-21

  • Fix window position on Windows 11 Build 22621

Ver 4.2 2023-3-21

  • Change function to change in unison
  • Supplement French (fr) language. Thanks to @Rikiiiiiii!

Ver 4.1 2023-3-13

  • Improve internal code
  • Supplement Ukrainian (uk-UA) language. Thanks to @kaplun07!
  • Supplement Russian (ru-RU) language. Thanks to @San4es!

Ver 4.0 2022-12-31

  • Modify UI
  • Add Ukrainian (uk-UA) language. Thanks to @kaplun07!

Ver 3.15 2022-12-4

  • Fix touchpad swipe
  • Supplement Simplified Chinese (zh-Hans) language. Thanks to @FrzMtrsprt!

Ver 3.14 2022-10-23

  • Make change of monitors arrangement reflected immediately

Ver 3.13 2022-8-29

  • Shorten scan time when multiple external monitors exist
  • Supplement German (de) language. Thanks to @uDEV2019!

Ver 3.12 2022-7-4

  • Enable mouse horizontal wheel to change brightness concurrently (except that in unison)

Ver 3.11 2022-6-2

  • Enable to use accent color for brightness
  • Supplement Korean (ko-KR) language. Thanks to @VenusGirl!
  • Fix error message for unreachable monitor

Ver 3.10 2022-4-12

  • Redesign small slider
  • Add Catalan (ca) language. Thanks to @ericmp33!
  • Supplement Spanish (es) language. Thanks to @ericmp33!
  • Improve Simplified Chinese (zh-Hans) language. Thanks to @FISHandCHEAP!
  • Supplement Traditional Chinese (zh-Hant) language. Thanks to @XMuli!

Ver 3.9 2022-1-20

  • Add Portuguese (pt-BR) language. Thanks to @guilhermgonzaga!
  • Supplement Simplified Chinese (zh-Hans) language. Thanks to @XMuli!
  • Fix Dutch (nl-NL) language. Thanks to @JordyEGNL!

Ver 3.8 2021-12-18

  • Add Romanian (ro) language. Thanks to @calini!

Ver 3.7 2021-12-3

  • Fix issue of combination of moving in unison and deferring change
  • Modify DPI awareness of the icon

Ver 3.6 2021-9-30

  • Fix count for scan process
  • Add Italian (it) language. Thanks to @GhostyJade!

Ver 3.5 2021-9-9

  • Make rounded corners default on Windows 11
  • Add Traditional Chinese (zh-Hant) language. Thanks to @toto6038!

Ver 3.4 2021-8-30

  • Add Dutch (nl-NL) language. Thanks to @JordyEGNL!
  • Supplement Simplified Chinese (zh-Hans) language. Thanks to @zhujunsan!

Ver 3.3 2021-8-20

  • Add Arabic (ar) language. Thanks to @MohammadShughri!

Ver 3.2 2021-8-9

  • Supplement German (de) language. Thanks to @uDEV2019!

Ver 3.1 2021-8-4

  • Supplement Polish (pl-PL) language. Thanks to @FakeMichau!
  • Add Turkish (tr-TR) language. Thanks to @webbudesign!
  • Supplement Russian (ru-RU) language. Thanks to @SigmaTel71!
  • Add Spanish (es) language. Thanks to @josemirm!

Ver 3.0 2021-7-1

  • Change UI

Ver 2.19 2021-6-16

  • Enable to adjust brightness by precision touchpad

Ver 2.18 2021-5-23

  • Add German (de) language. Thanks to @uDEV2019!

Ver 2.17 2021-5-19

  • Add French (fr) language. Thanks to @AlexZeGamer!

Ver 2.16 2021-4-11

  • Add Korean (ko-KR) language. Thanks to @VenusGirl!

Ver 2.14 2021-3-26

  • Improve internal processes

Ver 2.13 2021-2-13

  • Improve internal process

Ver 2.11 2021-1-26

  • Add Russian (ru-RU) language. Thanks to @SigmaTel71!
  • Add Polish (pl-PL) language. Thanks to @Daxxxis!
  • Add Simplified Chinese (zh-Hans) language. Thanks to @ComMouse!

Ver 2.9 2020-12-22

  • Improve codes

Ver 2.8 2020-11-23

  • Adjust mouse wheel roll

Ver 2.7 2020-10-30

  • Enable to change adjustable range
  • Adjust scan process
  • Add get/set brightness test to probe

Ver 2.6 2020-8-10

  • Enable to defer update of brightness

Ver 2.5 2020-8-1

  • Fix issue on empty description

Ver 2.4 2019-12-30

  • Improve scan process

Ver 2.3 2019-11-28

  • Change scan process

Ver 2.2 2019-11-18

  • Change setting to show adjusted brightness by ambient light enabled as default
  • Fix bugs

Ver 2.1 2019-11-6

  • Change location to show when the icon is in overflow area
  • Change behavior when sliders are moving in unison
  • Fix bugs

Ver 2.0 2019-8-6

  • Enable operation by arrow keys
  • Redesign slider

Ver 1.12 2019-3-9

  • Modify to handle raw brightnesses correctly when raw minimum and maximum brightnesses are not standard values. Thanks to @reflecat!
  • Change target framework to .NET Framework 4.7.2

Ver 1.11 2019-2-7

  • Further suppress an exception

Ver 1.10 2019-2-3

  • Change to enable transparency and blur effects only when transparency effects of OS is on

Ver 1.9 2018-12-5

  • Change scan timings after resume

Ver 1.8 2018-11-24

  • Supplement generic monitor name with connection type

Ver 1.7 2018-8-22

  • Improved finding monitor name for Windows 10 April 2018 Update (1803)

Ver 1.6 2018-5-25

  • Extended function to control DDC/CI connected monitor
  • Modified function to enable moving together

Ver 1.5 2018-2-12

  • Improved handling of uncontrollable monitor

Ver 1.4 2018-1-17

  • Modified handling of monitor names

Ver 1.2 2017-10-12

  • Added control by mouse wheel
  • Added function to show adjusted brightness

Ver 1.0 2017-2-22

  • Initial release

License

  • MIT License

Libraries

Developer

  • emoacht (emotom[atmark]pobox.com)

monitorian's People

Contributors

909101 avatar alexzegamer avatar calini avatar commouse avatar daxxxis avatar ejain avatar emoacht avatar ericmp33 avatar fakemichau avatar frzmtrsprt avatar ghostyjade avatar guilhermgonzaga avatar jordyegnl avatar josemirm avatar kaplun07 avatar mithilesh123632 avatar mohammadshughri avatar nickmihal avatar p1ho avatar reflecat avatar riki7745 avatar san4es avatar sigmatel71 avatar toto6038 avatar udev2019 avatar venusgirl avatar webbudesign avatar xmuli avatar zhujunsan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

monitorian's Issues

Command line interface

Being able to launch the app via command line using arguments could be useful for hooking it with hotkey utilities. For example, using argument 1 10 could turn the brightness of the first monitor up by 10 and 2 -10 would turn the brightness of the second monitor down by 10, etc.

Startup error on a fresh Windows install

I've been using Monitorian for a few month without any problems (great work by the way :) ) but today I reinstalled Windows and the app crashes at startup with this stack trace.

Do you know why?

[Date: 2/26/2020 6:53:40 PM Ver: 2.4.0.0]
System.Runtime.InteropServices.COMException: Creating an instance of the COM component with CLSID {77A1C827-FCD2-4689-8915-9D613CC5FA3E} from the IClassFactory failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). HResult: -2147221164 ErrorCode: -2147221164
   at Monitorian.Core.Models.Monitor.LightSensor.SensorExists(Guid sensorTypeGuid)
   at Monitorian.Core.Models.Monitor.LightSensor.<>c.<.cctor>b__13_0()
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.LazyInitValue()
   at System.Lazy`1.get_Value()
   at Monitorian.Core.Models.Monitor.PowerManagement.get_CanAdaptiveBrightnessEnabled()
   at Monitorian.Core.Models.Monitor.PowerManagement.GetOnPowerSettingChanged()
   at Monitorian.Core.AppControllerCore.<InitiateAsync>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Monitorian.App.<OnStartup>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__6_0(Object state)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at Monitorian.App.Main()

All monitors show up as "Generic PnP Monitor"

Hi,
All my monitors are showing up as "Generic PnP Monitor", which makes it difficult to tell them apart.
This is what it looks like:
image

I can think of a few ways to improve this:

  1. Show the display number next to the description.
  2. Show whether the display is "primary" or "secondary".
  3. There's a new API available in Windows 10 version 1803 that promises to "get a friendly name for the device suitable for display to a user." I have experimented with integrating this API, and the result looks like this:
    image
    (Here is the commit)
    Obviously, this breaks compatibility with older Windows versions, and I don't know how to work around that, as I'm new to .NET and UWP programming. Maybe use it only on the Microsoft Store version?

Thank you for making this tool, it works great!

Regards,
John

[Bug] Main Window appears behind notification overflow area

Hello, I found that if you have the tray icon hidden by default, and you try to access it, the pop up will be below the notification overflow area. I think it's better if its position is adaptive to where it is, and be positioned above the overflow area.

image

Edit: alternatively, since the design looks like a native Window tray icon like wifi, maybe the best fix is to simply close the notification overflow area on click, if that's possible.

Edit 2: played around, The notification overflow area isn't actually closed when icons are clicked on.
The difference is with the window that shows up from left clicking any icon.
Native window apps's window will automatically appear over the overflow area, while the rest of apps I have running don't. Will investigate if the Monitorian Window can be brought to the foreground even more.


Windows native tray icon


Onenote

Feature Request: Keyboard shortcut

Hi, in my HP Probook fn+brightness keys are not working and I want to use Monitorian as a substitute for that can u please add a feature such that using keyboard shortcut we can control screen brightness...Some thing like control+n for screen brightness up and control+m for brightness down
percentage wise....

Would be very handy because for me everytime i have to right click on desktop and open display settings to change brightness or I have to click monitorian for slider to show up and then change...

BenQ XL2730Z monitor not detected

My setup is as follows:

2 x Dell U2151h monitors (identified in app - called 'Generic PnP Monitor')
1 x BenQ XL2730Z monitor (missing from app)

DDC/CI is enabled on the BenQ.

GPU is GTX 980, driver version 397.64.

OS is Windows 7 Professional.

Using Monitorian 1.5.1 standalone executable.

Can happily provide more information if needed. Thanks!

UWP project

There is a windows store version of Monitorian, but the repo does not contain any uwp projects. Can you please provide info how the uwp package was created?

PS: Monitorian is the only tool I use everyday yet is not widely popular. It really should be. I could not find any other tool that controlled both WMI and DDC monitors with a really simple UI as well. Thanks for your awesome work!

Is it possible to add a Button to rotate the monitor?

I have a Dell U-Series monitor and sometime I need to rotate it to assist me in programming or watch video. Use Windows Setting is somewhat annoying.

Is it possible to add a Button to rotate the monitor?

I love this app. It's toooooo convenient to set brightness.

Allow decreasing of monitor brightness using percentage button

Hi Dev,

This is actually a feature request than an issue but I'd like to propose following:

Currently, if user clicks the button where screen brightness percentage is shown with LMB, the brightness is increased by 10%. It would be nice to have a counteraction for this e.g. that the brightness would be decreased by the same amount when clicking the button with RMB.

image

Thank you for your consideration!

Best regards,
Kaedin

The app crashes when I connect to the third screen.

[Date: 2018/10/21 9:38:32 Sender: System.Windows.Threading.Dispatcher]
System.IndexOutOfRangeException: 索引超出了数组界限。
在 System.Management.ManagementObjectCollection.ManagementObjectEnumerator.get_Current()
在 Monitorian.Models.Monitor.MSMonitor.d__2.MoveNext()
在 Monitorian.Models.Monitor.MonitorManager.d__3.MoveNext()
在 Monitorian.MainController.<>c__DisplayClass33_0.<b__0>d.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Monitorian.MainController.d__33.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Monitorian.MainController.d__18.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Monitorian.App.d__2.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.b__6_0(Object state)
在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
在 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

[Date: 2018/10/21 9:38:47 Sender: 名称:monitorian.exe
无上下文策略。
]
System.IndexOutOfRangeException: 索引超出了数组界限。
在 System.Management.ManagementObjectCollection.ManagementObjectEnumerator.get_Current()
在 Monitorian.Models.Monitor.MSMonitor.d__2.MoveNext()
在 Monitorian.Models.Monitor.MonitorManager.d__3.MoveNext()
在 Monitorian.MainController.<>c__DisplayClass33_0.<b__0>d.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Monitorian.MainController.d__33.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Monitorian.MainController.d__18.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Monitorian.App.d__2.MoveNext()
--- 引发异常的上一位置中堆栈跟踪的末尾 ---
在 System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.b__6_0(Object state)
在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
在 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
在 System.Windows.Threading.DispatcherOperation.InvokeImpl()
在 System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
在 MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Windows.Threading.DispatcherOperation.Invoke()
在 System.Windows.Threading.Dispatcher.ProcessQueue()
在 System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
在 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
在 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
在 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
在 System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
在 MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
在 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
在 System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
在 System.Windows.Application.RunDispatcher(Object ignore)
在 System.Windows.Application.RunInternal(Window window)
在 System.Windows.Application.Run(Window window)
在 Monitorian.App.Main()

Suddenly monitor is no longer controllable

Hi everyone, I'm experiencing a weird behaviour of Monitorian.
I have been using this application (version 2.4.0.0) for months and everything was ok but since yesterday it tells me that my HP27f monitor is not controllable. I've closed the app, restarted PC, take off and on monitor cables, unistalled and reinstalled the app but nothing worked.
How can I solve this issue? Thanks

Add 'Detect display button'

Awesome software, love it.

I have moved across from the similar, but not quite as good app Win10_BrightnessSlider. In that app there is a menu item 'Detect displays' which must poll connected monitors for DDC etc. This is useful because if I use a KVM for a while, then switch back I lose the second monitor. If I close Monitorian and then restart it detects it fine.

I guess an even better way would be to add a poll DDC command to the CLI, then install a task schedule to run at station unlock to poll again as the first thing you do when you switch KVM is unlock the device.

Small additional point--black icon for when windows is in light mode!

Even smaller additional point--provide an alternative to subscription! Happy to pay for a year of the licence in one go, but I don't want to have to remember to cancel it if I stop using your software.

Otherwise, good software, almost great!

Controversial device support (Dell U2412HM)

Hi, @emoacht
Your tool looks very promising, but unfortunately it does not support Dell U2412HM. According to Dell official website that's true, U2412HM does not support DDC/CI. But I have setting in "Other Settings" section named "DDC/CI" and it is enabled. Moreover, I can control brightness via ScreenBright utility
https://www.softpedia.com/get/Desktop-Enhancements/Other-Desktop-Enhancements/ScreenBright.shtml

But, speaking honestly, it is not as stylish as yours. Is it possible to add support of this monitor to your utility? Maybe you can provide unofficial build with spoofed DDC/CI official check, which just sends commands to change brightness, and I get to you with feedback?

Thanks

Performance issue

Hello!

I've noticed that dragging windows became much slower since I've installed Monitorian on my Tablet. Checked out CPU usage in Process Explorer and it looks like the Desktop Window Manager eats more CPU when Monitorian is running.

I've measured average CPU usage of dwm.exe while moving a window (in this case the Windows 10 Calculator) around the desktop. Checked it both on my Tablet and PC - here are the results:

Device Monitorian off Monitorian on
Tablet 24% 30% (lagging a lot!)
PC 17% 20%

Note: not all windows eat as much CPU while dragging, but even with simplier ones there is a very noticeable lag when running Monitorian on my Tablet. The PC runs smooth, but there is a CPU usage incerase.

Also, you should consider adding command line options or configurable keyboard shortcuts for brightness control on main/all monitors. Other thant that - great and very useful piece of software. Good job, sir!

Sync all displays with laptop brightness controls stops working

I can see that #5 is working, but the moving together disengages if one display moves down to 0% brightness.

To reproduce:

  1. click the + sign next to each monitor to link them together
  2. use the laptop's brightness keys to change the brighness
  3. using the keys, reduce the brightness all the way down

What happens is that the external display disengages from moving together. If I use the keys to increase the brightness again, only the laptop's display will change.

Action Center

Just installed this app on an Intel NUC8i7HNK with an ASUS MX25AQ monitor. This NUC is identified as a "desktop" computer by Windows as it uses a desktop chipset and processor. Windows does not install its brightness slider (Settings > System > Display) nor its Action Center brightness control on "desktop" computers - these are only installed, by design, on laptop computers. Thus, the monitor control buttons or the graphics control panel are the only methods for changing screen brightness. Neither are as simple to access as the Windows brightness controls - nor as easy to access as Monitorian. Brightness is now easily accessible and works perfectly - Thank you for a very useful app!

I would like to request that an option be added to provide an Action Center button rather than the taskbar location - similar to the native Windows brightness button. This configuration option would provide for desktop computers essentially what is available for laptops.

Thanks again!

Localization

I am saddened that the program is in English only.
I suggest to localize the program.
I am ready to assist in the translation into Russian.
(For example, you can use the service Crowdin or any other. Crowdin is free for Open source projects.)

Uncontrollable monitors

I have realized that some users don't check the requirements or remarks of this tool when their monitors don't show up in this tool. It happens mostly when the monitor is external one but not DDC/CI enabled.
I feel the necessity to clearly inform users that this tool found a monitor but it is not controllable by it.

'ToolTip' cannot have a logical or visual parent

I have occasionally experienced this exception when some hardware changes happen. No clue.

System.InvalidOperationException: 'ToolTip' cannot have a logical or visual parent.
   at System.Windows.Controls.ToolTip.OnAncestorChanged()
   at System.Windows.FrameworkElement.OnAncestorChangedInternal(TreeChangeInfo parentTreeState)
   at System.Windows.TreeWalkHelper.OnAncestorChanged(DependencyObject d, TreeChangeInfo info, Boolean visitedViaVisualTree)
   at System.Windows.DescendentsWalker`1._VisitNode(DependencyObject d, Boolean visitedViaVisualTree)
   at MS.Internal.PrePostDescendentsWalker`1._VisitNode(DependencyObject d, Boolean visitedViaVisualTree)
   at System.Windows.DescendentsWalker`1.VisitNode(FrameworkElement fe, Boolean visitedViaVisualTree)
   at System.Windows.DescendentsWalker`1.VisitNode(DependencyObject d, Boolean visitedViaVisualTree)
   at System.Windows.DescendentsWalker`1.WalkLogicalChildren(FrameworkElement feParent, FrameworkContentElement fceParent, IEnumerator logicalChildren)
   at System.Windows.DescendentsWalker`1.WalkFrameworkElementLogicalThenVisualChildren(FrameworkElement feParent, Boolean hasLogicalChildren)
   at System.Windows.DescendentsWalker`1.IterateChildren(DependencyObject d)
   at System.Windows.DescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode)
   at MS.Internal.PrePostDescendentsWalker`1.StartWalk(DependencyObject startNode, Boolean skipStartNode)
   at System.Windows.TreeWalkHelper.InvalidateOnTreeChange(FrameworkElement fe, FrameworkContentElement fce, DependencyObject parent, Boolean isAddOperation)
   at System.Windows.Controls.Primitives.Popup.UpdatePlacementTargetRegistration(UIElement oldValue, UIElement newValue)
   at System.Windows.Controls.Primitives.Popup.DestroyWindow()
   at System.Windows.Controls.Primitives.Popup.<HideWindow>b__122_0(Object sender, EventArgs args)
   at System.Windows.Threading.DispatcherTimer.FireTick(Object unused)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

[Suggestion] Sync adjusted brightness of SP4 to external monitor

Hello!

First at all, thank You very much, i find it very helpful! Do you think, that You could add a feature I've described in the title?

image

  1. You know the 'adjusted brightness' of SP4 display
  2. You can change the brightness via DDC on external display
  3. Combine these two together!

I know there is 'move together' feature in you app, though it doesn't account for the sunlight sensor of SP4.

Sync brightness with laptop keyboard controls

I really thank you for this tools it made it easy for me to change brightness of my Dell U2415
but I think it's best if you ad an option to make the brightness the same as current windows brightness level

This monitor is not controllable - Internal Generic PNP Monitor

Hi friends,

I'm using an Lenovo T450 that it has the display changed before I buy it.
I can't adjust the brightness in windows, not just with this program...

In linux it's working. Maybe someone here can help me...

SoftMCCS reports that DDC/CI - not supported (missing dptx services).

Thank you

Samsung Smart TV

Doesn't work on Smart TV. I'm looking for an app that controls Samsung TV brightness. Do you know of any?

Crash issue

System: Win10 10.0.16299 build 16299
The last update 1709
App source: Windows Store

Crash report:
[Date: 22/10/2018 19:37:32 Sender: Name:monitorian.exe
There are no context policies.
]
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.get_Current()
at Monitorian.Models.Monitor.MSMonitor.d__2.MoveNext()
at Monitorian.Models.Monitor.MonitorManager.d__3.MoveNext()
at Monitorian.MainController.<>c__DisplayClass33_0.<b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Monitorian.MainController.d__33.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Monitorian.MainController.d__18.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Monitorian.App.d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.b__6_0(Object state)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.ProcessQueue()
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at Monitorian.App.Main()

COMException (0x800704EC) When launching Monitorian on Windows 10

Hi there,

Upon launching Monitorian on my computer I get an instant error, that outputs the following log file:
log.txt.

The error is present on the Store version, and when installing with the provider installer in the README.

My system:
Windows 10 x64 Home Edition
Version: 1703
Build: 15063.296

Regards,
Christian

Show the window on a global hotkey press and hide it after x sec.

First of all, really thank you for the app.

Global hotkeys are great and work well. However, when changing small increments it takes effort to detect which monitor is active and also at what level the brightness is. The Windows brightness control (notebooks etc.) has an advantage in that it does several steps at once. It performs the increment while showing the indicator, which then disappears after the timeout.

I've tried to bypass it with AHK, but the hiding and minimizing functions somehow break the functionality until the app restarts.

The source doesn't seem to have this since it's a paid feature.

Do you consider it worth implementing?

IndexOutOfRangeException when monitor becomes idle

I suspect this happens when my monitor becomes idle and woke up later. I only have one monitor. This is the exception log that gets saved to the desktop:

[Date: 2018-10-13 21:49:25 Sender: System.Windows.Threading.Dispatcher]
System.IndexOutOfRangeException: Der Index war außerhalb des Arraybereichs.
   bei System.Management.ManagementObjectCollection.ManagementObjectEnumerator.get_Current()
   bei Monitorian.Models.Monitor.MSMonitor.<EnumerateDesktopMonitors>d__2.MoveNext()
   bei Monitorian.Models.Monitor.MonitorManager.<EnumerateMonitors>d__3.MoveNext()
   bei Monitorian.MainController.<>c__DisplayClass33_0.<<ScanAsync>b__0>d.MoveNext()
--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
   bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   bei Monitorian.MainController.<ScanAsync>d__33.MoveNext()
--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
   bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   bei Monitorian.Models.Watcher.TimerWatcher.<OnTick>d__10.MoveNext()
--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
   bei System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__6_0(Object state)
   bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

I'm quite sure I never had it with 1.7.0 and it started with 1.7.1. But of course, it could be a Windows Update or something as well. Please let me know what I can do track down the issue.

App doesn't show the monitors

When I start the application I get an icon in the tray area, which allows me to open the context menu:
ctx-menu

The application itself doesn't show at all. I can only see the app title:
main

I have two monitors connected and I'm using Intel integrated graphics card. The Intel command center application shows that both monitors support DDC:
dipslay1

display2

Other applications to communicate using DDC doesn't work as well. All show that no DDC capable display is connected.

Does it mean that Monitorian will not work?

Moving in unison breaks easily

Hello, first of all, I'd like to say thank you for your hard work and open sourcing this.

I'm not sure if this was designed or a bug, but I have 2 monitors that I'd like to have synced brightness. Now sometimes the percent value may be off by a little bit (like 60% and 70%), but I'd still want them to move together.

I found that when two percent values are off, even by a little bit, when brightness for one monitor reaches an extreme (100% or 0%), it becomes very easy to break moving in unison, and you have to manually add to it again.

(Fig. 2 one monitor reaches an extreme, moving in unison still enabled)


(Fig. 3 if you try to make the other 100%, it breaks moving in unison)

I was wondering if this was expected behavior, and if so what was the reasoning. Thanks in advance!

Not working at build 18980.1, log applied

[Date: 12.09.2019 8:41:45 Ver: 2.0.9.0]
System.Management.ManagementException: Недопустимый класс HResult: -2146233087 ErrorInformation: NULL ErrorCode: InvalidClass
в System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
в System.Management.ManagementEventWatcher.Start()
в Monitorian.Core.Models.Watcher.BrightnessWatcher.Subscribe(Action`2 onChanged)
в Monitorian.Core.AppControllerCore.d__18.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
в Monitorian.AppController.d__16.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
в Monitorian.App.d__2.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.b__6_0(Object state)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

[Date: 12.09.2019 9:18:18 Ver: 2.0.9.0]
System.Management.ManagementException: Недопустимый класс HResult: -2146233087 ErrorInformation: NULL ErrorCode: InvalidClass
в System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
в System.Management.ManagementEventWatcher.Start()
в Monitorian.Core.Models.Watcher.BrightnessWatcher.Subscribe(Action`2 onChanged)
в Monitorian.Core.AppControllerCore.d__18.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
в Monitorian.AppController.d__16.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
в Monitorian.App.d__2.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.b__6_0(Object state)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

[Date: 12.09.2019 9:18:28 Ver: 2.0.9.0]
System.Management.ManagementException: Недопустимый класс HResult: -2146233087 ErrorInformation: NULL ErrorCode: InvalidClass
в System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
в System.Management.ManagementEventWatcher.Start()
в Monitorian.Core.Models.Watcher.BrightnessWatcher.Subscribe(Action`2 onChanged)
в Monitorian.Core.AppControllerCore.d__18.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
в Monitorian.AppController.d__16.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
в Monitorian.App.d__2.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
в System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.b__6_0(Object state)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
в System.Windows.Threading.DispatcherOperation.InvokeImpl()
в System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
в MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
в System.Windows.Threading.DispatcherOperation.Invoke()
в System.Windows.Threading.Dispatcher.ProcessQueue()
в System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
в System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
в System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
в System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
в System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
в System.Windows.Application.RunDispatcher(Object ignore)
в System.Windows.Application.RunInternal(Window window)
в System.Windows.Application.Run(Window window)
в Monitorian.App.Main()

Monitor brightness changes after sleep/hibernate

The monitor brightness changes after the computer wakes from sleep or hibernate. Also when the brightness of multiple monitors was synced ("Enable moving together"), the synchronization is lost.

This could be fixed by reapplying the latest brightness settings after resuming from sleep or hibernate. Implementation could be done by listening for the WM_POWERBROADCAST message (https://docs.microsoft.com/en-us/windows/desktop/power/wm-powerbroadcast-messages) and acting accordingly.

Restart Button

Hello, sometimes when I swap monitor when my laptop is asleep messes with monitor detection. A simple fix is restarting the program, but the workflow is a bit cumbersome.

I was wondering if it's possible to add a restart button in the right click menu.
(Maybe right above "CLOSE")

Thanks!

"This monitor is not controllable" after G-sync state change

Win10 x64 latest, monitorian 2.1.0

Happens always after g-sync state change. It is controllable! (always)
image

Restarted the program
image

Also i tested pre 2.2.0. Same. If i disable or enable G-sync then it show screen in list for few seconds, after shows red "not controllable" for few seconds and disappear. After program restart everything is ok. (Also program doesn't respond to click (in tray) for 3-5 seconds after start)

Exceptions at startup, sometimes

I've been happily using Monitorian for some time. However occasionally I get repeated exceptions at startup time, which go away some time later. Not sure what causes it! If I can consistently reproduce I will update the bug.
exception.log

Context menu style

Hey, nice app, I really like using it. Only thing to improve in my opinon: Giving the user the ability to select a right click context menu design and adding one that fits the grey Windows 10 vanilla style. I know that this won't improve functionality, but I hope it will be added one day in order to improve consistency. :)

Automatic screen rotation feature

Hello!

I would like to suggest a neat little feature. Some monitors are equipped with accelerometer, thus, can detect screen orientation. One of the examples is HP z24n g2 that I own. This is handled by proprietary software installed on your PC. I'm not really willing to install a large HP monitor management software just to have this feature.

Since Monitorian already uses VCP commands to get and change brightness, it would be probably pretty easy to get the screen orientation. The VCP code for that is 0xAA:
image

The only problem with this, is that the app would need to periodically ( and frequently ) check to see if this value has changed. Which would eat up some resources.

Tell me what You think!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.