#----------------------------------------------------------------------- # なでしこでノート内蔵カメラをキャプチャ ver.3.01 #----------------------------------------------------------------------- # ver.1.00 #・ノートPCの内蔵カメラを起動してキャプチャ(プレビュー) #・[Enter]キーでキャプチャ画像を保存(勝手にデスクトップに今の日時でファイル作ります) #----------------------------------------------------------------------- # ver.2.00 #・[F5]キーでキャプチャ動画を保存([Esc]キーか、マウスボタンを押すことで保存終了) #・[Space]キーで、疑似フルスクリーン表示とウィンドウ表示切り替え。 #・右クリックメニューを追加。各機能の他、フルスクリーンモードが変えられます。 #----------------------------------------------------------------------- #☆ver.3.00 #・静止画保存の画像取得方法をクリップボードからに変更。 #・ビデオ形式とビデオソースのダイアログを追加。 #・APIを使って疑似ではない(?)フルスクリーン表示。 #----------------------------------------------------------------------- #★よてい #・監視カメラ機能 # …パソがカメラの付いてないノートになってしまったので、中断中(;_;) #----------------------------------------------------------------------- !母艦設計=「母艦の可視はオフ」 #-----宣言-------------------------------------------------- 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]かマウスクリック),,, -,-,,,, -,ダイアログ1,ビデオ形式ダイアログ,,,ビデオ形式ダイアログ。 -,ダイアログ2,ビデオソースダイアログ,,,ビデオソースダイアログ。 -,-,,,, -,ヘルプメニュー,操作説明,,,操作説明。 -,バージョンメニュー,バージョン情報,,,バージョン。 -,-,,,, -,メニュー閉,メニューを閉じる,,, -,-,,,, -,終了メニュー,終了,,,終了処理。 』をポップアップメニュー一括作成 *フルスクリーンモード変更(Aに)   もし、A=1ならば、     フルスクリーンモード=1。     フルスクリーン0のチェックはオフ。フルスクリーン1のチェックはオン。フルスクリーン2のチェックはオフ。   違えば、もし、A=2ならば、     フルスクリーンモード=2。     フルスクリーン0のチェックはオフ。フルスクリーン1のチェックはオフ。フルスクリーン2のチェックはオン。   違えば、     フルスクリーンモード=0。     フルスクリーン0のチェックはオン。フルスクリーン1のチェックはオフ。フルスクリーン2のチェックはオフ。   フルスクリーン表示フラグ=オフ。   フルスクリーン表示。 *ウィンドウ表示   フルスクリーン表示フラグ=オン。   フルスクリーン表示。 #---母艦----- 母艦について   タイトルは「PCカメラキャプチャー」   ポップアップメニューは右クリックメニュー。   閉じた時は〜     終了処理。   キー押した時は〜     もし、押された仮想キー=13ならば、静止画保存。  # Enter     違えば、もし、押された仮想キー=116ならば、動画保存。  # F5     違えば、もし、押された仮想キー=32ならば、フルスクリーン表示。  # Space     違えば、もし、押された仮想キー=112ならば、操作説明。  # F1     違えば、もし、押された仮想キー=113ならば、バージョン。  # F2     違えば、もし、押された仮想キー=118ならば、ビデオ形式選択ダイアログ。  # F7     違えば、もし、押された仮想キー=119ならば、ビデオソース制御ダイアログ。  # F8 母艦を黒色で画面クリア。 #----------------------------------------------------------- #-----メイン------------------------------------------------ 窓枠幅算出。 カメラ起動。 ウィンドウサイズ設定。 #----------------------------------------------------------- *カメラ起動   CWスタイルで母艦ハンドルにキャプチャーウィンドウ作成。   CWハンドルはそれ。1秒待つ。   5回     CWハンドルに0のカメラ接続。     1秒待つ。     もし、それがはいならば、カメラ接続状態はオン。抜ける。   もし、カメラ接続状態がオフならば、     CWハンドルをウィンドウ破棄。     「カメラに接続出来ませんでした」と言う。     終わる。   CWハンドルをフレームレートにプレビューレート設定。   CWハンドルをオンにプレビューモード設定。 *ウィンドウサイズ設定   CWハンドルのステータス取得。   母艦のクライアント幅はCWの幅   母艦のクライアント高さはCWの高さ   母艦枠固定中央表示。   処理用を母艦のクライアント幅,母艦のクライアント高さで画像リサイズ。 *静止画保存   ファイル名は「{今日} {今}」を「yyyymmdd_hhnnss」に日時形式変換。   ファイル名は「{デスクトップ}{ファイル名}.png」   CWハンドルを処理用へ窓内側キャプチャ。   処理用をファイル名へ画像保存。 *動画保存   ファイル名は「{今日} {今}」を「yyyymmdd_hhnnss」に日時形式変換。   ファイル名は「{デスクトップ}{ファイル名}.avi」   CWハンドルをファイル名にキャプチャファイル設定。   CWハンドルをキャプチャ開始。 *フルスクリーン表示   もし、フルスクリーン表示フラグ=オフならば、     フルスクリーン表示フラグ=オン     母艦のクライアント幅はデスクトップW。母艦のクライアント高さはデスクトップH。     母艦枠無全画面表示。     もし、フルスクリーンモード=1ならば、       CWハンドルを(母艦のクライアント幅-(母艦のクライアント高さ*CWの幅/CWの高さ))/2,0,(母艦のクライアント高さ*CWの幅/CWの高さ),母艦のクライアント高さに窓ハンドル位置サイズ設定。     違えば、もし、フルスクリーンモード=2ならば、       CWハンドルを0,(母艦のクライアント高さ-(母艦のクライアント幅*CWの高さ/CWの幅))/2,母艦のクライアント幅,(母艦のクライアント幅*CWの高さ/CWの幅)に窓ハンドル位置サイズ設定。     違えば、       CWハンドルを0,0,母艦のクライアント幅,母艦のクライアント高さに窓ハンドル位置サイズ設定。     母艦を最前面   違えば、     フルスクリーン表示フラグ=オフ     母艦の幅はCWの幅+窓枠幅*2。母艦の高さはCWの高さ+バー幅+窓枠幅。     母艦枠固定中央表示。   処理用を母艦のクライアント幅,母艦のクライアント高さで画像リサイズ。   CWハンドルをフルスクリーン表示フラグにスケーリングフラグ設定。 *終了処理   CWハンドルからカメラ切断。   CWハンドルをウィンドウ破棄。   終わる。 #----------------------------------------------------------- *操作説明   ダイアログタイトルは「操作説明」   「◆[Enter]キーでキャプチャ画面のスナップショットを保存。    ◆[F5]キーでキャプチャ動画を保存。  [Esc]キーか、マウスボタンを押すことで保存終了となります。  ※終了させない限り、録画し続けます。   ◆[Space]キーで、フルスクリーン表示。  フルスクリーン表示時に[Space]キーで、ウィンドウ表示に戻る。   ◎フルスクリーンモードは、右クリックメニューで変更できます。  ・ノーマル(デスクトップに合わせて映像を引き延ばします)  ・レターボックス(縦横比固定。左右に黒枠が入ります)  ・ズーム(縦横比固定。上下を切ってデスクトップ一杯に表示)  ※設定ファイルは作ってないので、毎回初期値に戻ります。」と言う #----------------------------------------------------------- *バージョン   ダイアログタイトルは「バージョン情報」   「{二重カッコ}PCカメラキャプチャー{二重カッコ閉じ}{改行}   Version 3.01{改行}{改行}   by 雪乃☆雫」と言う。 #----------------------------------------------------------- #!WS_VISIBLEとは整数=$10000000 # 初期状態(枠なし)で表示。 !WS_DISABLEDとは整数=$8000000 # 初期状態で非表示。 !WS_CAPTIONとは整数=$C00000 # タイトルバーを持つ。 !WS_SYSMENUとは整数=$80000 # システムメニューボタン。 *母艦枠固定中央表示   母艦ハンドルを(デスクトップW-母艦の幅)/2,(デスクトップH-母艦の高さ)/2,母艦の幅,母艦の高さでWS_VISIBLE||WS_CAPTION||WS_SYSMENUに窓ハンドルスタイル設定。   CWハンドルを0,0,母艦のクライアント幅,母艦のクライアント高さに窓ハンドル位置サイズ設定。   母艦の可視はオン。  #オンにしなくてもウィンドウは表示されるけど、タスクバーには表示されなくなる! *母艦枠無全画面表示   母艦ハンドルを0,0,デスクトップW,デスクトップHでWS_VISIBLEに窓ハンドルスタイル設定。   母艦の可視はオン。 *窓枠幅算出   母艦ハンドルを(デスクトップW-母艦の幅)/2,(デスクトップH-母艦の高さ)/2,母艦の幅,母艦の高さでWS_DISABLED||WS_CAPTION||WS_SYSMENUに窓ハンドルスタイル設定。   窓枠幅=(母艦の幅-母艦のクライアント幅)/2   バー幅=(母艦の高さ-母艦のクライアント高さ-窓枠幅) #----------------------------------------------------------- #-----ビデオキャプチャー------------------------------------ #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 # ビデオキャプチャに使用されるファイルの名前を指定します。 !WM_CAP_EDIT_COPY=$400+30 # 画面をクリップボードにコピー。 !WM_CAP_DLG_VIDEOFORMAT=$400+41 # ビデオ形式を選択できるダイアログボックスが表示されます。 !WM_CAP_DLG_VIDEOSOURCE=$400+42 # ビデオソースを制御できるダイアログボックスが表示されます。 !WM_CAP_GET_STATUS=$400+54 # キャプチャウィンドウのステータスを取得します。 #----------------------------------------------------------- ●カメラ接続(ハンドルに{数値=0}Noの)   メッセージ送信(ハンドル,WM_CAP_DRIVER_CONNECT,No,0)  # カメラが1台ならNoは0でOK ●カメラ切断(ハンドルから)   メッセージ送信(ハンドル,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=オン/オフ ●クリップボードコピー(ハンドルを)   メッセージ送信(ハンドル,WM_CAP_EDIT_COPY,0,0) #----------------------------------------------------------- ●ビデオ形式ダイアログ   メッセージ送信(CWハンドル,WM_CAP_DLG_VIDEOFORMAT,0,0)   ウィンドウサイズ設定。   CWハンドルを0,0,母艦のクライアント幅,母艦のクライアント高さに窓ハンドル位置サイズ設定。 ●ビデオソースダイアログ   メッセージ送信(CWハンドル,WM_CAP_DLG_VIDEOSOURCE,0,0) #----------------------------------------------------------- ●ステータス取得(ハンドルの)   PACK(CW,S,"UINT,UINT,BOOL,BOOL,BOOL,long,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  ・幅  ・高さ  ・fLiveWindow  ・fOverlayWindow  ・fScale  ・ptScroll  ・fUsingDefaultPalette  ・fAudioHardware  ・fCapFileExists  ・dwCurrentVideoFrame  ・dwCurrentVideoFramesDropped  ・dwCurrentWaveSamples  ・dwCurrentTimeElapsedMS  ・hPalCurrent  ・fCapturingNow  ・dwReturn  ・wNumVideoAllocated  ・wNumAudioAllocated #----------------------------------------------------------- #-----API--------------------------------------------------- #https://msdn.microsoft.com/ja-jp/library/cc428606.aspx ●capCreateCaptureWindow(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 // ウィンドウ識別子…ってなんすか; )") ●キャプチャーウィンドウ作成(スタイルで親ハンドルに)   capCreateCaptureWindow("",スタイル,0,0,640,480,親ハンドル,0) #----------------------------------------------------------- #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) #----------------------------------------------------------- #https://msdn.microsoft.com/ja-jp/library/cc411203.aspx ●SetWindowLong(hWnd,nIndex,dwNewLong) =DLL("user32.dll", "LONG SetWindowLongA( HWND hWnd, // ウィンドウのハンドル int nIndex, // 設定する値のオフセット LONG dwNewLong // 新しい値 )") !GWL_STYLEとは整数=-16     # ウィンドウスタイル !SWP_FRAMECHANGEDとは整数=$20  # SetWindowLong関数を使用後に新しいフレームスタイルの設定を適用 ●窓ハンドルスタイル設定(ハンドルを{数値=0}X,{数値=0}Y,{数値=0}W,{数値=0}Hでスタイルに)   SetWindowLong(ハンドル,GWL_STYLE,スタイル)   SetWindowPos(ハンドル,0,X,Y,W,H,SWP_FRAMECHANGED)   # SetWindowLongによるウィンドウの属性変更を反映させるには、SetWindowPosでSWP_FRAMECHANGEDを指定して反映させる必要がある。 #-----------------------------------------------------------