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

时间:2013-04-16 07:35:06

标签: c# c++ winforms mfc

我使用非托管库从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 - 控件来绘制视频流。视频会显示,但PictureBox的大小不会影响视频流的分辨率。我尝试了几种方法来更改PictureBox大小:

  1. 设置pictureBox.Size
  2. 使用WinAPI SetWindowPos
  3. [DllImport("user32.dll")]
    private static extern bool SetWindowPos(
        IntPtr hWnd, 
        IntPtr hWndInsertAfter,
        int x, 
        int y, 
        int width, 
        int height, 
        uint uFlags);
    

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

    我该如何解决这个问题?

    谢谢!

1 个答案:

答案 0 :(得分: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中)将是一个有用的程序来监视消息,并确保句柄值和事件是您期望的。