yyz2191958 发表于 2023-6-12 17:33:48

【已解决】这.ahk代码是关闭显示器 还是 使屏幕变黑?谢谢

本帖最后由 yyz2191958 于 2023-6-23 20:52 编辑

已解决:
实测,屏幕变黑(代码动作的时候),整个电脑功率减少 17W

**************************************************
亮屏37W,黑屏20W,关机不断220V~5W。
*************************************************

527104427 发表于 2023-6-12 18:10:06

这是限制显卡输出的,不是操作显示器的

https://learn.microsoft.com/en-us/windows/win32/menurc/wm-syscommand


kli 发表于 2023-6-12 18:26:35

2楼的资料很有用啊

难怪我用这个代码,显示器黑了之后会进入低耗能模式,微亮30秒才真的变黑

yyz2191958 发表于 2023-6-12 19:10:07

527104427 发表于 2023-6-12 18:10
这是限制显卡输出的,不是操作显示器的

https://learn.microsoft.com/en-us/windows/win32/menurc/wm-sy ...

就是说:不能够省电吗?谢谢

527104427 发表于 2023-6-12 19:30:24

yyz2191958 发表于 2023-6-12 19:10
就是说:不能够省电吗?谢谢

把网址中en-us改成zh-cn即可显示中文网页。限制显卡功率应该就是省电模式吧

yyz2191958 发表于 2023-6-12 19:31:13

kli 发表于 2023-6-12 18:26
2楼的资料很有用啊

难怪我用这个代码,显示器黑了之后会进入低耗能模式,微亮30秒才真的变黑

可惜我不懂英文

absman1972 发表于 2023-6-12 21:47:58

附上我常用的代码给大家参考

Shift + F1:萤幕待机
Shift + F2:萤幕关机


#SingleInstance Force
#NoEnv

+F1::
Sleep 100
SendMessage 0x112, 0xF170, 2, , Program Manager
Return

+F2::
LCD_PowerOFF()       
Return

LCD_PowerOFF()
{
; Step1:Find Monitor Handle

; Initialize Monitor handle
hMon := DllCall("MonitorFromPoint"
    , "int64", 0 ; point on monitor
    , "uint", 1) ; flag to return primary monitor on failure
   
; Get Physical Monitor from handle
VarSetCapacity(Physical_Monitor, 8 + 256, 0)

DllCall("dxva2\GetPhysicalMonitorsFromHMONITOR"
    , "int", hMon   ; monitor handle
    , "uint", 1   ; monitor array size
    , "int", &Physical_Monitor)   ; point to array with monitor

handle := NumGet(Physical_Monitor)

; Step2:Change Power Mode
DllCall("dxva2\SetVCPFeature"
    , "int", handle
    , "char", 0xD6 ;VCP code for Power Mode
    , "uint", 0x05)

; Step3:Destroy Monitor Handle
DllCall("dxva2\DestroyPhysicalMonitor", "int", handle)
}

yyz2191958 发表于 2023-6-12 21:58:13

527104427 发表于 2023-6-12 19:30
把网址中en-us改成zh-cn即可显示中文网页。限制显卡功率应该就是省电模式吧

再次感谢

yyz2191958 发表于 2023-6-12 22:00:10

absman1972 发表于 2023-6-12 21:47
附上我常用的代码给大家参考

Shift + F1:萤幕待机


我研究一下 谢谢

yyz2191958 发表于 2023-6-12 22:09:04

本帖最后由 yyz2191958 于 2023-6-12 22:10 编辑

absman1972 发表于 2023-6-12 21:47
附上我常用的代码给大家参考

Shift + F1:萤幕待机

Shift + F2无反应

absman1972 发表于 2023-6-12 22:25:09

本帖最后由 absman1972 于 2023-6-12 22:26 编辑

我给的代码是常驻型,适合在一般的系统下使用

刚刚又重看了你代码
猜测你想做成小程序,可以设定秒数后关机

如果是这样
请把 LCD_PowerOFF() 的内容(16~40行) 覆盖取代原始代码中的
SendMessage, 0x112, 0xF170, 2,, Program Manager

即把原来的待机换成关机

yyz2191958 发表于 2023-6-12 22:33:47

absman1972 发表于 2023-6-12 22:25
我给的代码是常驻型,适合在一般的系统下使用

刚刚又重看了你代码


待机换成关机————不是电脑关机吧?

我其实需要的是:选定它----回车————就关闭显示器(节能)

absman1972 发表于 2023-6-12 22:37:20

yyz2191958 发表于 2023-6-12 22:33
待机换成关机————不是电脑关机吧?

我其实需要的是:选定它----回车————就关闭显示器(节能)

那更简单,代码如下
使用 AutoHotKey 编译成执行档,执行就会关闭显示器了
请再试看看


#NoEnv
#NoTrayIcon
#SingleInstance force
#Persistent

; Step1:Find Monitor Handle

; Initialize Monitor handle
hMon := DllCall("MonitorFromPoint"
, "int64", 0 ; point on monitor
, "uint", 1) ; flag to return primary monitor on failure

; Get Physical Monitor from handle
VarSetCapacity(Physical_Monitor, 8 + 256, 0)

DllCall("dxva2\GetPhysicalMonitorsFromHMONITOR"
, "int", hMon   ; monitor handle
, "uint", 1   ; monitor array size
, "int", &Physical_Monitor)   ; point to array with monitor

handle := NumGet(Physical_Monitor)

; Step2:Change Power Mode
DllCall("dxva2\SetVCPFeature"
, "int", handle
, "char", 0xD6 ;VCP code for Power Mode
, "uint", 0x05)

