我想实现如下功能:
运行主程序A,然后运行另一程序B;然后B发消息给A,如发WM_CLOSE关闭A,然后等待A关闭后再执行后面的代码,如何实现?
主要是有两个问题:
1、怎样得到A的句柄?用来发消息用(我是这样用的:用ShellExecute把A程序的m_hWnd发过去,B得到后转为句柄发消息关闭。测试的时候可以关闭。我有个问题就是,这个句柄是不是唯一的,通过这样得到的句柄就是A的句柄?
2、怎样等待A关闭?WaitForSingleObject行吗?希望高手不吝赐教!

解决方案 »

  1.   

    A程序如果可以启动多个实例不就不是唯一的了么. 你这里说的句柄是窗口句柄吧,应该得到进程ID然后OpenProcess再WaitForSingleObject.
    通常最简单的做法是A在创建窗口的时候,创建一个用GUID作为窗口名,这样应该是唯一的,然后B用FindWindow来找到它.从窗口句柄获得进程ID可以用GetWindowProcessID的API.
      

  2.   

    谢谢,主要是这个A的窗口句柄,我用第一种方式得到的是不是就是A的窗口句柄?
    用FindWindow查找如果是开多个A的话有问题的吧?
      

  3.   

    HWND hwnd = FindWindow(classname,caption);
    hwnd = ::GetWindow(hwnd,GW_HWNDNEXT);得到下一个实例
      

  4.   

    是这样的,A会运行一个B
    又运行A1会运行B1
    这个时候我关闭B1的时候应该关闭A1
    用FindWindow的话我怎么知道是A1而不是A
      

  5.   

    应该直接B1找到的就是A1 不会是A 你试一下
    A1 B1 有没父子关系 有就用GetParent()
      

  6.   

    A程序如果可以启动多个实例,窗口句柄就不唯一了,如果每个窗口的标题不一样,你可以用HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow)函数逐个找到窗口的句柄再发送消息来关闭它这样比较麻烦,进程应该是一样的,通过窗口句柄找到进程,再来关闭进程就行了
    GetWindowThreadProcessId(HWND//窗口句柄, g_dwThreadIdMsn);
      

  7.   

    谢谢各位,因为上班的电脑不能上网,要上网要去专门的电脑,所以白天一般不上网的
    我现在测试,theApp.m_hWnd和FindWindow得到的名柄是一样的,为什么会这样??
    我就是不确定,两者是不是肯定相等的
      

  8.   

    如果是单个实例的话,theApp.m_hWnd和FindWindow得到的句柄照理应该是一样的吧
    但是有一次我用这两种途径去获取,再操作,好像结果又不一样的,有一个失效了,忘了是哪个了多个实例的话,两者应该是theApp.m_hWnd可靠一点吧
      

  9.   

    可以在一个程序关闭前的on_close事件中发一个消息给另外一个,表示要关闭了,为了稳妥起见,另外一个在收到消息后扫描关闭程序的窗口,如果找不到了,或者扫描进程,找不到了,表示关闭了。楼主啊,我告诉你一个目前比较容易且比较靠谱的办法,别用windows自己的机制,用rabbitmq ,这样能够充分保证你的进程间通信正常。