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

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

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

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

我怎么解决这个问题?

谢谢!

Cal*_*ett 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 中)将是一个有用的程序,可以监视消息并确保句柄值和事件符合您的预期。