Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在win32 c+中复制窗口的可视内容并将其放在新窗口上+;?_C++_Windows_Winapi_Win32gui - Fatal编程技术网

C++ 如何在win32 c+中复制窗口的可视内容并将其放在新窗口上+;?

C++ 如何在win32 c+中复制窗口的可视内容并将其放在新窗口上+;?,c++,windows,winapi,win32gui,C++,Windows,Winapi,Win32gui,我读过一些关于GetDIBits或BitBlt的文章,但我不理解它们 这可能是因为我不明白Windows实际上是如何处理Windows上的图形的。如果有人能把我推荐到一个可以让我了解这些事情的页面,那就太好了!:) 您可能会幸运地向窗口发送消息。对于使用DirectX或OpenGL的windows,这可能无法正常工作 在启用Aero的系统上使用WM_PRINTCLIENT可能会出现一些问题(例如,当DWM处于活动状态时)。如果系统确实激活了DWM,那么它可能会提供访问窗口备份存储的方法,但我以前

我读过一些关于GetDIBits或BitBlt的文章,但我不理解它们


这可能是因为我不明白Windows实际上是如何处理Windows上的图形的。如果有人能把我推荐到一个可以让我了解这些事情的页面,那就太好了!:)

您可能会幸运地向窗口发送消息。对于使用DirectX或OpenGL的windows,这可能无法正常工作


在启用Aero的系统上使用WM_PRINTCLIENT可能会出现一些问题(例如,当DWM处于活动状态时)。如果系统确实激活了DWM,那么它可能会提供访问窗口备份存储的方法,但我以前没有深入研究过这样做。

您可能会幸运地向窗口发送消息。对于使用DirectX或OpenGL的windows,这可能无法正常工作

在启用Aero的系统上使用WM_PRINTCLIENT可能会出现一些问题(例如,当DWM处于活动状态时)。如果系统确实激活了DWM,那么它可能会提供访问窗口备份存储的方法,但我以前没有深入研究过这样做。

您想要的是:

  • 获取所需像素的窗口的HWND
  • 创建一个大小正确的内存DC(签出)
  • 向窗口发送WM_PRINTCLIENT或WM_PAINT,同时提供内存DC(但并非所有控件/窗口都实现此功能)
  • 将内存DC的内容复制到屏幕
  • 或者,对于步骤3,您可以使用DWM或使用剪贴板进行破解:

    void CopyWndToClipboard(CWnd *pWnd)
    {
        CBitmap     bitmap;
        CClientDC   dc(pWnd);
        CDC         memDC;
        CRect       rect;
    
        memDC.CreateCompatibleDC(&dc);
    
        pWnd->GetWindowRect(rect);
    
        bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height());
    
        CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
        memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);
    
        pWnd->OpenClipboard() ;
        EmptyClipboard() ;
        SetClipboardData(CF_BITMAP, bitmap.GetSafeHandle()) ;
        CloseClipboard() ;
    
        memDC.SelectObject(pOldBitmap);
        bitmap.Detach();
    }
    
    您想要的是:

  • 获取所需像素的窗口的HWND
  • 创建一个大小正确的内存DC(签出)
  • 向窗口发送WM_PRINTCLIENT或WM_PAINT,同时提供内存DC(但并非所有控件/窗口都实现此功能)
  • 将内存DC的内容复制到屏幕
  • 或者,对于步骤3,您可以使用DWM或使用剪贴板进行破解:

    void CopyWndToClipboard(CWnd *pWnd)
    {
        CBitmap     bitmap;
        CClientDC   dc(pWnd);
        CDC         memDC;
        CRect       rect;
    
        memDC.CreateCompatibleDC(&dc);
    
        pWnd->GetWindowRect(rect);
    
        bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height());
    
        CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
        memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);
    
        pWnd->OpenClipboard() ;
        EmptyClipboard() ;
        SetClipboardData(CF_BITMAP, bitmap.GetSafeHandle()) ;
        CloseClipboard() ;
    
        memDC.SelectObject(pOldBitmap);
        bitmap.Detach();
    }
    

    我在windows WM_PAINT中使用此代码解决了这个问题。它现在显示与目标窗口完全相同的内容

    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(MainWindow, &ps);
    
    HDC TargetDC = GetDC(TargetWindow);
    
    RECT rect;
    GetWindowRect(TargetWindow, &rect);
    
    BitBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,TargetDC,0,0,SRCCOPY);
    
    EndPaint(MainWindow, &ps);
    

    我在windows WM_PAINT中使用此代码解决了这个问题。它现在显示与目标窗口完全相同的内容

    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(MainWindow, &ps);
    
    HDC TargetDC = GetDC(TargetWindow);
    
    RECT rect;
    GetWindowRect(TargetWindow, &rect);
    
    BitBlt(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top,TargetDC,0,0,SRCCOPY);
    
    EndPaint(MainWindow, &ps);
    


    嗯,你想做什么?例如,如果我有计算器窗口句柄,我想复制该窗口的所有视觉内容,并复制该窗口的完全相同的副本,但在我的程序制作的另一个窗口句柄中!我认为你需要学习一点gdi。试着看看这个:如果你想要一个没有编辑的完美副本,你可以使用DWM缩略图。那么,你想做什么?例如,如果我有计算器窗口句柄,我想复制该窗口的所有视觉内容,并复制该窗口的完全相同的副本,但在我的程序制作的另一个窗口句柄中!我认为你需要学习一点gdi。试试看这个:如果你想要一个没有编辑的完美拷贝,你可以使用DWM缩略图。谢谢!但我仍然不知道设备上下文(DC)是如何工作的,也不知道如何在WM_PRINTCLIENT消息中使用它们。不过,还是要感谢路上的帮助!您不需要真正了解设备上下文本身是如何工作的-它是设备的抽象,可以是图形适配器、位图或打印机等。它只是提供了一种统一的绘制方式。谢谢!但我仍然不知道设备上下文(DC)是如何工作的,也不知道如何在WM_PRINTCLIENT消息中使用它们。不过,还是要感谢路上的帮助!你其实不需要知道设备上下文本身是如何工作的——它是一个设备的抽象,可以是图形适配器、位图或打印机等。它只是提供了一种统一的绘图方式。谢谢,但我没有MFC。我只需要使用windows就可以了。没有其他图书馆。还有办法吗?我能用同样的原理做吗?:)你走哪条路线?尝试了WM_PAINT和WM_PRINTCLIENT吗?是的,通过向目标窗口发送WM_PRINTCLIENT消息并将HDC作为wParam,然后尝试将其绘制到主窗口,但没有成功。在代码的每一行之间使用GetLastError(),它只返回零。谢谢,但我没有MFC。我只需要使用windows就可以了。没有其他图书馆。还有办法吗?我能用同样的原理做吗?:)你走哪条路线?尝试了WM_PAINT和WM_PRINTCLIENT吗?是的,通过向目标窗口发送WM_PRINTCLIENT消息并将HDC作为wParam,然后尝试将其绘制到主窗口,但没有成功。在我的代码中的每一行之间使用GetLastError(),它只返回零。可能需要一些调整才能使用多个监视器,特别是如果两个窗口都显示在两个监视器上(每个监视器上显示其内容的一半)。可能需要一些调整才能使用多个监视器,特别是如果两个窗口都显示在两个显示器上(每个显示器上显示其内容的一半)。