无法将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
的大小:
- 设置
pictureBox.Size
- 使用WinAPI
SetWindowPos
:
在这两种方法中,控件的大小都被改变,但摄像机库继续以最大分辨率输出视频流。
我该如何解决这个问题?
谢谢!
Windows窗体中的每个控件都有一个SizeChanged (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.sizechanged(v=vs.110).aspx)事件。也许有可能在这个事件处理程序中添加代码来手动更改视频分辨率?如果没有,您提供的PictureBox句柄可能不会发送WM_SIZE消息,这将是非托管库将寻找的。正如在一个评论中提到的,spy++(包含在Visual Studio中)将是一个有用的程序,用于监视消息,并确保句柄值和事件是您所期望的。