C# SendMessage视频捕获常量

C# SendMessage视频捕获常量,c#,.net,webcam,video-capture,sendmessage,C#,.net,Webcam,Video Capture,Sendmessage,我正在使用一个代码示例连接到网络摄像头,但并不真正理解传递给SendMessage方法的变量的含义 SendMessage(DeviceHandle, WM_CAP_SET_SCALE, -1, 0) SendMessage(DeviceHandle, WM_CAP_SET_PREVIEW, -1, 0) -1是什么意思?缩放/预览还是不缩放/预览?我更喜欢使用0/1,0表示false,不知道-1是什么意思 SendMessage(DeviceHandle, WM_CAP_EDIT_COPY

我正在使用一个代码示例连接到网络摄像头,但并不真正理解传递给SendMessage方法的变量的含义

SendMessage(DeviceHandle, WM_CAP_SET_SCALE, -1, 0)

SendMessage(DeviceHandle, WM_CAP_SET_PREVIEW, -1, 0)
-1是什么意思?缩放/预览还是不缩放/预览?我更喜欢使用0/1,0表示false,不知道-1是什么意思

SendMessage(DeviceHandle, WM_CAP_EDIT_COPY, 0, 0);
在这种情况下,零意味着什么?或者这个消息只是无效的,零没有任何意义,类似于最后一个零参数

顺便问一下,最后一个零参数是什么意思

非常感谢:)

消息启用或禁用预览视频图像的缩放

消息启用或禁用预览模式

消息将视频帧缓冲区和相关调色板的内容复制到剪贴板

下一个签名是:

LRESULT WINAPI SendMessage(
  __in  HWND hWnd,
  __in  UINT Msg,
  __in  WPARAM wParam,
  __in  LPARAM lParam
);
其中,
wParam
lParam
-是“附加消息特定信息”
Wparam
type表示
word
Lparam
表示
long


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

您可能已经找到了最初用Visual Basic编写的示例代码。SendMessage()的WParam参数被记录为BOOL。它应该是FALSE(0)或TRUE(1)。VB6的一个奇怪之处是它的布尔真值是-1。原因有点模糊,与它和或操作符的工作方式有关

您当前的代码是偶然工作的,解释消息的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中-1是什么意思?大多数时候(据我所见)
-1在C/C++中表示“不适用”。如果消息描述不包含关于其他参数的任何注释,我认为这意味着该消息不需要它们。另外,0表示
NULL
即“未发送附加参数”,我发现在大多数情况下使用0/1。我认为在这种情况下,也许-1意味着“不是零=真”,也就是简单的真。奇怪,但有道理:SSome语言使用-1作为它们的真值,因为在两个补码中它会产生所有的位集。一些更正确的声明非常感谢你们,我从来不知道这一点。我会马上把它修好。顺便说一句,对于任何外部方法,有没有一个地方可以看到其他重载?@Rita,我给你的声明是自然声明。您可以对P/Invoke封送器进行“撒谎”,并添加具有不同参数类型的其他封送器。用于向结构传递指针。既然有什么进展,就没有全面的清单。然而,Windows中实际上只有一个函数。我建议你只有在知道自己在做什么时才这样做。@Hans:我指的是外部声明的“标准方式”。例如,此方法:UINT WINAPI registerwindwessage(u in LPCTSTR lpString);如果我想导入它,我怎么知道写声明的正确方式?还是仅仅通过自己理解和翻译参数?类似于[DllImport(“User32.dll”)]受保护的静态外部intregisterwindwessage(string lpString)?