1

コード サンプルを使用して Web カメラに接続していますが、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);

この場合のゼロは何を意味するのでしょうか? それとも、このメッセージは単に無効であり、最後のゼロ引数と同様にゼロには意味がありませんか?

ところで、最後のゼロ引数はどういう意味ですか?

事前にどうもありがとうございました :)

4

2 に答える 2

2

おそらく、もともとVisualBasicで記述されたサンプルコードを見つけたことがあるでしょう。SendMessage()のWParam引数は、BOOLであると文書化されています。FALSE(0)またはTRUE(1)のいずれかである必要があります。VB6の癖は、ブール値のTRUE値が-1であることです。その理由は少しあいまいで、ANDおよびOR演算子の動作方法に関連しています。

現在のコードは誤って機能します。メッセージを解釈するWindowsコードは、ゼロ以外の値を単に「TRUE」として扱います。

ただし、より大きな問題があります。SendMessage()宣言が間違っています。WParamおよびLParam引数は、おそらく32ビット値の「int」として宣言されています。ただし、64ビットオペレーティングシステムでは、64ビット値になります。このようなオペレーティングシステムでは、SendMessage()呼び出しはひどく失敗します。また、すでに64ビットオペレーティングシステムを使用していて、これらの引数がVB6で宣言された方法であるLongとして宣言されている可能性もあります。この場合、コードは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
);

wParamと- は「メッセージ固有lParamの追加情報」です。Wparamタイプ 手段wordおよびLparam手段long

このパラメーターはオプションであり、使用することも使用しないこともできます。したがって、一部のメッセージで追加データの送信が必要な場合は、これらのいずれかまたは両方が使用されます。

于 2010-05-29T20:52:16.460 に答える