Я написал приложение на 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();
}
}