如何在长按电源按钮时防止关机?

8
在大多数新电脑上,你可以通过按下电源按钮几秒钟来强制关机。但我想完全防止这种情况发生。
在Windows控制面板中,您可以防止一些软事件,如睡眠、暂停、休眠和“按电源按钮”事件;您还可以使用一些Win32和WDI编程来捕获和处理/拒绝这些事件,但似乎无法阻止长时间按下按钮时的机械式断电。
我猜电源按钮是硬连线到电源供应器上的,当你按住它几秒钟时,它从不等待操作系统?或者有没有办法通过代码甚至防止这种情况发生?
我是一个.NET开发人员。
引用:
哇哦...!你们中的很多人都争论不要这样做 - “你不拥有我的电脑或我的操作系统”,“你正在开发SkyNet”等等 :) 这个应用程序是一个高度定制和封闭的解决方案,针对一些客户。它是一个在Windows XP嵌入式上运行的定制硬件上的信息亭应用程序,并使用触摸屏幕。它不是公共的。

大多数Kiosked PC都在“亭子”中 - 这样未经授权的用户就无法访问电源/重置按钮、外部驱动器和外部端口。如果您的PC暴露在外,摆弄电源按钮只是解决问题的一半。 - CJM
1
如果这些是你控制硬件的亭子,只需在BIOS中禁用此功能即可。大多数计算机都会在BIOS中拥有“电源管理”或“ACPI关机模式”或类似的选项,您可以进行修改。 - Beep beep
14个回答

12

我希望你不能这样做。我遇到过很多情况,无法以其他方式重启电脑。在这种情况下,你真的想强制笔记本用户在运行时拔掉电源并取出电池吗?

尽管如此,您可能正在编写与更为复杂情况有关的软件,因此这样做更有意义。您能否提供有关此举动动机的更多详细信息?

如果用户能够按住电源按钮(表明他们确实想要关闭计算机),他们是否无法从物理上移除电源?

编辑:回应magsto的评论:

如果所有相关人员都确实想要这样做 - 并向他们解释了如果出现问题需要硬重置计算机,则必须采用更直接的方法来断电,我认为这比“按住电源”方法更容易损坏硬件...与设备制造商联系。听起来您可能正在使用特定设备,因此即使这不是公开的选项,他们也可以为您调整BIOS中的某些内容。

考虑到这几乎总是一个非常糟糕的想法,我不会惊讶地发现没有简单的支持,但是如果您询问制造商,可能会有一些隐藏的方法可以做到您想要的事情。但我仍然鼓励您让所有人考虑所有潜在后果。


2
说实话,他们的动机并不重要。这个功能是当事情出错时必要的最后选择。我建议如果真的有问题,物理访问机器才是真正的问题。【天哪!我正在与The Skeet争论!我能得到一个徽章吗?】 - CJM
该应用程序是定制产品,它是触摸屏计算机上的“信息亭应用程序”的一部分,使用Windows XP嵌入式系统,我们和客户都想要这样做。 - Magnus
@CJM:我认为我们并没有真正意见不合 :) 如果用户可以物理接触,他们可能可以通过拔掉电源线/电池来关闭设备。 - Jon Skeet
是的,一些硬件调整应该可以解决问题。但首先我想看看软件和操作系统能做到什么。如果我们调整软件,我们总是可以创建一个“双手”关机按钮或其他恶意的物理锁定键等。 - Magnus

9
请参见ACPI规范第86页,了解与4秒规则(https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf)相关的内容。
文本如下:
4.8.2.2.1.3 电源按钮覆盖
ACPI规范还允许,如果用户在系统处于工作状态时按下电源按钮超过四秒钟,则会生成硬件事件并将系统转换为软关机状态。这个硬件事件称为电源按钮覆盖。针对电源按钮覆盖事件,硬件将清除电源按钮状态位(PWRBTN_STS)。
长话短说,逻辑在硬件中。 ACPI规范中没有记录更改此计时的方法。

这个URL不再可用,我只想将时间从4或5秒延长到15秒,有什么办法可以做到吗? - MansouriAla
1
没有记录的方法可以更改时间。规范说明至少为4秒,此时会生成“硬件事件”。它不太可能在任何可编程的逻辑中。 - Anya Shenanigans

5
使用脉冲开关。我不确定这是否是正确的术语,但我在目录中看到过它们。这是一个瞬间动作开关,只有在您按下时才会“接通”,而不是在您释放时。“停在中间”不起作用。一旦达到阈值,机制开始运动以关闭接触,并且直到接触再次打开才停止移动。这将使您能够正常启动和正常停止,但没有办法保持电路闭合4秒钟。(当然,没有打开外壳)

5

这确实是一种机械断电,所以绕过它可能有点困难。

如果真的很重要,您可以断开电源按钮,并使用远程唤醒或远程关机来打开/关闭计算机。


4

由于关机是在操作系统以下的层面进行的,因此对于操作系统来说,这是像拔掉插头一样的操作,所以这是不可能实现的。


4
据我所知,你说的对,操作系统在这种类型的“关机”中甚至没有涉及。长时间按住电源按钮只是向硬件发出信号,立即关闭计算机内所有设备的电源。当然,可以使用WinAPI捕获和处理正常的关机/睡眠/休眠事件,就像你所说的那样。

4

请将主板上的电源线拔出,然后改为硬连通电源,使其一直处于开启状态。 :)


是的,所有硬件修改都可以解决问题,但我对我们能通过软件走多远很感兴趣... - Magnus

2

好的,也许禁用电源按钮有点疯狂。但我们有一个使用数据库和昂贵许可证的软件应用程序。这家德国大型供应商使用一个许可证管理器,将许可证物理移动到驱动器上。碎片整理、某些防病毒应用程序和断电都会损坏许可证。我们有UPS可以在机器断电时允许优雅的关机。现在似乎一些服务人员或操作员用电源按钮关闭了PC,导致许可证损坏。这些设备分布在世界各地的远程位置,培训操作员可能并不总是能够阻止这种情况发生。解决方案似乎有三个选项:1)与供应商合作禁用电源按钮;2)尝试捕获它并警告用户可能会出现问题;或3)重新设计显示屏,使用一种不受此电源移除影响的操作系统和应用程序。


2

我认为唯一可以改变这种情况的方法是通过手动更改BIOS设置。这可能无法被编程语言捕获。如果你真的需要,你可以拔掉连接到电源按钮的主板上的小线。


2

你是否正在接近开发天网?

抱歉问这个问题,但是像很多人建议的那样,我也认为如果可能的话,不应该让这成为现实。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接