; Step3:Destroy Monitor Handle
DllCall("dxva2\DestroyPhysicalMonitor", "int", handle)

ExitApp

yyz2191958 发表于 2023-6-12 22:43:53

absman1972 发表于 2023-6-12 22:37
那更简单,代码如下
使用 AutoHotKey 编译成执行档,执行就会关闭显示器了
请再试看看

我试一试先 谢谢

yyz2191958 发表于 2023-6-12 22:48:36

absman1972 发表于 2023-6-12 22:37
那更简单,代码如下
使用 AutoHotKey 编译成执行档,执行就会关闭显示器了
请再试看看

选定---回车————无动作(看下也没有进程)

absman1972 发表于 2023-6-12 22:56:24

yyz2191958 发表于 2023-6-12 22:48
选定---回车————无动作(看下也没有进程)

你使用什么操作系统?一般系统还是 PE?

yyz2191958 发表于 2023-6-12 22:57:12

PE(安装了ahk)

absman1972 发表于 2023-6-12 23:43:02

yyz2191958 发表于 2023-6-12 22:57
PE(安装了ahk)

我刚试了一下
常规系统下可以正常关闭显示器(电源灯熄灭,只能按电源键重开)
PE 下确实没反应,原因不详

第三方程序很多,PE 下正常,不过都只能进入省电模式
即显示器变暗后亮节能灯,摇一下鼠标后会重新亮屏
如果可以接受这种效果,可以考虑使用第三方程序






yyz2191958 发表于 2023-6-13 06:34:04

absman1972 发表于 2023-6-12 23:43
我刚试了一下
常规系统下可以正常关闭显示器(电源灯熄灭,只能按电源键重开)
PE 下确实没反应,原因不 ...

非常感谢

shy20070509 发表于 2023-6-13 12:30:41

牛人啊

yyz2191958 发表于 2023-6-13 12:57:25

shy20070509 发表于 2023-6-13 12:30
牛人啊

来自网络哦

527104427 发表于 2023-6-14 20:27:32

本帖最后由 527104427 于 2023-8-9 11:19 编辑

yyz2191958 发表于 2023-6-13 12:57
来自网络哦
楼上的两个功能可以用PECMD实现:

1.屏幕待机(pecmd 源码):https://pecmd.net/thread-546.htm

2.屏幕关机(pecmd 源码):https://pecmd.net/thread-547.htm


yyz2191958 发表于 2023-6-14 20:50:59

527104427 发表于 2023-6-14 20:27
楼上的两个功能可以用PECMD实现:

1.屏幕待机:

我试一试谢谢

yyz2191958 发表于 2023-6-14 21:01:11

527104427 发表于 2023-6-14 20:27
楼上的两个功能可以用PECMD实现:

1.屏幕待机:


试了一下:
1.屏幕待机————有效

2.屏幕关机————无效(没有反应)

再次感谢

absman1972 发表于 2023-6-15 00:46:39

原先的 AHK 代码修正 DLL 路径后,已经可以正常呼叫 dxva2
不过在 dxva2\SetVCPFeature 阶段时仍然会失败
我查了一下,它是 透过 DDC/CI 通道来存取 VCP

我的显示器在常规系统下可以正常关闭(表示支援 DDC/CI)
但是在 PE 下其他步骤都正确,只有这个步骤失败

搜寻了一下,微软官网有提到不是所有显示器都支援这个功能
Intel 官网也有提到 DDC/CI 需要显示晶片驱动支援才行
但一般 PE 为了轻量化,一般只使用通用的驱动
因此即使显示器有支援,也可能因为驱动问题无法实现这个功能
除非愿意为了这个功能安装专属的显示驱动(常常比 PE 本身还大)

想来想去,只有「屏幕待机」是比较可行的方案

另外 527104427 网友提供的代码其实也是相同的做法
差别只在于使用 PECMD 来写代码
无法成功的原因,应该也是显示驱动的问题

yyz2191958 发表于 2023-6-15 06:26:01

absman1972 发表于 2023-6-15 00:46
原先的 AHK 代码修正 DLL 路径后,已经可以正常呼叫 dxva2
不过在 dxva2\SetVCPFeature 阶段时仍然会失败
...

屏幕待机很好,谢谢

absman1972 发表于 2023-6-15 10:28:43

yyz2191958 发表于 2023-6-15 06:26
屏幕待机很好,谢谢

屏幕待机的功能其实系统本身的电源计划设定就有支持
前提是相关注册表及文件没有短少

可以在注册表里预先配置,也可以在 PECMD.INI 加入设定
想折腾可以参考这个贴子
h ttp://bbs.wuyou.net/forum.php?mod=viewthread&tid=433888

但现在的方法也很好很实用

yyz2191958 发表于 2023-6-15 11:05:44

absman1972 发表于 2023-6-15 10:28
屏幕待机的功能其实系统本身的电源计划设定就有支持
前提是相关注册表及文件没有短少



已经很满意了 谢谢

527104427 发表于 2023-6-15 22:39:47

本帖最后由 527104427 于 2023-8-9 11:17 编辑

yyz2191958 发表于 2023-6-15 11:05
已经很满意了 谢谢
一分钟无动作将屏幕待机(pecmd源码):https://pecmd.net/thread-548.htm

yyz2191958 发表于 2023-6-15 23:45:14

527104427 发表于 2023-6-15 22:39
一分钟无动作将屏幕待机:

非常感谢
页: [1] 2
查看完整版本: 【已解决】这.ahk代码是关闭显示器 还是 使屏幕变黑?谢谢