1

要以编程方式设置显示亮度,我有两个选择:

  • 使用PowerWriteACValueIndexPowerWriteDCValueIndexAPI
  • 使用 PowerCfg.exe

现在,我都尝试了,两者都给了我相同(奇怪)的结果。这是我正在使用的代码:

                With psiInfo
                    .FileName = "powercfg"
                    .UseShellExecute = True
                    .WindowStyle = ProcessWindowStyle.Hidden
                    .Arguments = "-setacvalueindex " & guidCurScheme.ToString() & " " & SUBGROUP_GUID.GUID_VIDEO_SUBGROUP & " " & SETTING_GUID.GUID_DISPBRIGHTNESS & " " & psValue.ValueAC
                End With
                pProc = Process.Start(psiInfo)

在哪里 :

Public Const GUID_VIDEO_SUBGROUP As String = "7516b95f-f776-4464-8c53-06167f40cc99"
Public Const GUID_DISPBRIGHTNESS As String = "aded5e82-b909-4619-9949-f5d71dac0bcb"

Public Structure POWERSETTING
    Public ValueAC As String
    Public ValueDC As String
End Structure

Dim psValue As POWERSETTING

并且guidCurScheme是有源电源方案的 GUID,由PowerGetActiveSchemeAPI 函数返回。我对 DC 部分做同样的事情,使用“-setdcvalueindex”。

现在奇怪的行为如下:

  1. 如果我在按钮单击处理程序事件中调用此代码,它将设置这些值,但不会设置“常规”屏幕亮度滑块(以及就此而言,显示亮度)。(请有人编辑帖子内的图片链接)
  2. 如果我用户第二次单击该按钮,它只会应用该设置。
  3. 如果我将代码放在一个循环中,以便在用户单击按钮时运行两次,它仍然会像 (1) 中那样运行
  4. 如果我尝试从命令行手动运行相同的命令,它将运行正常。

这完全出乎意料,我不知道我做错了什么。当我使用Windows API中的PowerWriteACValueIndexand函数时,它给出了完全相同的结果。PowerWriteDCValueIndex

4

1 回答 1

1

也许通过让应用程序将字符串复制到剪贴板来仔细检查参数的语法。有时只是一个小小的错字就毁了我。

另外我会检查被调用的应用程序是来自 syswow 还是来自 system32 的应用程序(这取决于你如何编译你的应用程序)你还可以检查退出代码或查看你得到的错误输出。可以像这样捕获错误输出:

Dim so As System.IO.StreamReader
        Dim se As System.IO.StreamReader
        se = myproc.StandardError
        so = myproc.StandardOutput
        myproc.WaitForExit()
        MsgBox(so.ReadToEnd & vbcrlf & se.ReadToEnd)
于 2015-07-17T06:48:51.430 回答