我正在使用UPS服务从应用程序监视我的UPS的状态- HKLM\SYSTEM\CCS\Services\UPS\Status中的键包含您可以从电源控制面板获得的所有信息。但是--我希望能够从我的应用程序中告诉UPS关闭。我知道该服务可以告诉UPS关闭--例如,在使用电池运行了一段时间后--我想知道是否可以向该服务发送某种命令,以手动启动关闭。
我在搜索这些信息时遇到了麻烦--人们往往会拼写错误的"Uninterruptible“(hrm,Firefox红线,但没有其他选择),而"UPS”只是在送货服务中获得了匹配。也许我可以通过System.ServiceController或WMI做点什么?
澄清:是的,我说的是关闭物理UPS设备的电源。我知道怎么停止服务。我认为这将是一个常见的问题--我希望我的UPS与PC一起关闭。我有一个想法,我打算尝试一下,基于this page。你看,APC (和其他所有人)必须提供一个DLL供UPS服务调用,而且由于函数调用有很好的文档记录,所以我没有理由不能P/调用它们。一旦我知道它是否有效,我会重新编辑它。
更新:我尝试调用UPSInit,然后调用UPSTurnOff,但什么也没有发生。我将对它进行更多的修改,但是直接调用apcups.dll可能是个死胡同。
发布于 2009-01-22 15:08:30
好吧,我有答案(测试!),但它并不美观。我的APC使用APC "Smart" protocol (more here)进行通信。在我的例子中,你需要的是一个“软关机”,"S“命令。但首先你需要确保它处于“智能”模式("Y")。现在,如果您想让Windows UPS服务监视状态,该服务将拥有对COM端口的铁腕控制。因此,您可以a)让Windows服务关闭UPS,或者b)关闭该服务并自行关闭UPS。
UPS本身在收到"S“命令后有一个”宽限期“,让您有时间关闭您的操作系统。这意味着要执行上述(a)项,您必须:
我认为我们会选择(a),只是因为(b)涉及到额外的工作来终止服务和实现串行通信。
发布于 2008-12-23 00:49:37
查看我对Herman的评论,你想关闭UPS,而不是UPS服务,对吗?我是说,你想让那玩意儿关掉,切断电源,等等,对吧?
如果是这样,您将在UPS by UPS型号上查找它。我怀疑它们中的两个会有相同的效果。
在你的搜索中,不要使用UPS,而是尝试"APC“或”电池“。我认为很多代码都是在笔记本电脑上运行的,用于处理电池耗电等问题。
有些地方隐藏在一些尘土飞扬的旧文件中,我有APC UPS的协议信息,以及它们响应的命令,以及它们发送到PC的内容等。但这是很久以前我们用串行电缆将UPS连接到计算机的时候了……你可以用Qmodem或Hyperterm与UPS通话...
从和APC的人交谈中学到的。他们非常友好,而且很有帮助。现在,我想你只需要从你的Powerchute软件中发布一个URL,它就会直接与UPS对话,并执行你的命令。
发布于 2008-12-23 00:33:06
请告诉我你想用什么语言来做这个。如果你使用的是.NET,你可以用ServiceController类来实现(请阅读文档)。
用于使用C/C++、Service Functions (Windows)控制Win32应用程序接口中的服务。
例如,要停止服务,您可以使用ControlService函数,如下所示(这是一个快速而粗糙的示例):
OpenService (hServMgr, TEXT("\\UPS_SERVICE_0"), SC_MANAGER_ALL_ACCESS);
SERVICE_STATUS stat;
ControlService (hUpsService, SERVICE_CONTROL_STOP, &stat)请注意,您需要在hServMgr中提供服务管理器句柄,并且\UPS_SERVICE_0名称必须与所需的UPS服务(内置或其他)匹配。
请记住,要停止服务,您需要适当的安全权限。这不是管理员帐户的问题,但请记住,使用非管理员帐户登录时会发生什么情况。
希望这能有所帮助。
关于关闭物理UPS设备,我记得在WIn98的日子里,我能够关闭设备的电源,通过COM端口与UPS交谈,尽管我不记得是什么品牌或如何编程接口。
https://stackoverflow.com/questions/387830
复制相似问题