vinduer - Dæmpning sekundære skærme

Indlæg af Hanne Mølgaard Plasc

Problem



Kender nogen en programmatisk måde at dæmpe sekundære skærme, mens den primære skærm bliver helt lys? Jeg har undersøgt nogle eksisterende software, men de fleste vil kun dæmpe alle skærme (eller kun den primære). Jeg har lyst til, at dette måske er en Windows-registreringsmodifikation måske. (Dette ville være for Windows 7-platformen) Selvom nogen kunne pege på registreringsposter, der kan ændres for skærmens lysstyrkeniveau. Jeg tror, ​​at dette håndteres i OS og ikke altid i skærmen selv.


Enhver hjælp er meget værdsat!

Bedste reference


http://msdn.microsoft.com/en-us/library/ms775240.aspx[2]


Brug SetMonitorBrightness API.

Andre referencer 1


Sandsynligvis den bedste software-only løsning her ville være at skabe et ramme-løst, lagdelt vindue for hver skærm, der dækker hele skærmen og sæt baggrundsfarven til, siger 50\% uigennemsigtig sort. Hvordan du gør dette afhænger af hvilket redskab du bruger: WPF? Win32? Qt?

Andre referencer 2


Ben Straub havde den samme idé som mig. Jeg oprettede dette i Visual Studio 2010 med VB.NET, som kan komme i gang? Nogle kode bruges fra Codeproject hjemmeside [3]


Imports System.Runtime.InteropServices


Public Class Form1

Public Enum GWL As Integer
    ExStyle = -20
End Enum

Public Enum WS\_EX As Integer
    Transparent = &H20
    Layered = &H80000
End Enum

Public Enum LWA As Integer
    ColorKey = &H1
    Alpha = &H2
End Enum

<DllImport("user32.dll", EntryPoint:="GetWindowLong")> \_
Public Shared Function GetWindowLong( \_
    ByVal hWnd As IntPtr, \_
    ByVal nIndex As GWL \_
        ) As Integer
End Function

<DllImport("user32.dll", EntryPoint:="SetWindowLong")> \_
Public Shared Function SetWindowLong( \_
    ByVal hWnd As IntPtr, \_
    ByVal nIndex As GWL, \_
    ByVal dwNewLong As WS\_EX \_
        ) As Integer
End Function

<DllImport("user32.dll", \_
  EntryPoint:="SetLayeredWindowAttributes")> \_
Public Shared Function SetLayeredWindowAttributes( \_
    ByVal hWnd As IntPtr, \_
    ByVal crKey As Integer, \_
    ByVal alpha As Byte, \_
    ByVal dwFlags As LWA \_
        ) As Boolean
End Function

Private \_InitialStyle As Integer

Private Sub Form1\_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    \_InitialStyle = GetWindowLong(Me.Handle, GWL.ExStyle)
    Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    Me.BackColor = Color.Black
    Me.Opacity = 0.1 'Range is 0 (Fully see through) to 1 (Fully opaque)
    Me.TopMost = True
    DimScreenByIndex(1) 'use 0, 1, etc depending on which screen you want to dim

    SetWindowLong(Me.Handle, GWL.ExStyle, \_InitialStyle Or WS\_EX.Layered Or WS\_EX.Transparent)
    'Not needed if setting the opacity: SetLayeredWindowAttributes(Me.Handle, 0, 255 * 0.7, LWA.Alpha)

End Sub

Private Sub DimScreenByIndex(ByVal intScn As Integer)
    For intPtr As Integer = Screen.AllScreens.GetLowerBound(0) To Screen.AllScreens.GetUpperBound(0)
        If intPtr = intScn Then
            Me.Top = Screen.AllScreens(intPtr).Bounds.Top
            Me.Left = Screen.AllScreens(intPtr).Bounds.Left
            Me.Height = Screen.AllScreens(intPtr).Bounds.Height()
            Me.Width = Screen.AllScreens(intPtr).Bounds.Width
        End If
    Next
End Sub
End Class