snk*_*snk 8 c# c++ mfc winforms
我使用非托管库来从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
);
Run Code Online (Sandbox Code Playgroud)
这pClientInfo是一个指向结构类型的指针:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
protected struct LiveConnect
{
public UInt32 dwChannel;
public IntPtr hPlayWnd;
public UInt32 dwConnectMode;
}
Run Code Online (Sandbox Code Playgroud)
其中hPlayWnd是必须输出视频流的窗口句柄.该库通过此窗口的大小(在调用期间Network_ClientStartLive)检测视频分辨率.我在C++ MFC程序上检查了它,其中输出窗口是Picture control通过设置大小和方法MoveWindow定义的输出视频分辨率.
在这个程序的C#版本中,我使用PictureBox-control来绘制视频流.显示视频,但其大小PictureBox不影响视频流分辨率.我尝试了几种方法来改变PictureBox大小:
pictureBox.SizeSetWindowPos:
[DllImport("user32.dll")]
private static extern bool SetWindowPos(
IntPtr hWnd,
IntPtr hWndInsertAfter,
int x,
int y,
int width,
int height,
uint uFlags);
在这两种方法中,控件的大小都已更改,但相机库继续以最大分辨率输出视频流.
我怎么解决这个问题?
谢谢!
Windows 窗体中的每个控件都有一个 SizeChanged ( http://msdn.microsoft.com/en-us/library/system.windows.forms.control.sizechanged(v=vs.110).aspx ) 事件。也许可以在此事件处理程序中添加代码来手动更改视频分辨率?如果不是,您提供的 PictureBox 句柄可能不会发送 WM_SIZE 消息,而这正是非托管库所寻找的消息。正如其中一条评论中提到的,Spy++(包含在 Visual Studio 中)将是一个有用的程序,可以监视消息并确保句柄值和事件符合您的预期。
| 归档时间: |
|
| 查看次数: |
491 次 |
| 最近记录: |