C#面板/图片盒故障

Trouble with C# Panel/Picturebox

本文关键字:故障 面板      更新时间:2023-10-16

我在C++/C#中开发解决方案时遇到问题。我有一个由Windows服务管理的DLL和一个通过WCF和套接字与该服务通信的用户应用程序。DLL管理视频捕获板,它有一个在窗口句柄(从图片框或面板)中写入正在捕获的视频的功能。

我想做的是:创建一个picturebox,并通过WCF将句柄传递给使用该句柄调用DLL函数startpreview的服务。

问题是什么:当我作为用户应用程序运行Service Proccess时,一切都很好,但当我作为Windows服务运行时,startpreview函数不会写入我的句柄。

有人知道我该怎么解决这个问题?顺致敬意,

@编辑

这段代码创建了picturebox并附加在流程布局面板上。这是在通过WCF(WCFVideoMethods.ClientStartPreview)与服务通信的用户应用程序中执行的

PictureBox videoPanel = new PictureBox();
videoPanel.Width = flpMonitor.Width;
videoPanel.Height = flpMonitor.Height;

/// Se for necessário invoke, invoca o metodo de adicionar um componente ao flowlayoutpanel
if (flpMonitor.InvokeRequired)
{
flpMonitor.Invoke(new MethodInvoker(delegate
{
flpMonitor.Controls.Add(videoPanel);
}));
}
/// Caso contrário, chama o método normalmente.
else
{
flpMonitor.Controls.Add(videoPanel);
}
/// Se for necessário invoke para o panel de video, invoca o metodo de inicializar o preview nele
if (videoPanel.InvokeRequired)
{
videoPanel.Invoke(new MethodInvoker(delegate
{
WCFVideoMethods.ClientStartPreview(selectedPos, videoPanel.Handle, new Rectangle(0, 0, videoPanel.Size.Width, videoPanel.Size.Height), true, 0x0080, 20, isAudioActive);
}));
}
/// caso contrário, chama o metodo normalmente.
else
{
WCFVideoMethods.ClientStartPreview(selectedPos, videoPanel.Handle, new Rectangle(0, 0, videoPanel.Size.Width, videoPanel.Size.Height), true, 0x0080, 20, isAudioActive);
}

这是在服务上执行的StartPreview方法

public Boolean StartPreview(int posNo, IntPtr _handle, Rectangle _rect, Boolean _ovl, int _format, int _rate, Boolean isAudioActive)
{
Boolean ret = true;
int channel = GetPosChannel(posNo);
if (!startPrev(channel, _handle, _rect, _ovl, _format, _rate))
{
ret = false;
}
if (isAudioActive)
{
if (!startAudioPrev(channel))
{
ret = false;
}
}
return ret;
}

startPrevi(我需要写入句柄的方法)是C++DLL方法的委托,我无法访问代码。。。。。

您无法从windows服务与桌面交互。。。远远不够。有一个与桌面交互的选项,您可以从服务的属性窗口中设置,但这有点古怪。

我可以建议的另一种选择是,在服务中对图片缓冲区进行排队,并通过wcf/sockets公开一个api,以先进先出的方式发送缓冲区。在你的应用程序上,你可以有一个计时器,它可以获得这些缓冲区,并在你的图片盒中渲染它们