powercfg.exe 以编程方式执行时的奇怪行为
Weird behavior of powercfg.exe when I execute it programatically
要以编程方式设置显示亮度,我有两个选择:
- 使用
PowerWriteACValueIndex
和PowerWriteDCValueIndex
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”。
现在奇怪的行为如下:
- 如果我在按钮单击处理程序事件中调用此代码,它将设置 these values, but not the "general" screen brightness slider (and for that matter, the display brightness)。 (请有人编辑post内的图片链接)
- 如果用户第二次单击该按钮,它只会应用设置。
- 如果我将代码放入一个循环中,当用户单击按钮时两次 运行,它仍然会像 (1)
中那样运行
- 如果我尝试 运行 相同的命令,但从命令行手动执行,它将 运行 工作得很好。
这完全出乎我的意料,我不知道我做错了什么。当我使用 Windows API.
中的 PowerWriteACValueIndex
和 PowerWriteDCValueIndex
函数时,它给出了完全相同的结果
也许可以通过让应用将字符串复制到剪贴板来仔细检查您的参数的语法。有时一个小小的错别字就毁了我。
我还会检查被调用的应用程序是来自 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)
要以编程方式设置显示亮度,我有两个选择:
- 使用
PowerWriteACValueIndex
和PowerWriteDCValueIndex
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”。
现在奇怪的行为如下:
- 如果我在按钮单击处理程序事件中调用此代码,它将设置 these values, but not the "general" screen brightness slider (and for that matter, the display brightness)。 (请有人编辑post内的图片链接)
- 如果用户第二次单击该按钮,它只会应用设置。
- 如果我将代码放入一个循环中,当用户单击按钮时两次 运行,它仍然会像 (1) 中那样运行
- 如果我尝试 运行 相同的命令,但从命令行手动执行,它将 运行 工作得很好。
这完全出乎我的意料,我不知道我做错了什么。当我使用 Windows API.
中的PowerWriteACValueIndex
和 PowerWriteDCValueIndex
函数时,它给出了完全相同的结果
也许可以通过让应用将字符串复制到剪贴板来仔细检查您的参数的语法。有时一个小小的错别字就毁了我。
我还会检查被调用的应用程序是来自 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)