win32API для захвата изображения - PullRequest
0 голосов
/ 12 марта 2019

Я написал приложение на C # для захвата изображения с веб-камеры. Приложение использует вызовы Win32 API и прекрасно работает на моем ноутбуке win 10 lenovo и аналогично ноутбукам Lenovo разных моделей и ОС (Win 7 и Win 10).

Когда я пытаюсь запустить приложение на lenovo Thinkcenter со встроенной камерой, я получаю черный экран (без исключений). Приложение камеры на Thinkcenter, поставляемое с Win 10, прекрасно работает, как и приложения сторонних производителей, которые я установил, чтобы убедиться, что камера работает и что любые политики безопасности не препятствуют доступу к камере моего приложения.

Драйверы (realtek) обновлены, и я также попробовал универсальные драйверы для Windows, но мое приложение все еще дает мне черный экран на этом ПК Thinkcenter.

Загорается светодиод, сообщая, что есть некоторое взаимодействие с оборудованием, но нет изображения.

Я также отключил встроенную камеру и подключил 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();            
    }       
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...