Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017-04-12

こーぞーたいを学ぶよ!

| 20:52

 こーぞーたいだのぽいんたあだのって・・・なんかソレ系は、非常に敷居が高い気がして、なるべく避けて通るようにしていた命題なんですが・・・

 なんでいきなりーゆうことになったかと言うと、例のカメラですね。

 またちょっと目をしながらVFWのメッセージを眺めていて・・・

 ちょっと、ダイアログを出してみたわけですよ。これは、取りあえず送れば出る簡単なメッセージなので。

 出せるダイアログは、「VIDEOFORMAT(ビデオ形式)」「VIDEOSOURCE(ビデオソース)」「VIDEODISPLAYT(ビデオ出力)」「VIDEOCOMPRESSION(圧縮器)」の4種類あって、実際に出せるかどうかは、カメラに依存しているラシイです。

#-----------------------------------------------------------
!WM_CAP_DLG_VIDEOFORMAT=$400+41
●ビデオ形式ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOFORMAT,0,0)

!WM_CAP_DLG_VIDEOSOURCE=$400+42
●ビデオソースダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOSOURCE,0,0)

!WM_CAP_DLG_VIDEODISPLAY=$400+43
●ビデオ出力ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEODISPLAYT,0,0)

!WM_CAP_DLG_VIDEOCOMPRESSION=$400+46
●圧縮器ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOCOMPRESSION,0,0)
#-----------------------------------------------------------

 うちで出せたのは、ビデオ出力を除く3種類で、しかし、圧縮器とは何なのか全く分からないので無視するとして(えっ)ビデオ形式や、ビデオソースは、(別に使わないけど)ちょっとあると、本物っぽくて(?)いいかなあと思ったのが運の尽き!

 ビデオソースの方は、特に問題ありません(たぶん)

 問題は、ビデオ形式で、解像度が変えられるわけなんだけど・・・ビデオの解像度は変わりますが、当然のことながら、母艦のサイズは変わらないので、640*480の母艦の左上に、ちっちゃこいビデオ映像が表示されるとゆーことになってしまいます。

 ビデオ形式ダイアログで解像度を変更したら、変更したキャプチャーウィンドウのサイズを、母艦のサイズに反映しなくちゃいけません。

 しかも、この解像度変更は、プログラムを終了しても元に戻らんので、次起動時も見事にの状態で、起動して来ちゃうんですよね><

 起動時の母艦のサイズも、本当は、640*480で決め打ちではダメで、キャプチャーウィンドウのサイズに合わせてやらなくちゃいけなかったんです。

 ちょっと現実逃避しようと思って別のコトしたら、こっちでもまたキビシイ現実に直面するとゆう、いつものパターン><

