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

本文关键字:非托管代码 winform 控件 | 更新日期: 2023-09-27 18:09:29

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

  1. 设置pictureBox.Size
  2. 使用WinAPI SetWindowPos:
<>之前[DllImport("user32.dll")]私有静态外部bool SetWindowPos()IntPtr hWnd,IntPtr hWndInsertAfter,int x,int y,int宽度,int高度,使用uint uFlags);之前

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

我该如何解决这个问题?

谢谢!

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

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