gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:39:40 24 4
gpt4 key购买 nike

我使用非托管库从网络摄像机获取视频流。有功能:

[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")]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 中)将是一个有用的程序,用于监视消息并确保句柄值和事件符合您的预期。

关于c# - 无法将 winform 控件大小传递给非托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16031253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com