2020-11-28 05:01:51
Re④:WEBカメラの立ち上げ
タブンできたので貼る。 前に書いたよーな理由で、お試しはしてませんが; #----------------------------------------------------------------------- # なでしこでwebカメラを起動して表示 #----------------------------------------------------------------------- !母艦設計=「母艦の可視はオフ」 #-----宣言-------------------------------------------------- CWハンドルとは整数=-1 #キャプチャーウィンドウのハンドル。 !WS_VISIBLEとは整数=$10000000 # 初期状態(枠なし)で表示。 !WS_CHILDとは整数=$40000000 # 子ウィンドウ。 CWスタイルとは整数=WS_VISIBLE||WS_CHILD #キャプチャーウィンドウのスタイル カメラ接続状態とは整数=オフ。 フレームレートとは整数=60 #ミリ秒単位 #----------------------------------------------------------- #-----母艦設計---------------------------------------------- #---母艦----- 母艦について 位置は「0,0」 スタイルは「枠固定」 オフに最大化ボタン有効変更。 オフに最小化ボタン有効変更。 タイトルは「webカメラ」 閉じた時は~終了処理。 母艦を黒色で画面クリア。 #----------------------------------------------------------- #-----メイン------------------------------------------------ カメラ起動。 ウィンドウサイズ設定。 母艦の可視はオン。 #----------------------------------------------------------- *カメラ起動 キャプチャーウィンドウ作成("",CWスタイル,0,0,640,480,母艦のハンドル,0) CWハンドルはそれ。1秒待つ。 5回 CWハンドルに0のカメラ接続。 1秒待つ。 もし、それがはいならば、カメラ接続状態はオン。抜ける。 もし、カメラ接続状態がオフならば、 CWハンドルをウィンドウ破棄。 「カメラに接続出来ませんでした」と言う。 終わる。 CWハンドルをフレームレートにプレビューレート設定。 CWハンドルをオンにプレビューモード設定。 *ウィンドウサイズ設定 CWハンドルのステータス取得。 母艦のクライアント幅はCWの幅 母艦のクライアント高さはCWの高さ *終了処理 CWハンドルからカメラ切断。 CWハンドルをウィンドウ破棄。 終わる。 #----------------------------------------------------------- #-----キャプチャー用関数------------------------------------ #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_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=オン/オフ #----------------------------------------------------------- ●ステータス取得(ハンドルの) 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 ●キャプチャーウィンドウ作成(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 ●ウィンドウ破棄(ハンドルを) =DLL("user32.dll", "BOOL DestroyWindow( HWND hWnd // 破棄するウィンドウのハンドル )") #----------------------------------------------------------- おっしゃるとうりの、最低限の機能にしました。 前に貼ったリンク先との違いは、ちゃんとカメラのキャプチャーウィンドウのステータスをゲットして、母艦のサイズを設定している点です。 カメラや設定によって解像度が変わるから、決め打ちじゃダメだったんです。 |