一台机器上同时运行3个程序(A,B,C),初始时都为最小化,现在要求A运行完某个操作,B最大化,A,C窗口最小化,当B运行完某个操作后,C最大化,A,B最小化,依次循环,如何通过解决。
   有人是通过向注册表发消息的方式实现,注册表内容如下:
    HKEY_LOCAL_MACHINE->SOFTWARE->SYSTEM_HANDLE
       A_HANDLE   0x00000768(1896)
       B_HANDLE   Ox00000zB0(688)
       C_handle   Ox00000634(1588)
  
  请高手指点在VC++中如何实现?十分感谢!

解决方案 »

  1.   

    再加入一个控制程序,负责切换。
    1.控制程序启动时依次启动A、B、C(可以用winexec()),并根据需要,置一个程序在最前台,并最大化。
    2.控制程序启动结束后,自身最小化,但有一个时钟函数在执行。(等待A、B、C发来的消息)。
    3.在A、B、C中加入请求切换代码,需要切换时,向控制程序广播消息。
    4.控制程序得到消息后,执行切换。我做过一个项目,用的就是这种方法,感觉还可以。
      

  2.   

    还有一点是A是我用VC++写的,B,C是别的厂家用Delphi写的。
    现在:
     1。不知下面是什么意思。
       HKEY_LOCAL_MACHINE->SOFTWARE->SYSTEM_HANDLE
           A_HANDLE   0x00000768(1896)
           B_HANDLE   Ox00000zB0(688)
           C_handle   Ox00000634(1588)
      2。我不知道如何向B发消息,和不知道如何接受C发给我的消息。
      
      我很迷惑?望指点!!!
      

  3.   

    delphi我也不明白,到它的板块上问问吧!
      

  4.   

    wangweintk(枫杨) ( 的方法类似第三方服务的方式,应该可行另一方法可为:
    (1)ABC中均有广播接收,若传来的消息参数不是本程序,则最小化,否则最大化;
    (2)A、B、C中每个各自操作结束后,就发广播消息,指明下一操作程序
      

  5.   

    能告诉我如何向B发消息,和如何接受C发给我的消息,举个例子吧,看
    来遇到好人&高手啦!
      

  6.   

    NewFree(新自由人),我觉得用一个控制程序,思路会比较清晰,也比较容易控制。
      

  7.   

    是否可以考虑用进程+进程优先级来做,一个主控进程优先级较高,可以捕获user模块的消息
    创建和控制其他几个进程的运行.通过降低,升高(每个进程的主线程)优先等级,来做到不同的切换
    不过我没有做过,提供个思路
      

  8.   

    HKEY_LOCAL_MACHINE->SOFTWARE->SYSTEM_HANDLE中存放的是A,B,C的进程句柄,如果你的A,B,C是窗口程序的话,可通过FindWindow()得到(Delphi也一样,那样就用不着进程句柄),而如果是后台进程的话,得用进程句柄,2.对对于同一机器内的不同进程的消息传送,就必须用RegisterWindowMessage方法了:
    extern const UINT WM_MYMSG = ::RegisterWindowMessage("MY_SHOW");接收消息处理:
    LRESULT CRecvPostMessagedlgDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    if (message == WM_MYMSG)
    {
    AfxMessageBox("ok");
    }

    return CDialog::DefWindowProc(message, wParam, lParam);
    }从另外一进程内进行触发:
    CWnd * pPrevWnd = CWnd::GetDesktopWindow()->GetWindow(GW_CHILD);
    while( pPrevWnd )
    {
    if( ::GetProp(pPrevWnd->GetSafeHwnd(), m_pszExeName) )
    {
    ::PostMessage(pPrevWnd->GetSafeHwnd(),WM_MYMSG,0,0);
    //::PostMessage(HWND_BROADCAST,WM_MYMSG,0,0);
    return TRUE;
    }
    pPrevWnd = pPrevWnd->GetWindow(GW_HWNDNEXT);
    }