我在使用C ++ / C#开发解决方案时遇到了麻烦。 我有一个由Windows服务管理的DLL和一个通过WCF和套接字与此服务通信的用户应用程序。 DLL管理一个视频捕获板,它有一个功能,可以在窗口句柄中(从图片框或面板中)写入它正在捕获的视频。
我正在尝试做什么:创建一个图片框并将句柄通过WCF传递给使用此句柄调用DLL函数startpreview的服务。
问题:当我将Service Proccess作为用户应用程序运行时,一切正常,但是当我作为Windows服务运行时,startpreview函数不会写入我的句柄。
有人知道我该如何解决这个问题? 最诚挚的问候。
@Edit
此代码创建图片框并附加到flowlayoutpanel。 这在用户应用程序中执行,该用户应用程序通过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;
}
startPrev(我需要写入句柄的方法)是C ++ DLL方法的委托,我无法访问代码......
答案 0 :(得分:0)
您无法通过Windows服务与桌面交互......远远不够。您可以从服务的属性窗口设置与桌面交互选项,但这有点不稳定。
我可以建议的另一个选择是你在服务中排队你的图片缓冲区并通过wcf / sockets公开一个api,以先进先出的方式发送缓冲区。 在您的应用程序中,您可以使用一个计时器来获取这些缓冲区并将其呈现在您的图片框中