Я использую пример кода для соединения с веб-камерой и действительно не понимаю, что значение переменных передало методу 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, что последнее обнуляет средний аргумент?
Заранее большое спасибо :)
Вы, вероятно, нашли пример кода, который изначально был написан на 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-битной операционной системе.
Сообщение 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
означает длинный
.
Эти параметры являются необязательными и могут использоваться или не могут использоваться. Таким образом, один из них или оба используются, если какое-то сообщение требует отправки дополнительных данных.