【问题标题】:Can not pass winform control size into unmanaged code无法将 winform 控件大小传递给非托管代码
【发布时间】:2013-04-08 12:23:18
【问题描述】:

我使用非托管库从 IP 摄像机获取视频流。 有功能:

[DllImport("client.dll", EntryPoint = "Network_ClientStartLive", SetLastError = true)]
protected static extern int Network_ClientStartLive(
        ref IntPtr pStream,
        IntPtr hDev,
        IntPtr pClientInfo,
        [MarshalAs(UnmanagedType.FunctionPtr)] ReadDatacbf lpfnCallbackFunc = null,
        UInt32 dwUserData = 0
    );

pClientInfo 是指向以下结构类型的指针:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
protected struct LiveConnect
{
    public UInt32 dwChannel;
    public IntPtr hPlayWnd;
    public UInt32 dwConnectMode;
}

其中hPlayWnd 是必须输出视频流的窗口句柄。 该库通过此窗口的大小检测视频分辨率(在调用Network_ClientStartLive 期间)。我在 C++ MFC 程序上检查了它,其中输出窗口为 Picture control,并通过使用方法 MoveWindow 设置大小来定义输出视频分辨率。

在这个程序的 C# 版本中,我使用 PictureBox-control 来绘制视频流。视频显示,但PictureBox 的大小不影响视频流分辨率。我尝试了几种方法来改变PictureBox的大小:

  1. 设置pictureBox.Size
  2. 使用 WinAPI SetWindowPos:
[DllImport("user32.dll")] 私有静态外部布尔 SetWindowPos( IntPtr hWnd, IntPtr hWndInsertAfter, 整数 x, 整数, 整数宽度, 整数高度, uint uFlags);

在这两种方法中,控件的大小都发生了变化,但相机库继续以最大分辨率输出视频流。

我该如何解决这个问题?

谢谢!

【问题讨论】:

  • 我想不出故障模式,就非托管代码所关心或看到的而言,.NET PictureBox 和非托管图片控件之间没有根本区别。考虑您传递错误窗口句柄的可能性。像表单或桌面的(空)。联系相机库供应商或作者寻求支持,他们可以轻松调试。
  • 我也怀疑句柄不对。将您传递给日志的句柄写入日志,并在您的应用程序运行时,使用 Spy++ 实用程序选择图片框。如果句柄 Spy++ 与您记录的句柄不匹配,您就会知道发生了什么事。

标签: c# c++ winforms mfc


【解决方案1】:

Windows 窗体中的每个控件都有一个 SizeChanged (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.sizechanged(v=vs.110).aspx) 事件。也许可以在此事件处理程序中添加代码以手动更改视频分辨率?如果没有,您提供的 PictureBox 句柄可能不会发送 WM_SIZE 消息,这将是非托管库要查找的消息。如其中一个 cmets 所述,Spy++(包含在 Visual Studio 中)将是一个有用的程序,用于监视消息并确保句柄值和事件符合您的预期。

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多