当我以编程方式执行它时,powercfg.exe的奇怪行为

时间:2015-07-16 22:32:20

标签: vb.net powercfg

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

  • 使用PowerWriteACValueIndexPowerWriteDCValueIndex API
  • 使用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,由PowerGetActiveScheme API函数返回。我为DC部分做同样的事情,使用" -setdcvalueindex"。

现在奇怪的行为如下:

  1. 如果我在按钮点击处理程序事件中调用此代码,则会设置these values,但不会设置"general" screen brightness slider (and for that matter, the display brightness)。 (有人编辑帖子里面的图片链接)
  2. 如果我再次点击该按钮,则只会应用该设置。
  3. 如果我将代码放在一个循环中,当用户点击按钮时它会运行两次,它仍然会表现为(1)
  4. 如果我尝试从命令行手动运行相同的命令,它将正常运行。
  5. 这完全出乎意料,我不知道自己做错了什么。当我使用Windows API中的PowerWriteACValueIndexPowerWriteDCValueIndex函数时,它会得到完全相同的结果。

1 个答案:

答案 0 :(得分:1)

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

此外,我还要检查被调用的应用程序是来自syswow还是来自system32的应用程序(这取决于您编译应用程序的方式) 您还可以检查exitcode或查看您获得的错误输出。 可以像这样捕获错误输出:

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)