Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017/04/15 (土)

ステータスをゲットしてみる

| 14:37 | ステータスをゲットしてみる - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - ステータスをゲットしてみる - 雪乃☆雫のなでしこ日和 ステータスをゲットしてみる - 雪乃☆雫のなでしこ日和 のブックマークコメント

 実際に、キャプチャーウィンドウのステータスをゲットしてみる。

 同じようにやれば出来るハズ~・・・なんだけど、なかなかそうは問屋が卸さなかった><;


 さて、CAPSTATUS構造体は、何だかわからんものが多いけど、とりあえず幅と高さしか使う予定無いから、他の部分はコピペしただけ~;

 でもたぶんここは問題ないはず。

#https://msdn.microsoft.com/en-us/library/windows/desktop/dd756939(v=vs.85).aspx
■CAPSTATUS
 ・幅
 ・高さ
 ・fLiveWindow
 ・fOverlayWindow
 ・fScale
 ・ptScroll
 ・fUsingDefaultPalette
 ・fAudioHardware
 ・fCapFileExists
 ・dwCurrentVideoFrame
 ・dwCurrentVideoFramesDropped
 ・dwCurrentWaveSamples
 ・dwCurrentTimeElapsedMS
 ・hPalCurrent
 ・fCapturingNow
 ・dwReturn
 ・wNumVideoAllocated
 ・wNumAudioAllocated

 しかし、まずは早くもPACKエラー発生(´д`;

PACK(CAPSTATUS,S,"UINT,UINT,BOOL,BOOL,BOOL,POINT,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")

 エラーの内容としては、こんな感じ。

[エラー] 6,ステータスをゲットしてみる.nako.bak(233): 関数UNPACK』の
実行中にエラーが起きました。PACK規則の設定に失敗。構造体の定義エラー
「POINT」は未定義(関数)

 これまた意味も分からずコピペしてきただけだもんね~。

 でも、UINTやらBOOLなどもなでしこで使える型に単純置換してくれるらしいコトだったので、このままで行けるかと思ったのにぃ~。

https://nadesi.com/doc/system/sys-1-DLL-WindowsAPI.htm#head1

 PナントカはPOINTERにとゆうことだったので、

PACK(CAPSTATUS,S,"UINT,UINT,BOOL,BOOL,BOOL,POINTER,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")

 としてみたら、通ったっぽい。

 次にいよいよ「WM_CAP_GET_STATUS」のメッセージを送信しようとしたところ、またまた、GetWindowRectの時にはなかった問題が発生。

#https://msdn.microsoft.com/en-us/library/windows/desktop/dd743906
!WM_CAP_GET_STATUS=$400+54         # キャプチャウィンドウのステータスを取得します。

 二つ目のパラメーターは、同様に「POINTER(S)」でいいとして・・・

 一つ目のパラメーター「sで参照される構造体のサイズ(バイト単位)」・・・ってなんすかヽ(;´Д`)ノ

 C(?)とかだと「sizeof」なる関数があって取得出来るらしいんだけど・・・ああ、マジックナンバーってそうゆうことか・・・

(だんだんナゾな独り合点が多くなっていきますが、気にしないで!www)

 コレはどうやら、SHORTが2バイトであったり、DWORDやLONGが4バイトであったり、LONGLONGが8バイト・・・的なコトの合計らしい。

 とりあえず・・・大は小を兼ねるのかどうかすら分からんけど、仮に144とか入れてみる。

メッセージ送信(ハンドル,WM_CAP_GET_STATUS,144,POINTER(S))    # Size=バイト単位。S=CAPSTATUS構造体へのポインタ。

 ところが度は、UNPACKのところでエラーが出てしまう。

