首页 文章

无法将winform控件大小传递给非托管代码

提问于
浏览
7

我使用非托管库来从IP Camera获取视频流 . 有功能:

[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 大小:

  • 设置 pictureBox.Size

  • 使用WinAPI SetWindowPos

[DllImport("user32.dll")]
private static extern bool SetWindowPos(
    IntPtr hWnd, 
    IntPtr hWndInsertAfter,
    int x, 
    int y, 
    int width, 
    int height, 
    uint uFlags);

在这两种方法中,控件的大小都已更改,但相机库继续以最大分辨率输出视频流 .

我怎么解决这个问题?

谢谢!

1 回答

  • 1

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

相关问题