Winapi同步过程

时间:2013-03-22 17:32:15

标签: c++ winapi

我有3个简单的程序,每个都是一个简单的窗口。我将启动所有3个过程,然后单击程序1或2的按钮以显示程序3的窗口。
计划1& 2:只有1个按钮。单击时,显示程序3的隐藏进程(也是一个窗口)。
程序3:作为隐藏进程启动,它在弹出之前等待程序1和2的消息。根据按下按钮,窗口标题应更改为程序1或2的标题。

我不确定是什么函数或者我使用线程来做这个行为?我相信我需要使用某种线程来做到这一点。首先让程序3隐藏,然后等待程序1和2的消息..任何想法?

编辑:我正在使用C ++,并且我被告知要使用信号量。

2 个答案:

答案 0 :(得分:1)

由于您需要跨进程边界传递简单消息,因此我建议您在SendMessage系列中使用某些内容。您首先需要获取目标窗口的句柄。这个函数在窗口API中是相当低级的,所以你只能直接从C / C ++中获取它,但是你没有指定你使用的是什么语言,我认为有这个包装CLR的例程也可以通过C#访问。

答案 1 :(得分:1)

我建议使用Windows Event。特别是手动重置事件。你的程序3做了一个等待事件。当程序1或程序2想要唤醒窗口时,它会设置事件。当程序3返回隐藏状态时,它会清除该事件。

您可以使用SendMessagePostMessage,但事件似乎更容易和直接。它也有一定的优势:

  • 程序1和程序2不需要找到程序3的窗口句柄,也不需要广播可能被其他进程拦截的消息。
  • 您可以为事件添加安全属性,以防止恶意程序访问它。
  • 您可以使用控制台应用程序,Windows服务或任何其他进程中的技术,无论它是否正在运行消息循环。
  • 比使用Windows消息更容易理解(对我而言)。

这不适合信号量。信号量通常用于同步对多个共享资源的访问。你想要的只是程序3等待通知,程序1或程序2能够发送通知。

如果您必须将数据从程序1传递到程序3,那么事件将无法帮助您这样做。在这种情况下,您将不得不提出一种通信方法,例如内存映射文件,管道,网络套接字......甚至是Windows消息。但对于简单的“嘿,醒醒!”通知,我会使用一个活动。