我想做一个软件,在里面显示其它应用程序的窗口,并且是正常能操作,不是只截个图.1.用SetParent函数可以把其它应用程序的窗口父窗口强行设置成我的"对话框"窗口,但是这样我们对话框就不会刷新,也不会响应作响消息了,只有用进程管理器来结束了.
问题:  A 请问还有其它方法来设置其它程序的父窗口吗? B.怎么才能使父窗口(也就是我的对话框)不假死掉?
(注:这里就算改来目标窗口的属性为 WS_CHILD 也是不行的)2.用SetParent函数可以把其它程序窗口的父窗口强行设置成一个"多文档程序"窗口,这样不会有任何问题.子窗口,父窗口都能正常运行.但是我想实现的是在一个"黑框框"中显示一个"外面"的应用程序,但是这个"多文档"程序却不是那么容易去掉那些"标题栏","菜单栏".....
问题: A,怎么去掉那些东西?  B:能不能在对话框程序中动态生成一个支持多文档的窗口?3.怎么在对话框中创建一个CMainFrame类窗口.

解决方案 »

  1.   

    简单的问题让你搞复杂了.
    先GetWindowRect
    再MoveWindow
    搞定
      

  2.   

    首先谢谢大家提建议.LaoWu_  说的方法并不能实现我想要的功能.  因为你这样只是把窗口放到另一个窗口上面.我是要把其它程序窗口作为我程序的子窗口.  这样我程序窗口移动,他也会移动,并且我移动那个绑架来的子窗口的时候,不能移动出我的窗口范围,超出的范围会被自动裁剪.  就好像在多文档程序中移动里面的单个文档一样的效果.
      

  3.   

    今天终于搞一个种解决办法
    就是在我的程序中创建一个窗口就可以了,方法就按Win32程序创建窗口的方法
    1.填充窗口类结构体
    2.注册窗口类
    3.创建窗口(保存好他的句柄)
    4.显示窗口
    5.再通过该窗口的句柄,把其它程序的父窗口强行设置为它.代码如下:void CTestDlg::OnButton1() 
    {
    TCHAR szWindowClass[100]=TEXT("AAA");
    HINSTANCE hInst;
    TCHAR szTitle[100];
    int cmdShow=1;HISTANCE hInstance=AfxGetInstanceHandle();//填充结构体
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = (WNDPROC)WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDR_MAINFRAME);//加载图标
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//(HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = (LPCSTR)IDS_ABOUTBOX;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDR_MAINFRAME);

    //注册窗口类
    RegisterClassEx(&wcex);
    HWND g_hWnd;

    //创建窗口
    g_hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0, 300, 300, NULL, NULL, hInstance, NULL);

    if (!g_hWnd)
    {
    return FALSE;
    }
    //隐藏它菜单
    SetMenu(g_hWnd,NULL);CWnd *cWnd=CWnd::FromHandle(g_hWnd);
    //隐藏标题栏
    cWnd->ModifyStyle(WS_CAPTION,0);
    //隐藏边框
    cWnd->ModifyStyle(WS_THICKFRAME,1);
    //显示对话框
    ShowWindow(g_hWnd, nCmdShow);
    UpdateWindow(g_hWnd);
    //打开一个外部程序
    ShellExecute(m_hWnd,"open","C:\\VC\\TestWinPcap\\Debug\\TestWinPcap.exe",NULL,NULL,SW_SHOW); //稍等片刻,等待程序程序完成,以尽量保证下面的函数能查找到窗口
    Sleep(100);
    //找到该窗口
    HWND hWnd=::FindWindow(NULL,"TestWinPcap");
    if(hWnd)
    {
            //绑架它
    ::SetParent(hWnd,g_hWnd);
    }}
      

  4.   

    这里是窗口处理函数代码int ox=0;
    int oy=0;
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR szHello[100];


    switch (message) 
    {
    case WM_COMMAND:

    break;
    case WM_LBUTTONDOWN:
    {
    CRect rect;
    GetWindowRect(hWnd,&rect);
    CString Str;
    CPoint point;
    point.x=LOWORD(lParam);
    point.y=HIWORD(lParam);
    ClientToScreen(hWnd,&point);
    /*Str.Format("(%d,%d),(%d,%d)",rect.left,rect.top,point.x,point.y);
    OutputDebugString(Str);*/
    ox=point.x-rect.left;
    oy=point.y-rect.top;
    }
    break;
    case WM_MOUSEMOVE:
    if(wParam==MK_LBUTTON)
    {
    CRect rect;
    GetWindowRect(hWnd,&rect);
    CPoint point;
    point.x=LOWORD(lParam);
    point.y=HIWORD(lParam);
    ClientToScreen(hWnd,&point);
    MoveWindow(hWnd,point.x-ox,point.y-oy,rect.Width(),rect.Height(),TRUE);
    }
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }
      

  5.   


       (__) 
      /oo\\________
      \ /     \---\
       \/    /  \  \
        \\_|___\\_|/  *
          ||  YY|  
          ||  ||