SendMessage видео захват - PullRequest
       22

SendMessage видео захват

1 голос
/ 30 мая 2010

Я использую пример кода для подключения к веб-камере и не совсем понимаю значение переменных, передаваемых методу SendMessage.

SendMessage(DeviceHandle, WM_CAP_SET_SCALE, -1, 0)

SendMessage(DeviceHandle, WM_CAP_SET_PREVIEW, -1, 0)

Что означает -1? Для масштабирования / предварительного просмотра или не для масштабирования / предварительного просмотра? Я бы предпочел, чтобы использовался ноль / единица, ноль означает ложь, и я понятия не имею, что означает -1.

SendMessage(DeviceHandle, WM_CAP_EDIT_COPY, 0, 0);

Что означает ноль в этом случае? Или это сообщение просто недействительно и ноль не имеет значения, аналогично последнему нулевому аргументу?

Кстати, что означает последний нулевой аргумент?

Заранее большое спасибо:)

Ответы [ 2 ]

2 голосов
/ 30 мая 2010

Вы, вероятно, нашли пример кода, который был изначально написан на Visual Basic.Аргумент WParam для SendMessage () задокументирован как BOOL.Это должно быть либо ЛОЖЬ (0), либо ИСТИНА (1).Причудой VB6 является то, что его логическое значение ИСТИНА равно -1.Причина немного неясна и связана с тем, как работают операторы AND и OR.

Ваш текущий код работает случайно, код Windows, который интерпретирует сообщение, просто обрабатывает любое ненулевое значение как «ИСТИНА».

Однако существует более серьезная проблема: ваше объявление SendMessage () неверно.Аргументы WParam и LParam, вероятно, объявлены как «int», 32-битное значение.Однако в 64-разрядных операционных системах они являются 64-разрядными.В такой операционной системе ваш вызов SendMessage () потерпит неудачу.Также есть некоторые шансы, что вы уже работаете в 64-битной операционной системе, и эти аргументы объявлены как Long, как они были объявлены в VB6.В этом случае ваш код не будет работать в 32-разрядной операционной системе.

Правильная декларация для SendMessage:

 [DllImport("user32.dll")]
 private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

И правильный способ отправки сообщения:

 SendMessage(DeviceHandle, WM_CAP_SET_SCALE, (IntPtr)1, IntPtr.Zero);

Это будет правильно работать как в 32-битных, так и в 64-битных операционных системах.

0 голосов
/ 30 мая 2010

WM_CAP_SET_SCALE сообщение включает или отключает масштабирование видеоизображений для предварительного просмотра

WM_CAP_SET_PREVIEW сообщение включает или отключает режим предварительного просмотра

WM_CAP_EDIT_COPY сообщение копирует содержимое буфера видеокадра и соответствующей палитры в буфер обмена

SendMessage имеет следующую подпись:

LRESULT WINAPI SendMessage(
  __in  HWND hWnd,
  __in  UINT Msg,
  __in  WPARAM wParam,
  __in  LPARAM lParam
);

Где wParam и lParam - «Дополнительная информация, специфичная для сообщения». Wparam означает тип word и Lparam означает long.

Эти параметры являются необязательными и могут использоваться или не использоваться. Поэтому один из них или оба используются, если для какого-либо сообщения требуются дополнительные данные.

...