Видеосъемка SendMessage consts

Я использую пример кода для соединения с веб-камерой и действительно не понимаю, что значение переменных передало методу 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);

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

Btw, что последнее обнуляет средний аргумент?

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

1
задан abatishchev 29 May 2010 в 20:32
поделиться

2 ответа

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

Ваш текущий код работает случайно, код Windows, интерпретирующий сообщение, просто рассматривает любое ненулевое значение как "TRUE".

Однако есть и более серьезная проблема: ваше объявление 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-битной операционной системе.

2
ответ дан 3 September 2019 в 00:14
поделиться

Сообщение 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 означает слово , а Lparam означает длинный .

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

0
ответ дан 3 September 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: