SendMessage视频捕捉功能

时间:2010-05-29 20:31:07

标签: c# .net webcam video-capture sendmessage

我使用代码示例连接到网络摄像头,并不真正理解传递给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 个答案:

答案 0 :(得分: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位操作系统上正常工作。

答案 1 :(得分: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

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