Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 检测多个进程之一是否单击了按钮_Windows_Winapi_Ipc - Fatal编程技术网

Windows 检测多个进程之一是否单击了按钮

Windows 检测多个进程之一是否单击了按钮,windows,winapi,ipc,Windows,Winapi,Ipc,我有以下设置: 我的应用程序有一个粘滞的按钮(即,单击按钮使其保持向下,直到它上升时再次单击) 应用程序的多个实例可以同时运行 “检测器”应用程序需要能够报告上述按钮中是否至少有一个当前处于关闭状态 支持的实例数量可能有限制,但一旦超过限制,单击按钮就会失败 如何使用Windows API调用实现这一点?到目前为止,我使用了CreateSemaphore,但是这有一个无法克服的问题,即如果应用程序被终止,信号量计数不会增加(因此,即使所有应用程序都关闭,按钮仍会报告为关闭)。您需要多久检测一

我有以下设置:

  • 我的应用程序有一个粘滞的按钮(即,单击按钮使其保持向下,直到它上升时再次单击)
  • 应用程序的多个实例可以同时运行
  • “检测器”应用程序需要能够报告上述按钮中是否至少有一个当前处于关闭状态
  • 支持的实例数量可能有限制,但一旦超过限制,单击按钮就会失败

如何使用Windows API调用实现这一点?到目前为止,我使用了
CreateSemaphore
,但是这有一个无法克服的问题,即如果应用程序被终止,信号量计数不会增加(因此,即使所有应用程序都关闭,按钮仍会报告为关闭)。

您需要多久检测一次?你能不能(通过留言)对这些实例进行投票并询问他们?@JonathanPotter不太经常,但似乎应该有一个比这更简单的解决方案,
到目前为止,我已经使用了CreateSemaphore
——这是在共享部分使用
长g\u nCount
最简单有效的方法,并在按下按钮时使用
InterlockedIncrement
/
InterlockedDecrement
。但如果进程将在外部终止,这当然没有帮助。最可靠的解决方案是在需要时轮询当前运行的窗口。我建议让所有的应用程序调用
RegisterWindowMessage()
,以获得唯一的消息ID,然后检测器可以在需要时广播该消息,任何按下按钮的应用程序实例都可以响应该消息。如果使用Lpc端口,存在绝对可靠的解决方案(未记录,但此处更简单和原生)或管道(更复杂)。服务器应用程序创建端口或管道(多个)。客户端连接到端口/管道。当用户点击按钮时-客户端询问服务器,它保持总的“粘性”计数,并为每个客户端按下/取消按下。感知-即使某些客户端进程终止-服务器收到通知(
LPC\u端口关闭
ERROR\u管道断开
),并且如果此进程在终止之前已停止,请使用资源-减少“粘性”计数。