我在我的程序用用CreateProcess()调用了另外的应用程序,活动的窗口就变成了所调用的应用程序。我想重新把我的应用程序设置为活动的窗口,请问我应该怎么写啊?部分程序如下:
......
CreateProcess(.....)
//我试了好多种方法,都没有用
//BringWindowToTop(m_pShowInfoWnd->m_hWnd);
//m_pShowInfoWnd->SetWindowPos((CWnd*)HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
//m_pShowInfoWnd->SetForegroundWindow();
//m_pShowInfoWnd->SetActiveWindow();
//SetForegroundWindow(m_pShowInfoWnd->m_hWnd);哪位前辈来指一下路啊。。

解决方案 »

  1.   

    SetWindowPos(HWND,HWND_TOPMOST,-1,-1,-1,-1,SWP_NOMOVE|SWP_NOSIZE);
      

  2.   

    放弃吧,微软已经限制了SetForegroundWindow的使用,只有当前活动窗口所属进程才能有效执行这个API,否则只能让用户通过鼠标或键盘来切换活动窗口
      

  3.   

    详细解释一下,当某个窗口成为前台窗口时(比如你启动的另一个进程),这个进程自动调用LockSetForegroundWindow,所以别的进程无法成功调用SetForegroundWindow,但是这个进程能调用以激活其它进程的窗口,接着又被其它进程上锁。其实意思就是只有活动窗口的进程才能解锁。另一个自动解锁的方法是用户按下了ALT键或者鼠标点击了后台窗口,这样用户能用ALT-TAB或者鼠标来激活其它进程窗口
      

  4.   

    还是不行,LockSetForegroundWindow函数找不到
      

  5.   

    你这样调用试试:
    LockSetForegroundWindow()
    CreateProcess()
      

  6.   

    如果你用VC6在开发,可能需要下载新的SDK
      

  7.   

    谢谢回答
    该问题已经解决了,我用的是另外一种方法,先获取有焦点的线程,然后让它和自己的线程合并,然后就可以设置焦点什么的,最后把线程分离。
    不知道这种方法会不会有副作用。
    代码如下:
    HWND curHWnd=::GetForegroundWindow();
    DWORD otherThreadID=::GetWindowThreadProcessId(curHWnd,NULL);
    if(::AttachThreadInput(::GetCurrentThreadId(),otherThreadID,TRUE))
    {
    HWND hFocusWnd=::GetFocus();
    ::SetFocus(m_pShowInfoWnd->m_hWnd); if(hFocusWnd!=0)
    ::AttachThreadInput(GetCurrentThreadId(),otherThreadID,FALSE);
    }
    else
    {
    ::SetFocus(m_pShowInfoWnd->m_hWnd);
    }
      

  8.   

    感谢 jameshooo