win32API捕获图像

时间:2019-03-11 23:44:18

标签: api winapi camera

我已经编写了一个C#应用程序来从网络摄像头捕获图像。该应用程序使用win32 API调用,并且可以在我的win 10联想笔记本电脑上正常运行,并且可以与各种型号和操作系统(Win 7和Win 10)的联想笔记本电脑类似地工作。

当我尝试在带有集成摄像头的联想Thinkcenter上运行该应用程序时,出现黑屏(未引发任何异常)。 Win 10随附的Thinkcenter上的摄像头应用程序可以很好地工作,就像我安装的第3方应用程序一样可以正常运行,以验证摄像头可以正常运行,并且任何安全策略都不会阻止我的应用程序访问摄像头。

驱动程序(realtek)是最新的,我也尝试了通用Windows驱动程序,但是我的应用程序在此Thinkcenter PC上仍然给我黑屏。

led亮起,告诉我与硬件存在某种交互,但没有图像。

我还禁用了集成摄像头,并插入了USB摄像头,这可以正常工作。因此,无论问题出在哪里,似乎都是相机(和我的代码)所特有的。

作为Win32API编程的新手,我想知道如何解决此问题。如果有人有任何建议或指点,我将不胜感激。

public partial class Window1 : MetroWindow
{

    IntPtr deviceHandle;       
    public const uint WM_CAP_DRIVER_CONNECT = 0x40a;
    public const uint WM_CAP_SET_PREVIEW = 0x432;
    public const uint WM_CAP_SET_PREVIEWRATE = 0x434;
    public const uint WM_CAP_SET_SCALE = 0x435;
    public const uint WS_CHILD = 0x40000000;
    public const uint WS_VISIBLE = 0x10000000;      

    [DllImport("avicap32.dll")]
    public extern static IntPtr capCreateCaptureWindow(string title, uint style, int x, int y, int width, int height, IntPtr window, int id);

    [DllImport("user32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    [DllImport("user32.dll")]
    public static extern IntPtr SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    [DllImport("user32.dll")]
    extern static IntPtr GetClipboardData(uint uFormat);  

    public Window1()
    {
        InitializeComponent();           
    }

    public void GetCamera()
    {           
        deviceHandle = capCreateCaptureWindow(string.Empty, WS_VISIBLE | WS_CHILD, 0, 0, (int)ImgWebCam.Width, (int)ImgWebCam.Height, new WindowInteropHelper(this).Handle, 0);

        if (SendMessage(deviceHandle, WM_CAP_DRIVER_CONNECT, (IntPtr)0, (IntPtr)0).ToInt32() > 0)
        {
            SendMessage(deviceHandle, WM_CAP_SET_SCALE, (IntPtr)(-1), (IntPtr)0);
            SendMessage(deviceHandle, WM_CAP_SET_PREVIEWRATE, (IntPtr)0x42, (IntPtr)0);
            SendMessage(deviceHandle, WM_CAP_SET_PREVIEW, (IntPtr)(-1), (IntPtr)0);
            SetWindowPos(deviceHandle, new IntPtr(0), 0, 0, (int)ImgWebCam.Width, (int)ImgWebCam.Height, 6);
        }
    }

    private void Start(object sender, RoutedEventArgs e)
    {
        //StartQRScanning();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        GetCamera();            
    }       
}

0 个答案:

没有答案