(ちょっとリバーシについて考えはじめたのが違いの元ってゆう・・・ミニだかマックスだかアルファだかベータだか、なんかもーわけ分からんヽ(;´Д`)ノ ・・・やっぱ初心で、とりあえずはしりとりかな;)


 さてこでのキャプチャーウィンドウのサイズを知るには、「WM_CAP_GET_STATUS」で、キャプチャーウィンドウのステータスをゲットしなくちゃいけない。一体どこからゲットするかというと、「CAPSTATUS」とゆう構造体からだよって話なんです。

 winAPIでなんかかんかする場合、SETする系はたいてい、ちゃんと送りさえすればこちらが特に意識しなくても値をセットしてくれて動くんだけど、GETするにはどうやら構造体から逃れられないっぽいため、これまではつとめてGETしないよう心がけていたのです(なにそれ;)

 だって、も、こーぞーたいってなんすか・・・。しくしくしく。


 うっすらと分かっているのは、

・目的の構造体と同じ構成の、なでしこのグループを作る。
・PACKグループを構造体にする。→APIで操作。
・UNPACKで構造体をグループにする。→なでしこで操作。

 ・・・的な???

 以前やったジョイパッドを使うAPIのプログラムで使われていて、何の呪文だかさっぱり分からんと思い調べた結果、こんな感じラシイと分かったものの、理解するには到らなかったんです;;;

 しかしまーワタシも近頃は色々ひらめいて、だいぶ賢くなってきてますからっ!

 コレを使って、以前スクリーンセーバーの時に、なんだか分からんと無視した「GetWindowRect」をやってみようと思う。

 ばいなりしゅとくやかくほはいまだよく分からないけど、とりあえずPACKUNPACKで同じコトができーな気がしてきた☆

#-----------------------------------------------------------
#まずはGetWindowRectを使えるようにする。
#https://msdn.microsoft.com/ja-jp/library/cc364769.aspx
#指定されたウィンドウの左上端と右下端の座標をスクリーン座標で取得します。
#スクリーン座標は、表示画面の左上端が (0,0) となります。
#-----------------------------------------------------------
●WinRect取得(hWnd,lpRect)=DLL("user32.dll",
"BOOL GetWindowRect(
HWND hWnd,      // ウィンドウのハンドル
LPRECT lpRect   // ウィンドウの座標値
)")

#-----------------------------------------------------------
#構造体の内容でグループを作る。
#https://msdn.microsoft.com/ja-jp/library/a5ch4fda.aspx
#-----------------------------------------------------------
■WinRect
 ・左
 ・上
 ・右
 ・下

#-----------------------------------------------------------
#グループを構造体に。
#(型ってのがまた、ひとつ分からんケド、これはLONGラシイ。)
#-----------------------------------------------------------
PACK(WinRect,S,"LONG,LONG,LONG,LONG")

#-----------------------------------------------------------
#引数は、パックした構造体へのポインター。
#(変数Aの保持している生データへのポインタ・・・なんて言われても
#ぜんっぜんわかんないけど、深く考えず「POINTER」を使えばOK;)
#-----------------------------------------------------------
WinRect取得(母艦のハンドル,POINTER(S))
それ言う。  # 関数成功すると、0 以外の値が返ります。関数失敗すると、0 が返ります。

#-----------------------------------------------------------
#構造体をグループに。
#-----------------------------------------------------------
UNPACK(S,WinRect,"LONG,LONG,LONG,LONG")

#-----------------------------------------------------------
#(WinRectの右-WinRectの左)と(WinRectの下-WinRectの上)が
#母艦の幅と高さと同一ならば、正しく取得されており成功です。
#-----------------------------------------------------------
母艦の幅を表示母艦の高さを表示改行表示。
(WinRectの右-WinRectの左)を表示。
(WinRectの下-WinRectの上)を表示改行表示。

#ちなみに、「の」でも「.」でもイイっぽい。
WinRectの左を表示。
WinRect.上を表示。
WinRectの右を表示。
WinRect.下を表示。
#-----------------------------------------------------------

 でっ、できた!!(喜)

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

2017-04-04

画面をクリップボードにコピー

| 15:55

 これまで、カメラの映像の静止画を取得するために使っていた窓内側キャプチャですが、コレがどうもなかなかの遅さですね。

 ワタシは別に、リアルタイムの処理を行おうとかしてないから、困らないけどねw

 でも、速度はともかく、窓内側キャプチャだと、フルスクリーンにしている時に行うと、の画面に合わせて引き延ばされた画像が保存されてしまうんだよね。

 の方がイイという場面もあるかも知れないけど、どっちかっていうと、拡縮やトリミングは後からでも出来ることだから、本来のとうりの絵を取れた方がよさげ。

 なにしろレターボックスにしてたら、の枠まで入っちゃうんだもんね;

 さてこで発見してきたのが、画面をクリップボードコピーするメッセージ。

 正確には「ビデオフレームバッファと関連するパレットの内容をクリップボードコピーします。」とゆうことなんだけど、なんだかよく分からん;

 でも取りあえずコレで、キャプチャーウィンドウの内容がクリップボードに入り、ペイントとかに貼り付けることも出来ました!

#-----------------------------------------------------------
!WM_CAP_EDIT_COPY=$400+30    # 画面をクリップボードコピー。
●クリップボードコピー(ハンドルを)
  メッセージ送信(ハンドル,WM_CAP_EDIT_COPY,0,0)
#-----------------------------------------------------------

 クリップボードの画像をイメージ部品に取得するのは、イメージ部品の画像を「クリップボード」と指定します。(「」が必要

#-----------------------------------------------------------
*静止画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.png」
  CWハンドルをクリップボードコピー。
  処理用の画像は「クリップボード」
  処理用をファイル名へ画像保存。
#-----------------------------------------------------------

 一見これまでと同じように動作しますが、フルスクリーンの場合には、元のキャプチャーウィンドウのサイズどうりの静止画が保存されるようになりました。

 して、どうやらこっちの方が、かなり高速な印象。

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

2017-03-31

ウィンドウスタイルの設定で大間違いを犯していたラシイ・・・

| 00:51

 カメラのプログラムを見返していて・・・とんだことに気が付きました。

 ウィンドウスタイルのフラグ?を設定するについて、盛大な勘違いをしていたっぽいです(汗)

 とりあえず、このよーに指定していたわけですが・・・

!WS_VISIBLEとは整数=$10000000  #(初期状態)
!WS_CHILDとは整数=$40000000   #(子ウィンドウ)
CWスタイルとは整数=WS_VISIBLE+WS_CHILD  #キャプチャーウィンドウのスタイル

 元ネタのコードを見ていたらね、なんと「+」ではなく「OR」でした!

 「和」ではなく「論理和」。日本語で言ったら「または」。

× CWスタイルとは整数=WS_VISIBLE+WS_CHILD
  ↓ ↓ ↓
○ CWスタイルとは整数=WS_VISIBLE||WS_CHILD

 マニュアルによると「||」が「OR」のコトらしく「(WS_VISIBLE)OR(WS_CHILD)」と同じことです。

 つーか、も論理和って何?

 またはって言ったら、どっちかってことじゃないんすか><


 ちなみに・・・

 「WS_VISIBLE+WS_CHILD」と「WS_VISIBLE||WS_CHILD」

 答えはどちらも「$50000000」となり、それゆえ特に問題は起こりません。

 では、一体何が違うのか。

 てゆうかだから、論理和って一体なんなの?!


マニュアル→(ハ)機能の紹介→計算→論理演算のための演算子

https://nadesi.com/doc/reference/syntax/1-7-calc.htm#head4

 さらっと「比較式Aがまたは比較式Bがならば(=1)を返し、違えば(=0)を返します。」なんて言われてもね。

 なでしこは、初心者向けかと思いきや、マニュアルは「のくらいはフツー知ってるよね」くらいの感じでスルーされているので、ワタシのよーにプログラムの基本のキの字も知らない人は、こんな些細なことで、いちいちまごまごしてしまう><


機能→機能/論理演算→あなたは論理演算がわかりますか?(ITPro)

http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20020731/1/

 むむむぅ、こんなのが5分で分かる人の頭脳が、むしろ信じられんね(´д`;


 さて、5時くらいかけて(嘘)、なんとなく理解したところによると・・・

 とりあえず、まず第一にこの計算は、二進数によってとりおこなわれるってことです。コンピューターなんで!

 して、日本語の「または」にとらわれすぎると、なんだかよく分かんなくなる。

 ようするに、どれかいっこでも1だったら、1

 逆に言うと、ぜんぶ0だった場合だけ、0

 したがって、繰り上がらない!!

 でっ・・・

 「1 OR 4」を、二進数にし、このルールに則って縦計すると、

    0000 0001
OR  0000 0100
-------------
    0000 0101

 8ビットにすれとかなんとか書いてたから、いちおうのように。

 答えは5で、一見足し算の結果と同じみたいだけど、足し算と違うのは、「1 OR 1=1」だってこと。

 「1+4+1」の答えは6ですが、「1 OROR 1」の答えは、5です。

    0000 0001
    0000 0100
OR  0000 0001
-------------
    0000 0101

 この効用は、アレですかねー。

 もし違えて、フラグを「WS_CHILD||WS_VISIBLE||WS_CHILD」みたいに重複して設定してしまっても無視されて、あらぬ値が設定されて大変大変!とゆう事件にならない的な?

 いやたぶん、もっと他にも深遠な意味があるんだろうけど。


 ああぁ、AnimateWindowのアニメーションの種類なんかも、みんなそうだったんだ・・・

 時ある時、コソッと直;;;


 明日になったら、またなんだかよく分からなくなってるかもしないので(えっ;)、このように書き残しておく。

 してまた、もしかしてもしかしたら、おんなじようにまごまごする人がいないとも限らないので、恥も外聞も無く、発表しておく><

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

2017-02-11

PCカメラキャプチャー Ver.2 だよ!

| 00:18

 フルスクリーンのモードについては、レターボックスも、縦横比固定で拡大するのも、特に問題も無くカンタンに実装出来ました。

 とゆうわけで、スペースキーでフルスクリーン表示とウィンドウ表示をトグルするようにした他、右クリックメニューを付けて、モードの変更ができるようにしました。

 このくらいできたら、単に画面にカメラの映像を出して、「おぉ!♪」とか言ってるくらいの、ワタシなんかの実用には十分なんじゃないですかね?

 旧版のなでしこでは、枠なしのフルスクリーンも問題なく動くようなので、これで実行ファイル化しておこうっと。

 珍しく、実用の物を作った気がする(爆)

 いや~、おかげさまでカメラでは、ずいぶん遊んで、まただいぶ賢くなったね☆

#-----------------------------------------------------------------------
# なでしこでノート内蔵カメラをキャプチャ ver.2.00
#-----------------------------------------------------------------------
#☆ver.1.00
#・ノートPCの内蔵カメラを起動してキャプチャ(プレビュー)
#・Enterキーでキャプチャ画像を保存(勝手にデスクトップの日時でファイル作ります)
#-----------------------------------------------------------------------
#☆ver.2.00
#・[F5]キーでキャプチャ動画を保存([Esc]キーか、マウスボタンを押すことで保存終了)
#・[Space]キーで、フルスクリーン表示とウィンドウ表示切り替え。
#・右クリックメニュー追加。各機能の他、フルスクリーンモードが変えられます。
#-----------------------------------------------------------------------
!母艦設計=「母艦の可視はオフ」

#-----宣言--------------------------------------------------
枠無フルスクリーンとは整数オフ  #古いなでしこならオンで動きます(1.5332で確認)

CW幅とは整数=640。CW高さとは整数=480。
CWハンドルとは整数=-1  #キャプチャーウィンドウのハンドル。

!WS_VISIBLEとは整数=$10000000  #(初期状態)
!WS_CHILDとは整数=$40000000   #(子ウィンドウ)
CWスタイルとは整数=WS_VISIBLE||WS_CHILD  #キャプチャーウィンドウのスタイル

カメラ接続状態とは整数オフ。
フレームレートとは整数=60      #ミリ秒単位
フルスクリーン表示フラグとは整数オフ。
フルスクリーンモードとは整数=1
#(0=デスクトップに合わせて引き延ばす、1=レターボックス、2=縦横比固定でズーム)

#---GUI-----
処理用とはイメージの可視はオフ。
#-----------------------------------------------------------

#-----母艦設計----------------------------------------------
#---ポップアップメニュー----
右クリックメニューとはポップアップメニュー
右クリックメニューに『#親部品名,部品名,テキスト,ショートカット,オプション,イベント
 -,フルスクリーンメニュー,フルスクリーンモード,,,
 --,フルスクリーン0,ノーマル,,,0にフルスクリーンモード変更
 --,フルスクリーン1,レターボックス(縦横比固定),,チェック,1にフルスクリーンモード変更
 --,フルスクリーン2,ズーム(縦横比固定),,,2にフルスクリーンモード変更
 -,ウィンドウメニュー,ウィンドウ表示,,,ウィンドウ表示
 -,-,,,,
 -,静止画保存メニュー,スクリーンショット保存,,,静止画保存。
 -,-,,,,
 -,動画保存メニュー,キャプチャ動画保存,,,動画保存。
 -,動画保存コメント, (終了は[Esc]かマウスクリック),,,
 -,-,,,,
 -,ヘルプメニュー,操作説明,,,操作説明。
 -,バージョンメニュー,バージョン情報,,,バージョン。
 -,-,,,,
 -,メニュー閉,メニューを閉じる,,,
 -,-,,,,
 -,終了メニュー,終了,,,終了処理。
』をポップアップメニュー一括作成

*フルスクリーンモード変更(Aに)
  もし、A=1ならば、
    フルスクリーンモード=1。
    フルスクリーン0のチェックオフ。フルスクリーン1のチェックオン。フルスクリーン2のチェックオフ。
  違えばもし、A=2ならば、
    フルスクリーンモード=2。
    フルスクリーン0のチェックオフ。フルスクリーン1のチェックオフ。フルスクリーン2のチェックオン。
  違えば、
    フルスクリーンモード=0。
    フルスクリーン0のチェックオン。フルスクリーン1のチェックオフ。フルスクリーン2のチェックオフ。
  フルスクリーン表示フラグ=オフ。
  フルスクリーン表示。

*ウィンドウ表示
  フルスクリーン表示フラグ=オン。
  フルスクリーン表示。

#---母艦-----
母艦について
  スタイルは「枠固定」
  オフに最大化ボタン有効変更。
  オフに最小化ボタン有効変更。
  タイトルは「PCカメラキャプチャー」
  クライアント幅はCW幅。
  クライアント高さはCW高さ。
  ポップアップメニューは右クリックメニュー。
  閉じた時は~
    終了処理。
  キー押した時は~
    もし、押された仮想キー=13ならば、静止画保存。  # Enter
    違えばもし、押された仮想キー=116ならば、動画保存。  # F5
    違えばもし、押された仮想キー=32ならば、フルスクリーン表示。  # Space
    違えばもし、押された仮想キー=112ならば、操作説明。  # F1
    違えばもし、押された仮想キー=113ならばバージョン。  # F2
母艦黒色画面クリア母艦中央移動。
#-----------------------------------------------------------

#-----メイン------------------------------------------------
母艦の可視はオン
カメラ起動

#-----------------------------------------------------------
*カメラ起動
  キャプチャーウィンドウ作成("",CWスタイル,0,0,CW幅,CW高さ,母艦のハンドル,0)
  CWハンドルはそれ。1秒待つ。
  5
    CWハンドルにカメラ接続。
    1秒待つ。
    もしそれはいならば、カメラ接続状態はオン抜ける。
  もし、カメラ接続状態がオフならば、
    CWハンドルをウィンドウ破棄。
    「カメラに接続出来ませんでした」と言う。
    終わる。
  CWハンドルをフレームレートにプレビューレート設定。
  CWハンドルをオンにプレビューモード設定。

*静止画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.png」
  CWハンドルを処理用へ窓内側キャプチャ。
  処理用をファイル名へ画像保存。

*動画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.avi」
  CWハンドルをファイル名にキャプチャファイル設定。
  CWハンドルをキャプチャ開始。

*フルスクリーン表示
  もし、フルスクリーン表示フラグ=オフならば、
    フルスクリーン表示フラグ=オン
    母艦のクライアント幅はデスクトップW母艦のクライアント高さはデスクトップH。
    もし、枠無フルスクリーン=オンならば、
      母艦のスタイルは「枠なし」
      母艦の位置は「0,0」
    違えば、
      母艦中央移動。
    もし、フルスクリーンモード=1ならば、
      CWハンドルに(母艦のクライアント幅-(母艦のクライアント高さ*CW幅/CW高さ))/2,0,(母艦のクライアント高さ*CW幅/CW高さ),母艦のクライアント高さを窓ハンドル位置サイズ設定。
    違えばもし、フルスクリーンモード=2ならば、
      CWハンドルに0,(母艦のクライアント高さ-(母艦のクライアント幅*CW高さ/CW幅))/2,母艦のクライアント幅,(母艦のクライアント幅*CW高さ/CW幅)を窓ハンドル位置サイズ設定。
    違えば、
      CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。
    母艦最前面
  違えば、
    フルスクリーン表示フラグ=オフ
    母艦のスタイルは「枠固定」
    母艦のクライアント幅はCW幅。母艦のクライアント高さはCW高さ。
    母艦中央移動。
    CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。
  処理用を母艦のクライアント幅,母艦のクライアント高さで画像リサイズ。
  CWハンドルをフルスクリーン表示フラグにスケーリングフラグ設定。

*終了処理
  CWハンドルからカメラ切断。
  CWハンドルをウィンドウ破棄。
  終わる。
#-----------------------------------------------------------
*操作説明
  ダイアログタイトルは「操作説明」
  「◆[Enter]キーでキャプチャ画面のスナップショットを保存。
  
◆[F5]キーでキャプチャ動画を保存。
 [Esc]キーか、マウスボタンを押すことで保存終了となります。
 ※終了させない限り、録画し続けます。
 
◆[Space]キーで、フルスクリーン表示。
 フルスクリーン表示時に[Space]キーで、ウィンドウ表示戻る。
 
◎フルスクリーンモードは、右クリックメニューで変更できます。
 ・ノーマル(デスクトップに合わせて映像を引き延ばします)
 ・レターボックス(縦横比固定。左右に黒枠が入ります)
 ・ズーム(縦横比固定。上下を切ってデスクトップ一杯に表示)
 ※設定ファイルは作ってないので、毎初期値に戻ります。」と言う
#------------------------------------------------------------
*バージョン
  ダイアログタイトルは「バージョン情報」
  「{二重カッコ}PCカメラキャプチャー{二重カッコ閉じ}{改行}   Version 2.00{改行}{改行}   by 雪乃☆雫」と言う。
#-----------------------------------------------------------

#-----ビデオキャプチャー------------------------------------
#https://msdn.microsoft.com/en-us/library/windows/desktop/dd757696(v=vs.85).aspx
#---VFW定数-----
!WM_CAP_DRIVER_CONNECTとは整数=$400+10           # キャプチャウィンドウをキャプチャドライバに接続します。
!WM_CAP_DRIVER_DISCONNECTとは整数=$400+11        # キャプチャウィンドウからキャプチャドライバを切断します。
!WM_CAP_SET_PREVIEWとは整数=$400+50              # プレビューモード(オンオフ)
!WM_CAP_SET_PREVIEWRATEとは整数=$400+52          # プレビューモードのフレーム表示レート(ミリ秒)
!WM_CAP_SET_SCALEとは整数=$400+53                # 画像をキャプチャーウィンドウに合わせて拡縮(オンオフ)
!WM_CAP_SEQUENCEとは整数=$400+62                 # ストリーミングビデオおよびオーディオキャプチャをファイルに開始します。
!WM_CAP_FILE_SET_CAPTURE_FILEとは整数=$400+20    # ビデオキャプチャに使用されるファイルの名前を指定します。
#-----------------------------------------------------------
●カメラ接続(ハンドルに{数値=0}Noの)
  メッセージ送信(ハンドル,WM_CAP_DRIVER_CONNECT,No,0)  # カメラが1台ならNoは0で省略可。

●カメラ切断(ハンドルから)
  メッセージ送信(ハンドル,WM_CAP_DRIVER_DISCONNECT,0,0)

●プレビューレート設定(ハンドルをmsに)
  メッセージ送信(ハンドル,WM_CAP_SET_PREVIEWRATE,ms,0)  # ms=ミリ秒単位

●プレビューモード設定(ハンドルをfに)
  メッセージ送信(ハンドル,WM_CAP_SET_PREVIEW,f,0)     # f=オンオフ

●キャプチャ開始(ハンドルを)
  メッセージ送信(ハンドル,WM_CAP_SEQUENCE,0,0)

●キャプチャファイル設定(ハンドルをaviファイル名に)
  メッセージ送信(ハンドル,WM_CAP_FILE_SET_CAPTURE_FILE,0,aviファイル名)

●スケーリングフラグ設定(ハンドルをfに)
  メッセージ送信(ハンドル,WM_CAP_SET_SCALE,f,0)      # f=オンオフ
#-----------------------------------------------------------

#-----API---------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc428606.aspx
●キャプチャーウィンドウ作成(lpszWindowName,dwStyle,x,y,nWidth,nHeight,hWnd,nID) =DLL("avicap32.dll",
"HWND capCreateCaptureWindowA(
LPCSTR lpszWindowName,  // ウィンドウ名
DWORD dwStyle,          // ウィンドウスタイル
int x,                  // X
int y,                  // Y
int nWidth,             // W
int nHeight,            // H
HWND hWnd,              // 親ウィンドウのハンドル
int nID                 // ウィンドウ識別子…ってなんすか;
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc411022.aspx
●メッセージ送信(hWnd,Msg,wParam,lParam) =DLL("user32.dll",
"LRESULT SendMessageA(
HWND hWnd,      // 送信先ウィンドウのハンドル
UINT Msg,       // メッセージ
SHORT wParam,  // メッセージの最初のパラメータ
LPCSTR lParam   // メッセージの 2 番目のパラメータ
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc410763.aspx
●ウィンドウ破棄(hWndを) =DLL("user32.dll",
"BOOL DestroyWindow(
HWND hWnd   // 破棄するウィンドウのハンドル
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc411206.aspx
●SetWindowPos(hWnd,hWndInsertAfter,X,Y,cx,cy,uFlags) =DLL("user32.dll",
"BOOL SetWindowPos(
HWND hWnd,             // ウィンドウのハンドル
HWND hWndInsertAfter,  // 配置順序のハンドル…?
int X,                 // 横方向の位置
int Y,                 // 縦方向の位置
int cx,                // 幅
int cy,                // 高さ
UINT uFlags            // ウィンドウ位置のオプション
)")

●窓ハンドル位置サイズ設定(ハンドルにX,Y,W,Hを)
  SetWindowPos(ハンドル,0,X,Y,W,H,0)
#-----------------------------------------------------------

めだかめだか2017/02/12 02:09ご無沙汰しております。

開いてびっくり!謎のコードがびっしりw
さすがです・・・!
自分で組んだコードでも、後から見返した時に何を書いているのかさっぱりなのに、人様が書いたコードとなるともうさっぱりですねw

ですが、なんとなく理解は...しているつもりですw


ところで、検出プログラムなんですが、なんとなくはできた・・・?のですが、その方法以外が思い浮かばないので、なんとも言えない状態です・・・w
さて、どうしませうか・・・

雪乃☆雫雪乃☆雫2017/02/15 00:53 めだかさんこんにちは。遅くなりましてスミマセン;

 VFW関係のメッセージ送信を、全部関数にして書き換えましたw
 もちろんナゾの呪文は使わず、例の数値を直接指定しても動くんだけど、まさにその、時間が経ってから見返したりするコトを考えると、この呪文で検索するとMSDNとかにたどり着けるので、結局のところ可視性が上がるのかなあと思い、基本英語は見てるだけでダメな人なんですが、使っとくことにしました;;;

 顔検出なんて、その方法もどの方法も、考えたこともないもねー。すごいなあと感心するばかりですよ~。
 是非頑張ってくださいぃ~☆

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

2017-02-10

フルスクリーンにしたい!

| 14:27

 ちょっとまたカメラに戻って、問題の、スタイル指定ですが・・・

 だんだんメッセージ送信だらけなのが、個人的にイヤになったのと、英語はイヤと言っても結局のところ定数は使った方が、後でケンサクするのに便利でしょってわけで、っくり書き換えていたら、なんだか分かんないケド、「枠固定」も、最大化ボタンや最小化ボタンの有効変更も、ふつーに通ったんだよね。

 気のせいだったのか?!・・っと思ったけれど、元のコードではやっぱり動かないんだよね。

 謎。なんだか、わけ分からん(?_?)

 しかも結局、フルスクリーンは出来なかったんですよ。

 カメラ接続前なら、「枠なし」もできたんだけど、カメラ接続後に「枠固定」から「枠なし」に変更すると、やっぱり切断されてしまうっぽい。

 むむむ~。


 それなら、ウィンドウのクライアント幅と高さをデスクトップWとHにして、位置を枠やタイトルバーの分マイナスに設定すれば、一見それっぽくなるだろう・・・と考えたんだけど、コレも出来なかった><

 ウィンドウの最大サイズには上限があるらしく、何を設定しても1370*753以上にはならないんだよね。(解像度が1366*768の場合)

 幅はいいけど、高さが足りない><

 でもまー、とりあえずコレでっ!!(えっ;)

 だって、APIを使えばなんとか出来そうな気もするけど、旧版のなでしこでは、んな苦労しなくても、ふつーに「枠なし」に変更ができるんだもん!


 それよりもっと重要なのが、キャプチャーウィンドウのサイズ変更です。

 これは、窓ハンドルサイズ設定でカンタンに出来るだろうとおもったら、出来なかった。

 これまた、切断(?)されてしまう。

 APIで作ったヤツっていうのは、何かっちゅうと、うまくできないんだねヽ(;´Д`)ノ

 さて、こで、発見してきたのが、SetWindowPosとゆうAPI。

 APIで作ったヤツは、APIで何とかするしかないってこったろう・・・

 「配列順序のハンドル」も、「ウィンドウ位置のオプション」も、なんだかよくわかんないけど、取りあえず無視する!

 そうすると、単にX,Y,W,Hを指定するだけ。

 ちなみに、窓ハンドルサイズ設定のX1,y1,x2,y2より、こっちのほうが、ワタシ的には感覚的に分かりやすくて助かる。

#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc411206.aspx
●SetWindowPos(hWnd,hWndInsertAfter,X,Y,cx,cy,uFlags) =DLL("user32.dll",
"BOOL SetWindowPos(
HWND hWnd,             // ウィンドウのハンドル
HWND hWndInsertAfter,  // 配置順序のハンドル…?
int X,                 // 横方向の位置
int Y,                 // 縦方向の位置
int cx,                // 幅
int cy,                // 高さ
UINT uFlags            // ウィンドウ位置のオプション
)")

●窓ハンドル位置サイズ設定(ハンドルにX,Y,W,Hを)
  SetWindowPos(ハンドル,0,X,Y,W,H,0)
#-----------------------------------------------------------

 これで・・・

#-----------------------------------------------------------
母艦のクライアント幅はデスクトップW母艦のクライアント高さはデスクトップH。
CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。
CWハンドルをオンにスケーリングフラグ設定。


!WM_CAP_SET_SCALEとは整数=$400+53                # 画像をキャプチャーウィンドウに合わせて拡縮(オンオフ)
●スケーリングフラグ設定(ハンドルをfに)
  メッセージ送信(ハンドル,WM_CAP_SET_SCALE,f,0)      # f=オンオフ
#-----------------------------------------------------------

 できた~♪♪♪

 でも・・・

 分かってたけど、640*480の映像を1366*768のデスクトップに合わせてるので、横長にみょーんと引き延ばされてしまうのです;

 非HD時代のテレビの再放送みたいに、レターボックスにするか、幅をデスクトップ幅に合わせて、上下を切って表示(できるのかな?)する感じ?

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