Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017/02/11 (土)

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

| 00:18 | PCカメラキャプチャー Ver.2 だよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - PCカメラキャプチャー Ver.2 だよ! - 雪乃☆雫のなでしこ日和 PCカメラキャプチャー Ver.2 だよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

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

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

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

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

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

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

#-----------------------------------------------------------------------
# なでしこでノート内蔵カメラをキャプチャ 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

2017/02/01 (水)

動画を保存したい!

| 16:18 | 動画を保存したい! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 動画を保存したい! - 雪乃☆雫のなでしこ日和 動画を保存したい! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 さて、引き続きカメラです。

 折角、画面は動いているわけなんだから、静止画だけじゃなく、のまま動画で保存してみたいと思うのが人情ですよね~(?)

 調べてみると、「WM_CAP_SEQUENCE」が、ストリーミングビデオおよびオーディオキャプチャをファイルに開始…するラシイ。

 「WM_CAP_SEQUENCE」は「$400+62」とゆうことで、とりあえず、

メッセージ送信(CWハンドル,$400+62,0,0)

 のようにしてみたんだけど・・・

 一応、これだけで、出来たことは出来たんだけどね。

 デフォルトのファイル名は、「CAPTURE.AVI」のようなことが書いてあったんだけども、1が返ってきているのに、見当たらない

 一体、どこにあんのかと思ったら、検索しないとたどり着けないよーな深いところに「CAPTURE.AVI」が作られてました;

 これはよろしくないので、変更しなくては・・・

 っと、また具合わるくなりながら、ぐーぐる検索様のお力を借りて調べると、「WM_CAP_FILE_SET_CAPTURE_FILE」が、キャプチャーファイル名を設定するヤツらしい。

 これは、「$400+20」とゆうことで、

メッセージ送信(CWハンドル,$400+20,0,"{デスクトップ}CAPTURE.AVI")

 で行けるだろうと思ったら、行かなかった。

 これは、どうやら、最初に「WM_CAP_FILE_SAVEDIBA」が出来なかったのと同じ現象だね。

 ーとーうだうだ考えて、はまりまくった末にひらめいたのは、文字列が通ってないんじゃ? ってこと。

 本家のコードをようく眺めてみたら、「SendMessage」の引数は、wParamがShort、lParamがStringになってるんだね。

 なるほど。

 こうして置いて、数字的なヤツは最初のパラメーター、文字列は2番目のパラメーターで送ってるラシイ。

 とゆうわけで、メッセージ送信のパラメーターの引数の型を変えてみた。

●メッセージ送信(hWnd,Msg,wParam,lParam) =DLL("user32.dll",
"LRESULT SendMessageA(
HWND hWnd,      // 送信先ウィンドウのハンドル
UINT Msg,       // メッセージ
SHORT wParam,  // メッセージの最初のパラメータ
LPCSTR lParam   // メッセージの 2 番目のパラメータ
)")

 動いた!

 いや~、なんか、賢くなったんじゃないですか?

 でっ、いちおうこんな感じで、録画もできるようになりました♪

 ちなみに、[Esc]キーか、マウスボタンを押すことで保存終了です。

 終了ない限り、ディスクが一杯になるまで保存し続けますのでご注意ですw

キャプチャファイル設定とは整数=$400+20  # WM_CAP_FILE_SET_CAPTURE_FILE
シーケンスとは整数=$400+62     # WM_CAP_SEQUENCE

*動画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.avi」
  メッセージ送信(CWハンドル,キャプチャファイル設定,0,ファイル名)
  メッセージ送信(CWハンドル,シーケンス,0,0)

 ああぁ・・・メッセージ送信が増えてくると・・・(+_+)

 それぞれ関数にした方が見やすかったかな。

めだかめだか2017/02/01 21:01お久しぶりで御座います。
雪乃さんはすっかりAPIマスターですねw
そんな雪乃さんに質問なのですが、

>「WM_CAP_SEQUENCE」は「$400+62」とゆうことで、

これが、わからないんですが...(>_<)
初歩的な質問で申し訳ないですが、ご教授お願いします...!