[エラー] 6,ステータスをゲットしてみる.nako.bak(233): 関数UNPACK』の
実行中にエラーが起きました。PACK変数代入失敗。モジュール 'dnako.dll'
 のアドレス 0228B034 でアドレス 00000000 に対する読み込み違反がおきました。(関数)

 読込違反とか、マジでキライさ! 何言ってんのか分かんないんだもんヽ(;´Д`)ノ

 しかし、「PACK変数代入失敗」とか言ってるので・・・またまた型の指定とかなのか。PACKでは通ったのに、まだダメなんすか。

 だいたい、もの型の意味がわかんないから、9種類のうちのどれに置換されてんのかも分からん;

 もー半ばヤケで、

UNPACK(S,CAPSTATUS,"long,long,long,long,long,long,long,long,long,long,long,long,long,long,long,long,long")

 こんなことしてみたら、なんと動いた! えー;;;

 動いたことだし、このままでもいいかと思ったんだけど(こら;)、いちおういっこいっこ、どれが良くないのか確認してみたら、またもや6番目のPOINTERだった。えええ~??

 やっぱ、ぽいんたぁはキモンなのか。

 鬼門には近づきたくないので、深く追求せず、このようにしておく(爆)

UNPACK(S,CAPSTATUS,"UINT,UINT,BOOL,BOOL,BOOL,long,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")

 まあ・・・いちおうコレでステータスは取得でき、キャプチャーウィンドウの幅と高さが分かるようになりました。

 ところで、全部LONGで行けるのなら、マジックナンバーは18*4=72で良いのではないかと思ったんだけどダメで、ステータスが0になってしまった。むむむ~;

 地道に1づつ手動で(爆)増やしていってみたところ、76で行けました。

 でっ、とりあえずこんな感じ。

#-----------------------------------------------------------
CWとはCAPSTATUS。
CWハンドルのステータス取得。
#-----------------------------------------------------------
!WM_CAP_GET_STATUS=$400+54         # キャプチャウィンドウのステータスを取得します。
●ステータス取得(ハンドルの)
  PACK(CW,S,"UINT,UINT,BOOL,BOOL,BOOL,POINTER,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")
  メッセージ送信(ハンドル,WM_CAP_GET_STATUS,76,POINTER(S))    # Size=バイト単位。S=CAPSTATUS構造体へのポインタ。
  UNPACK(S,CW,"UINT,UINT,BOOL,BOOL,BOOL,long,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")
#-----------------------------------------------------------

 ここまでくれば、あとはそれ母艦に反映してやるだけ。

#-----------------------------------------------------------
*ウィンドウサイズ設定
  CWハンドルのステータス取得。
  母艦のクライアント幅はCWの幅
  母艦のクライアント高さはCWの高さ
  母艦中央移動。
#-----------------------------------------------------------

 起動時と、ビデオ形式のダイアログを開いた後に、ウィンドウサイズ設定してやればOK。

#-----------------------------------------------------------
!WM_CAP_DLG_VIDEOFORMAT=$400+41    # ビデオ形式を選択できるダイアログボックスが表示されます。
●ビデオ形式ダイアログ
  メッセージ送信(CWハンドル,WM_CAP_DLG_VIDEOFORMAT,0,0)
  ウィンドウサイズ設定。
  CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。
#-----------------------------------------------------------

 ・・・なんかまたまた大事なことを棚上げした気がするけど、ここまで><;

うぇいくうぇいく2017/04/15 21:18念のため。

https://msdn.microsoft.com/ja-jp/library/8kk2sy33.aspx
(型名まで日本語に訳されてしまっているのは誤訳。)

POINTは、構造体を用いた型で、2つのlongにより座標を折らわすのに使われます。
(RECTが四角を表す構造体を用いた型)

ポインターなら、LPRECTや、LPPOINTのように、元の型名の前にLPを付けた型名になっているはずです。
(LPはlong pointerの略。たぶん。)

雪乃☆雫雪乃☆雫2017/04/16 00:21うぇいくさま、ありがとうございます~!!
POINTとPOINTERは違ったんですね(^▽^;
おおぉ、そして、おかげさまでナゾが一つ解明しました。
なんで72じゃなく76になるのかさっぱり分からんと思っていたのですが、longが二つ分だったのですね!
それにしても、構造体の中にまたこーぞーたい・・・あああ(@_@)

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170415