1

我正在使用代码示例连接到网络摄像头,并不太了解传递给 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);

在这种情况下,零是什么意思?还是这条消息只是无效并且零没有意义,类似于最后一个零参数?

顺便说一句,最后一个零参数是什么意思?

非常感谢你:)

4

2 回答 2

2

您可能已经找到最初用 Visual Basic 编写的示例代码。SendMessage() 的 WParam 参数被记录为 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 位操作系统上正常工作。

于 2010-05-29T22:10:15.313 回答
0

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
);

其中wParamlParam- 是“附加消息特定信息”。Wparam类型手段wordLparam手段long

该参数是可选的,可以使用也可以不使用。因此,如果某些消息需要发送附加数据,则使用其中之一或两者。

于 2010-05-29T20:52:16.460 回答