我正在使用UPS服务从应用程序监控UPS的状态 - HKLM \ SYSTEM \ CCS \ Services \ UPS \ Status中的密钥包含您可以从电源控制面板获取的所有信息。但是 - 我希望能够告诉UPS关闭我的应用程序。我知道该服务可以告诉UPS关闭 - 例如,在电池上运行一定数量的分钟后 - 我想知道是否有某种命令我可以发送到服务以手动启动关机
我在搜索这些信息时遇到了麻烦 - 人们倾向于拼错“Uninterruptible”(hrm,Firefox红线,但没有替代品),而“UPS”只是点击了运输服务。也许我可以通过System.ServiceController或WMI做什么?
澄清:是的,我说的是关闭物理UPS设备的电源。我知道如何停止服务。我认为这将是一个常见问题 - 我希望我的UPS能够通过PC关闭。根据{{3}},我有一个想法,我将尝试。你看,APC(以及其他所有人)必须为要调用的UPS服务提供一个DLL,并且因为函数调用已经有详细记录,所以我没有理由不能进行P / Invoke它们。一旦我知道它是否有效,我会重新编辑它。
更新:我尝试调用UPSInit,然后UPSTurnOff,没有任何反应。我会再修补一下,但直接调用apcups.dll可能是一个死胡同。
答案 0 :(得分:2)
检查我对Herman的评论,你想关闭UPS,而不是UPS SERVICE,对吗?我的意思是,你希望关闭这个东西,杀掉权力等等,对吗?
如果是这样,您可以通过UPS型号在UPS上查看。我怀疑其中两个会有相同的效果。
在您的搜索中,请尝试“APC”或“电池”,而不是UPS。我认为很多代码都是在笔记本电脑上运行以处理电池等问题......
隐藏在一些尘土飞扬的旧文件中的某些地方我有APC UPS的协议信息,以及它们响应的命令,以及它们发送给PC的内容等等。但是当我们用来连接我们的UPS时,这是回来的。使用SERIAL电缆到我们的计算机......您实际上可以通过Qmodem或Hyperterm与UPS通信...
通过与APC的人们交谈,了解到这一点。他们非常好,乐于助人。现在,我想你只需发布一个来自Powerchute软件的URL,它就会直接与UPS对话,并执行你的命令。
答案 1 :(得分:1)
好的,我有答案(经过测试!),但它并不漂亮。我的APC UPS使用APC "Smart" protocol(more here)进行通信。在我的情况下你需要的是“软关机”,“S”命令。但首先你需要确保它处于“智能”模式(“Y”)。现在,如果您想让Windows UPS服务监视器状态,该服务将在COM端口上具有铁柄。因此,您可以a)让Windows服务关闭UPS,或者b)终止服务并自行关闭UPS。
UPS本身在获得“S”命令后有一个“宽限期”,让您有时间关闭操作系统。这意味着要做上面的(a),你必须:
我认为我们会选择(a),因为(b)涉及额外的工作,导致服务中断并实施串行通信。
答案 2 :(得分:-1)
请告诉您使用的是哪种语言...如果您使用的是.NET,可以使用ServiceController类(阅读文档)。
使用C / C ++控制Win32 API中的服务,Service Functions (Windows)。
例如,要停止服务,您可以使用ControlService函数,如下所示(这是一个快速而肮脏的示例):
OpenService (hServMgr, TEXT("\\UPS_SERVICE_0"), SC_MANAGER_ALL_ACCESS);
SERVICE_STATUS stat;
ControlService (hUpsService, SERVICE_CONTROL_STOP, &stat)
请注意,您需要在hServMgr中提供Service Manager句柄,而\\ UPS_SERVICE_0名称是必须与您所需的UPS服务(Windows内置或其他)相匹配的名称。
请记住,要停止服务,您需要适当的安全权限。这不是Adminstration帐户的问题,但请记住使用非管理员帐户登录时会发生什么。
希望有所帮助。
关于关闭物理UPS设备,我记得在WIn98天我能够通过COM端口关闭设备与UPS通话,尽管我不记得品牌或编程接口是什么。