雪乃☆雫雪乃☆雫2017/02/02 00:08 えっと・・・そんなにマスターはしてないんだけど、参考にしたのはここです。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd757696(v=vs.85).aspx
https://www.ecoop.net/coop/api/winmes.html

 最初のトコは、全部英語ですからご注意です。ワタシなんぞは、開いた瞬間めまいがして、次に具合わるくなりますwww
 しか~し、ガマンして、ぐーぐる翻訳さまに読んで頂くと、「WM_CAP_SEQUENCEメッセージは、ストリーミングビデオおよびオーディオキャプチャをファイルに開始…」するヤツだと言うことが分かります。
 コレを、SendMessageで送ってやれば、その機能が使えるよってコトです。
 でも、「WM_CAP_SEQUENCE」とゆう文字列を送るわけではなくって、定数として割り当てられてる数値があるので、今度はそれを探さなきゃならないんですよ~(´д`)(前のコードの場合は、参考にしたコードの中に宣言してあった数値を拾っただけなので、カンタンだったんですが)

 さてそこで、2番目のトコです。
 あんまよく分かんないケド、VFW的なメッセージの定義値が一覧表になっています。
 「WM_CAP_SEQUENCE」は「WM_CAP_START+62」となっています。
 この表には書いてないけど、参考にしたコードによると、なんか知らんけど、「WM_USER=WM_CAP_START=$400」とゆうことになるらしいんだよね。
 だから、「WM_CAP_SEQUENCE」は「$400+62」なのです。
(1086と書くことも出来るけど、$400+62のほうが見やすいでしょ? なんとなく)

めだかめだか2017/02/03 01:31返信有難う御座いますー

なるほどー...
WM_CAP_STARTは$400なんですねー...
確かに、1086よりもこっちの方がみやすいですねw

もち合わせでの知識だけでは、理解することが出来ない様な領域ですね...
時間さえあれば、ゆっくりと調べてながらも自力で理解も出来るのですが...


何はともあれ、有難うございます!

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

2017/01/29 (日)

母艦のスタイル指定ができない・・・

| 17:27 | 母艦のスタイル指定ができない・・・ - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 母艦のスタイル指定ができない・・・ - 雪乃☆雫のなでしこ日和 母艦のスタイル指定ができない・・・ - 雪乃☆雫のなでしこ日和 のブックマークコメント

 まず最初に違いを直しとく。

× キャプチャーウィンドウ作成("",CWスタイル,0,0,母艦の幅,母艦の高さ,母艦ハンドル,0)
   ↓ ↓ ↓
○ キャプチャーウィンドウ作成("",CWスタイル,0,0,母艦のクライアント幅,母艦のクライアント高さ,母艦ハンドル,0)

 学習能力が不足だから、なんか毎違うんだよねー;;;

 母艦の幅/母艦の高さでは、タイトルバーや枠の分も含まれてしまうんだよね。

 の場合、たいした問題は出ないけど、母艦の枠をちょっと動かしてみたら、なんか分かる;


 でも、枠は動かせない方がイイだろうと思って、母艦のスタイルを「枠固定」にしようとしてみたら、できなかった><

 エラーにはならないんですが、キャプチャーウィンドウが表示されず(ハンドルが返ってくるので作られてはいるっぽい)、カメラ接続にも失敗してしまう。

 試しに、カメラ起動後、映像が映ってから、スタイル設定を入れてみても、切断されて、っ白な母艦になってしまう。

 なぜ~~~(?_?)

 ちなみに、「枠なし」もダメだし、最大化、最小化ボタンの有効変更もダメでした。

 実は、「WM_CAP_SET_SCALE」で、キャプチャーウィンドウに合わせて映像を拡縮出来るラシイことが分かったので、フルスクリーン表示にしてみようかと思ってたんだけど・・・

 枠なしに出来ないと、フルスクリーン・・・っていうか・・・みたいな感じになっちゃいますよね~;;;

 しくしくしく。


 ちなみに、ウィンドウスタイルをようく学べば、母艦の子ウィンドウにしなくても、単体で枠付きのウィンドウにも出来るハズなんですが、それをやっちゃうと、キー押した時などのイベントが使えない・・・

 全部、APIのWindowMessageを使ってやっていかなきゃなくなるだろうから、めんどーじゃないですか? もーなでしこのプログラムのようじゃなくなるもねー(@_@)


 ・・・とっ、ところが!

 古いバージョンのなでしこでは、フツーに動いたんですよ、コレが!!

 ってことは、なでしこさんの問題なのかなー。むむむ。

 直った直る予定らしい、母艦フォームの位置の指定が変になっちゃう事件も、スタイル指定がある場合だけの現象だったし、何かスタイル指定には、ネックになるところがあるんですかね???

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

2017/01/27 (金)

なでしこでノートPCのカメラを使うよ!

| 17:32 | なでしこでノートPCのカメラを使うよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - なでしこでノートPCのカメラを使うよ! - 雪乃☆雫のなでしこ日和 なでしこでノートPCのカメラを使うよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 めだかさんから頂戴した課題です。

 課題を解決するのは、好きだよ☆

 もっとも、当初、ワタシの知恵では、到底ムリだろうと思われた、難題でしたが――

 色々調べてみた結果、capCreateCaptureWindowと、SendMessageの組み合わせで、出来そう感が出てきたので、ちょっとやってみました。

 元ネタは、こちら。

http://magayengineer.hatenablog.com/entry/2016/06/13/224309

 しかし、VBのコードが分かるわけでもなく(20年くらい前にちょこっと、本や雑誌のをまるっと打ち込んで「動いた~(喜)」とかしてただけなんで;)イメージで! 目的のAPIを使ってるトコをやっつけで!!(爆)

 んな、てきとーな感じなのに・・・

 ふつうだったら、もっとなんてことの無い簡単なモノでも、大体些細なことにはまりまくって何日も過ごしたりするもんなんだけど・・・


 ・・・あれれれれ??

 でっ、できたかも・・・?!?!


 上記のよーな感じなもので、もしかすると、不足のところがあるかも知れませんが、一応カメラの映像が画面に出て、スナップショットをファイルに保存出来るようになりました。


 APIは、3つ。(本家では4つ使われていますが、なんかよく分かんないので、割愛されています(えっ;))

・まずは、「capCreateCaptureWindow」で、キャプチャーウィンドウを作成します。

 ウィンドウ識別子がなんなのか、全く分かんないケド、0で良いようです;

 ウィンドウ名は、母艦の子ウィンドウとするため設定していません。

 ウィンドウスタイルは・・・とっ、とにかくコレで、母艦の中にキャプチャーウィンドウが入ります;

 あとは、見たとうりの感じ。

・「DestroyWindow」は、最後、作ったウィンドウは、ちゃんと破棄して終了すれってこってしょう。

して、「SendMessage」で、なんか色々送ることによって、VFW?が使えるとゆうことのようなんですが・・・とりあえず、数値を拾っただけです。

 他にも沢山種類があって、出来ることは色々ありそうではあるんですが・・・よくわからん。だって、英語なんだもん!(*_*)

 しかも、なぜだか「WM_CAP_FILE_SAVEDIBA」が、うまく出来ませんでした(?_?)

 でも、なでしこには窓キャプチャ画像保存の命令があるから、いいんだい!

 直で、pngでも保存できるもね~。

・ちなみに、割愛した「getTickCount」は、システムを起動した後の経過時を、ミリ秒(ms)単位で取得…するヤツで、カメラが準備できるまで少し待つ…場面で使われていましたが、よく分かんないので、待ちゃーいいんだろ?とばかりに、秒待つ命令をぶち込みましたが、動いたのでOK;;;


 さてさて、んなこんなで、こんな感じ。

#-----------------------------------------------------------------------
# なでしこでノート内蔵カメラをキャプチャ
#・ノートPCの内蔵カメラを起動してキャプチャ(プレビュー)
#・Enterキーでキャプチャ画像を保存(勝手にデスクトップの日時でファイル作ります)
#-----------------------------------------------------------------------
#※元ネタはこちら
#http://magayengineer.hatenablog.com/entry/2016/06/13/224309
#(VB.NETが分からんもので、正確な移植では無いです。なんか不備があったらゴメン)
#-----------------------------------------------------------------------
!母艦設計=「母艦の可視はオフ」

#-----母艦設計----------------------------------------------
母艦について
  位置は「0,0」
  クライアント幅は640。
  クライアント高さは480。
  閉じた時は~
    終了処理。
  キー押した時は~
    もし、押された仮想キー=13ならば、画面キャプチャ。
#-----------------------------------------------------------

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

カメラ接続とは整数=$400+10     # WM_CAP_DRIVER_CONNECT
カメラ切断とは整数=$400+11     # WM_CAP_DRIVER_DISCONNECT
カメラ接続状態とは整数オフ。

プレビューとは整数=$400+50     # WM_CAP_SET_PREVIEW
プレビューレートとは整数=$400+52  # WM_CAP_SET_PREVIEWRATE
フレームレートとは整数=60      #ミリ秒単位

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

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

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

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

*終了処理
  メッセージ送信(CWハンドル,カメラ切断,0,0)
  ウィンドウ破棄(CWハンドル)
#-----------------------------------------------------------

#-----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,       // メッセージ
WPARAM wParam,  // メッセージの最初のパラメータ
LPARAM lParam   // メッセージの 2 番目のパラメータ
)")

#https://msdn.microsoft.com/ja-jp/library/cc410763.aspx
●ウィンドウ破棄(hWnd) =DLL("user32.dll",
"BOOL DestroyWindow(
HWND hWnd   // 破棄するウィンドウのハンドル
)")
#-----------------------------------------------------------

 しっかし、テストするたびに、ワタシの抜けた顔が画面に映るから、テンション下がるわ~(爆)

 鏡代わりに使うには、いささか画像が粗いしね~w

めだかめだか2017/01/29 00:28ありがとうございます。とてもうれしいです。

私が持ち出したことに、わざわざ貴重な時間を割いて頂き....雪乃さんに相談して、間違いではなかったと思っております。(初めからそうでしたが(笑

ですが、時間が無く、今すぐに詳しくすることができないのが、残念で残念で・・・

ですが、今、動作確認してみたところ無事に動きました・・・!お見事です!

私一人では到底無理だと思っていた今回の件ですが、雪乃さんのご尽力もあり、無事、解決できました!有り難うございます!


雪乃さんが組んで組んでくださいました、コードをしっかりと理解したのち、そちらのコードを元に、こちらで手を加えながら、自分が目指すものに近づけれるコードを組んでいきたいと思っています。

また、失礼ながら、雪乃さんにはこれからも、バシバシ質問をさせてもらいます・・・(笑

それでは、今回の件については、雪乃さんの活躍のみで一件落着ということにさせてもらいます。
本当に有り難うございました!



追記;おそらく、数時間後にはもう既に質問をさせてもらっていると思います...(笑
その時は、また宜しくお願いします。

雪乃☆雫雪乃☆雫2017/01/29 17:44 いえいえ~。お役に立てて良かった❤
 これはもう、たまたまおあつらえ向きのコードが載ってるトコを発見出来たのが良かったです♪
 是非、頑張って下さい~☆

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