• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Проблема Снимок с камеры с помощью C#

Yivo

One Level
13.12.2016
3
3
BIT
0
Добрый день, форумчане.
Требуется написать программу, которая могла бы делать снимок с web камеры.
На данный момент нагуглил такое решение:
C#:
using System;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Collections.Generic;
using System.Runtime.InteropServices;
    
namespace Snaps_cam
{
    class Program
    {
        private const int WM_CAP_DRIVER_CONNECT = 0x40a;
        private const int WM_CAP_DRIVER_DISCONNECT = 0x40b;
        private const int WS_CHILD = 0x40000000;
        private const int WS_POPUP = unchecked((int)0x80000000);
        private const int WM_CAP_SAVEDIB = 0x419;
        
        [DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]
        public static extern IntPtr capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);
        
        [DllImport("user32", EntryPoint = "SendMessage")]
        public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
        
        static void Snaps_cam()
        {
            String dName = "".PadRight(100);
            String dVersion = "".PadRight(100);
            IntPtr hWndC = capCreateCaptureWindowA("VFW Capture", WS_POPUP | WS_CHILD, 0, 0, 320, 240, 0, 0); // узнать дескриптор камеры
            SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); //подключиться к камере
            string path = Environment.GetEnvironmentVariable("USERPROFILE") + "\\Pictures\\" + DateTime.Now.ToString("yyyy.MM.dd HH.mm.ss") + ".jpg";
            IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
            SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt32()); // сохранить скриншот
            SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); //отключить камеру
        }
        
        public static void Main()
        {
            Snaps_cam();
        }
    }
}
Данный код делает снимок и сохраняет его в папку пользователя "Изображения". Все бы ничего, но данный код отрабатывает лишь один раз.
При попытке запустить его повторно, система предлагает выбрать "видео устройство", которое у меня одно:

1.jpg


И вместо изображения появляется пустой файл (размером 0 байт)

Буду благодарен, если укажете в чем здесь ошибка
 
M

Markus.c99

Может мне быдло-кодеру на c# сюда лезть не стоит,но как ты предполагаешь что бы он работал более одного раза?Если у тебя там ни цикла ничего.Добавь хоть таймер :D
 

joomboosick

New member
18.07.2018
4
0
BIT
1
Может мне быдло-кодеру на c# сюда лезть не стоит,но как ты предполагаешь что бы он работал более одного раза?Если у тебя там ни цикла ничего.Добавь хоть таймер :D
это класс, его какбэ можно из основной программы вызывать
 

h4x0r

Member
11.03.2019
11
-11
BIT
0
У меня были проблемы с работой этого кода на .NET 4.x.x, но на 4.0 все работало в штатном режиме и без багов
 
  • Не нравится
Реакции: mrOkey
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!