0

我已使用以下 SO 帖子中的信息使我的 C++ 桌面应用程序中的图片控件的父级成为我的 C# 应用程序中的面板控件的子级。C++ 和 C# 应用程序是在各自进程中运行的独立应用程序:

使用 SetParent 将窗口嵌入外部进程的各种问题

使用 SetParent 将 HWND 嵌入到外部进程中

我正在使用下面显示的代码进行重新育儿。C# 应用程序启动 C++ 应用程序,并在命令行上将 Panel 控件的 Windows 句柄传递给它,该控件应承载 C++ 应用程序的 Picture 控件。当我运行 C# 应用程序时,我确实在 C# 应用程序本机的指定面板控件上看到了 C++ 图片控件的轮廓。

但是,我遇到以下问题:

1) C++ 和 C# 应用程序都非常闪烁,就像它们都在每秒重新绘制多次一样。

2) C++ 应用程序中的图片控件通常显示来自我的网络摄像头的视频源。我 BitBlt() 将网络摄像头中的帧放入 C++ 图片控件中。没有重新养育它可以正常工作,但是有了它,我根本看不到任何框架。

注意:闪烁绝对是绘制到现在重新设置父级的子窗口的结果。如果我禁用该操作,则不会发生闪烁。

有谁知道出了什么问题以及我该如何解决?这是 C++ 应用程序中的代码,它执行重新父级处理并将 C++ 主输入线程(拥有图片控件的线程)附加到属于 C# 应用程序主线程的输入线程(拥有的线程面板控制):

// The following code executes in the wWinMain() function of the C++
//  app after the main dialog window and it's child controls have been
//  setup and initialized.  The value assigned to g_VideoHostContainerHWnd
//  was passed to the C++ app by the C# app that launched it, as a 
//  command line argument, using the Panel control's Handle property
//  converted to an unsigned integer.
g_OurMainThreadID = GetCurrentThreadId();

if (g_VideoHostContainerHWnd > 0)
{
    // Make our video stream window a parent of the designated window
    //  in the HiveMind client.

    // Get the window handle for the video stream window: IDC_PANEL_PICTURE.
    HWND videoStreamWindow =
        GetDlgItem(
        g_HwndDlg,
        IDC_PANEL_PICTURE);

    if (videoStreamWindow > 0)
    {
        // Get the thread ID for the thread that owns the video host container window.

         g_VideoHostThreadID = GetWindowThreadProcessId(
            g_VideoHostContainerHWnd,
            &g_VideoHostProcessID);

         if (g_VideoHostThreadID > 0)
         {
             // Make the video stream window a child of the HiveMindClient window.
             if (NULL == SetParent(videoStreamWindow, g_VideoHostContainerHWnd))
                 OutputDebugString(L"The reparenting of the video stream window FAILED.");
             else
                 OutputDebugString(L"The reparenting of the video stream window SUCCEEDED.");

             // Attach the our input thread to the thread ID for the process that launched us
             //  (i.e. - owns the video host window).
             if (AttachThreadInput(g_OurMainThreadID, g_VideoHostThreadID, true))
                 OutputDebugString(L"Attaching our input thread to the video host thread SUCCEEDED.");
             else
                 OutputDebugString(L"Attaching our input thread to the video host thread FAILED.");
         }
         else
         {
             OutputDebugString(L"The thread ID of the video host container's owner thread is ZERO.");
         } // else - if (g_VideoHostThreadID > 0)
    }
    else
        OutputDebugString(L"The video stream window handle is INVALID.");
} // if (g_VideoHostContainerHWnd > 0)
4

1 回答 1

0

我也遇到了这个问题,解决方法是父 hwnd 需要标志 WS_CLIPCHILDREN。

于 2021-08-16T14:04:28.840 回答