【需求】关于win7/win10关机前执行用户目标程序的脚本 其他 案例 19年10月14日 编辑 erdott2 取消关注 关注 私信 今天发布一个需求,看看是否有哪位大佬可以解决,或者能够提供一点想法。 需求 win7/win10在按下关机按钮(键盘按钮)时,能否在不关闭其他任何的程序(线程)的情况下,先暂停电脑的关机,然后执行用户所需要的目标程序,最后再执行完程序的情况下关机。 (需求2,在电脑关机后可否关闭所有usb口以及网卡?) 若有想法,请联系花大爷,谢谢各位啦! 给TA捐赠 共{{data.count}}人 人已捐赠
aahk全球宏观交易者 19年11月6日 回复-(需求——关于win7/win10关机前执行用户目标程序的脚本) 控制面板 -> 硬件和声音 -> 电源选项 -> 系统设置 按电源按钮时 不采取任何操作 桌面新建一个脚本文件 关机.ahk 在脚本里写一些关机前需要执行的操作脚本代码和关机代码 Shutdown.exe -s -t 10 为了防止关机失败建议使用 强制关机 软件 写关机代码快捷键 为 Ctrl+F12 关机后USB断电可以在 BIOS 中设置一下 https://www.baidu.com/s?wd=关机后USB断电 https://www.baidu.com/s?wd=关机后USB断电 https://www.baidu.com/s?wd=关机后USB断电 erdott2A@aahk 19年11月11日 感谢大佬的答案。但是我可能有一点没有说清楚的,那就是,对于win7系统或者win10系统,按的是机箱上的关机键或者对于笔记本来说按的是键盘上的关机按钮,而不是额外的其他按键,是在这样的一种情况下,实现按完关机键后执行其他的脚本操作。 控制面板 -> 硬件和声音 -> 电源选项 -> 系统设置 按电源按钮时 不采取任何操作 如果可以将 按电源按钮时 的不采取任何操作,修改成运行指定的程序,也是间接实现需求 但是目前好像对于关机键,不能执行其他的操作,只允许执行他提供的睡眠,注销以及不采取任何操作等 但也可以用监视函数来监视关机键的按下操作,不知道怎么执行
erdott2A@aahk 19年11月11日 感谢大佬的答案。但是我可能有一点没有说清楚的,那就是,对于win7系统或者win10系统,按的是机箱上的关机键或者对于笔记本来说按的是键盘上的关机按钮,而不是额外的其他按键,是在这样的一种情况下,实现按完关机键后执行其他的脚本操作。 控制面板 -> 硬件和声音 -> 电源选项 -> 系统设置 按电源按钮时 不采取任何操作 如果可以将 按电源按钮时 的不采取任何操作,修改成运行指定的程序,也是间接实现需求 但是目前好像对于关机键,不能执行其他的操作,只允许执行他提供的睡眠,注销以及不采取任何操作等 但也可以用监视函数来监视关机键的按下操作,不知道怎么执行
徐晓亮 赤贫lv0 19年11月11日 两个办法 办法一:修改操作系统的关机相关的文件,重写一部分操作系统。这个办法不用改硬件,安装包可以做的非常小巧,一键自动安装。嫁接睡眠程序代码(劫持睡眠程序) 办法二:更换关机按钮的电路板(需要重新焊接,有危险,易失败),淘宝网包邮 键盘电路板 游戏按键电路板 键盘电路模块。
望山观海 富裕lv3 21年8月28日 下面的脚本检测系统的关机/注销动作并允许您中止它. 在 Windows Vista 及更高的版本中, 系统会显示一个用户界面, 显示哪个程序正在阻止关机/注销, 并允许用户强制关机/注销. 在较旧的操作系统上, 脚本显示一个确认提示. DllCall(“kernel32.dllSetProcessShutdownParameters”, “UInt”, 0x04FF, “UInt”, 0) OnMessage(0x11, “WM_QUERYENDSESSION”) return WM_QUERYENDSESSION(wParam, lParam) { ENDSESSION_LOGOFF := 0x80000000 if (lParam & ENDSESSION_LOGOFF) ; 用户正在注销. EventType := “Logoff” else ; 系统正在关机或重启. EventType := “Shutdown” try { ; 设置显示操作系统关闭 UI 的提示. 我们不会显示自己的确认提示, ; 因为我们只有 5 秒钟的时间, 操作系统会显示关机 UI ; 同样, 没有可见窗口的程序在没有提供原因的情况下无法阻止关机. BlockShutdown(“Example script attempting to prevent ” EventType “.”) return false } catch { ; ShutdownBlockReasonCreate 不可用, ; 因此这可能是 Windows XP, 2003 或 2000, 我们可以在其中实际防止关机. MsgBox, 4,, %EventType% in progress. Allow it? IfMsgBox Yes return true ; 通知操作系统允许关机/注销操作继续. else return false ; 通知操作系统中止关机/注销操作. } } BlockShutdown(Reason) { ; 如果您的脚本具有可见的 GUI, 请使用它代替 A_ScriptHwnd. DllCall(“ShutdownBlockReasonCreate”, “ptr”, A_ScriptHwnd, “wstr”, Reason) OnExit(“StopBlockingShutdown”) } StopBlockingShutdown() { OnExit(A_ThisFunc, 0) DllCall(“ShutdownBlockReasonDestroy”, “ptr”, A_ScriptHwnd) } ; DllCall 是可选的: 它告诉操作系统要首先关闭此脚本(在其他所有程序之前).
❓ 这个问题目前无解
回复-(需求——关于win7/win10关机前执行用户目标程序的脚本)
控制面板 -> 硬件和声音 -> 电源选项 -> 系统设置 按电源按钮时 不采取任何操作
桌面新建一个脚本文件 关机.ahk
在脚本里写一些关机前需要执行的操作脚本代码和关机代码
Shutdown.exe -s -t 10
为了防止关机失败建议使用 强制关机 软件
写关机代码快捷键 为 Ctrl+F12
关机后USB断电可以在 BIOS 中设置一下
https://www.baidu.com/s?wd=关机后USB断电
https://www.baidu.com/s?wd=关机后USB断电
https://www.baidu.com/s?wd=关机后USB断电
感谢大佬的答案。但是我可能有一点没有说清楚的,那就是,对于win7系统或者win10系统,按的是机箱上的关机键或者对于笔记本来说按的是键盘上的关机按钮,而不是额外的其他按键,是在这样的一种情况下,实现按完关机键后执行其他的脚本操作。
控制面板 -> 硬件和声音 -> 电源选项 -> 系统设置 按电源按钮时 不采取任何操作
如果可以将 按电源按钮时 的不采取任何操作,修改成运行指定的程序,也是间接实现需求
但是目前好像对于关机键,不能执行其他的操作,只允许执行他提供的睡眠,注销以及不采取任何操作等
但也可以用监视函数来监视关机键的按下操作,不知道怎么执行
两个办法
办法一:修改操作系统的关机相关的文件,重写一部分操作系统。这个办法不用改硬件,安装包可以做的非常小巧,一键自动安装。嫁接睡眠程序代码(劫持睡眠程序)
办法二:更换关机按钮的电路板(需要重新焊接,有危险,易失败),淘宝网包邮 键盘电路板 游戏按键电路板 键盘电路模块。
组策略或控制面板里可以设置关机前运行
替换操作系统文件
感谢大佬提供的另一个解答方向,对于我来说,重置csrss.exe文件可能还是很难实现的QAQ
重新手工制作crss.exe文件
下面的脚本检测系统的关机/注销动作并允许您中止它. 在 Windows Vista 及更高的版本中, 系统会显示一个用户界面, 显示哪个程序正在阻止关机/注销, 并允许用户强制关机/注销. 在较旧的操作系统上, 脚本显示一个确认提示.
DllCall(“kernel32.dllSetProcessShutdownParameters”, “UInt”, 0x04FF, “UInt”, 0)
OnMessage(0x11, “WM_QUERYENDSESSION”)
return
WM_QUERYENDSESSION(wParam, lParam)
{
ENDSESSION_LOGOFF := 0x80000000
if (lParam & ENDSESSION_LOGOFF) ; 用户正在注销.
EventType := “Logoff”
else ; 系统正在关机或重启.
EventType := “Shutdown”
try
{
; 设置显示操作系统关闭 UI 的提示. 我们不会显示自己的确认提示,
; 因为我们只有 5 秒钟的时间, 操作系统会显示关机 UI
; 同样, 没有可见窗口的程序在没有提供原因的情况下无法阻止关机.
BlockShutdown(“Example script attempting to prevent ” EventType “.”)
return false
}
catch
{
; ShutdownBlockReasonCreate 不可用,
; 因此这可能是 Windows XP, 2003 或 2000, 我们可以在其中实际防止关机.
MsgBox, 4,, %EventType% in progress. Allow it?
IfMsgBox Yes
return true ; 通知操作系统允许关机/注销操作继续.
else
return false ; 通知操作系统中止关机/注销操作.
}
}
BlockShutdown(Reason)
{
; 如果您的脚本具有可见的 GUI, 请使用它代替 A_ScriptHwnd.
DllCall(“ShutdownBlockReasonCreate”, “ptr”, A_ScriptHwnd, “wstr”, Reason)
OnExit(“StopBlockingShutdown”)
}
StopBlockingShutdown()
{
OnExit(A_ThisFunc, 0)
DllCall(“ShutdownBlockReasonDestroy”, “ptr”, A_ScriptHwnd)
}
; DllCall 是可选的: 它告诉操作系统要首先关闭此脚本(在其他所有程序之前).