デスクトップ複数キャプチャして切り替え

//ManyCamなどの動画配信ソフトには「画面内の特定領域をキャプチャしてSkypeやUstreamで配信する」

//という機能がありますが,このソフトを使うとキャプチャ元を予め複数セットしておいて,

//キーボード操作で簡単に配信元を切り替えることができます.

//プレゼンやその他の用途にも使えるかもしれません.

// 使い方

//変数nでキャプチャ元の数を設定します.

//たとえばn=3のときには,キャプチャ元のウィンドウが1~3の3つ起動し,

//さらに出力先ウィンドウが1つ起動します.

//あとはキーボードの数字キーの1~3を押すと,キャプチャ元がその番号のウィンドウに

//切り替わります.

//今のところ,拡大縮小がうまくいっていません.

//user32.as をインクルードする必要があります.

//////////////////////////////////////////

;起動時のパラメータ設定2箇所

n = 3;キャプチャ数(起動ウィンドウ数,1から9まで)

keepRatio = 1;0でキャプチャ元アスペクト比無視の拡大,1でアスペクト比を保って拡大

//////////////////////////////////////////

cap = 1;現在のキャプチャ元のウィンドウ番号

#include "user32.as"

#include "gdi32.as"

#uselib "user32.dll"

#func GetWindowLongA "GetWindowLongA" int , int

#func SetWindowLongA "SetWindowLongA" int , int , int

#func SetLayered "SetLayeredWindowAttributes" int , int , int , int

#func SendMessageA "SendMessageA" int , int , int , int

#func PostMessageA "PostMessageA" int , int , int , int

#func SetCapture "SetCapture" int

#func ReleaseCapture "ReleaseCapture"

//ウィンドウの大きさ初期値

w = 640

h = 480

//ウィンドウの大きさ最大値

wMax = 1920

hMax = 1200

;0番ウィンドウはサイズ変更できないので使わない.

buffer 0, 1, 1

//キャプチャ元ウィンドウを生成する

repeat n

screen cnt+1, wMax, hMax, , (cnt+1)*100, (cnt+1)*100, w, h


GetWindowLongA hwnd , -20

SetWindowLongA hwnd , -20 , stat | 0x00080000

SetLayered hwnd , 0x0000ff , 0 , 1

color 255,0,0

boxf


title "キャプチャ元の" + (cnt+1) + "番ウィンドウ"

loop

//出力先ウィンドウを生成する

screen n+1, wMax, hMax, , (n+1)*100, (n+1)*100, w, h

title "" + cap + "番ウィンドウからキャプチャ中です"

onexit *p_end


/////////////////////////////////////////////////////////////////////////////////////////////

//ウィンドウの縁のサイズ

hutiX = 7

hutiY = 30


repeat


;キャプチャ元を数字キーでスイッチする

SwitchCap

gsel cap

px=ginfo(4)+hutiX : py=ginfo(5)+hutiY


sx=ginfo(12)

sy=ginfo(13)


gsel n+1

GetDC 0 : DC=stat

if DC=0 : dialog "DC ERROR" : end


buffer n+2,sx,sy,0 : buffer_hdc=hdc;n+2番ウィンドウがgzoomのためのバッファ

bitblt buffer_hdc,0,0,sx,sy,DC,px,py,0xCC0020

ReleaseDC 0,DC


gsel n+1

toW = ginfo(6)-ginfo(4)

toH = ginfo(7)-ginfo(5)

gsel cap

fromW = ginfo(6)-ginfo(4)

fromH = ginfo(7)-ginfo(5)

;gsel n+1

;title "fromW = " + fromW + " , fromH = " + fromH + " , toW = " + toW + " , toH = " + toH

;キャプチャ元,出力先ともに横長の場合のみを想定しています

if(keepRatio == 1){

fromRatio = double(fromW) / double(fromH);アス比

toRatio = double(toW) / double(toH);アス比

if(toRatio >= fromRatio){;出力先の方が横長のとき

toW = double(toH) * fromRatio;出力先のアス比もキャプチャ元に合わせる

}

else{;出力先の方が縦長のとき(縦幅は,横幅に)

toH = double(toW) / fromRatio;出力先のアス比もキャプチャ元に合わせる

}

}


gsel n+1

redraw 0

color 255,255,255

boxf

gzoom toW, toH, n+2, 0, 0, fromW, fromH

redraw 1


await 1


loop

*p_end

ReleaseDC 0,DC

end

/////////////////////////////////////////////////////////////////////////////////////////////

;キャプチャ元を変える

//数字キーとテンキーに対応

#deffunc SwitchCap

getkey key1, 49

if(key1 == 1){

SetCap 1

return

}

getkey key1, 97

if(key1 == 1){

SetCap 1

}

getkey key2, 50

if(key2 == 1){

SetCap 2

return

}

getkey key2, 98

if(key2 == 1){

SetCap 2

}

getkey key3, 51

if(key3 == 1){

SetCap 3

}

getkey key3, 99

if(key3 == 1){

SetCap 3

}

getkey key4, 52

if(key4 == 1){

SetCap 4

}

getkey key4, 100

if(key4 == 1){

SetCap 4

}

getkey key5, 53

if(key5 == 1){

SetCap 5

}

getkey key5, 101

if(key5 == 1){

SetCap 5

}

getkey key6, 54

if(key6 == 1){

SetCap 6

}

getkey key6, 102

if(key6 == 1){

SetCap 6

}

getkey key7, 55

if(key7 == 1){

SetCap 7

}

getkey key7, 103

if(key7 == 1){

SetCap 7

}

getkey key8, 56

if(key8 == 1){

SetCap 8

}

getkey key8, 104

if(key8 == 1){

SetCap 8

}

getkey key9, 57

if(key9 == 1){

SetCap 9

}

getkey key9, 105

if(key9 == 1){

SetCap 9

}

return

/////////////////////////////////////////////////////////////////////////////////////////////

//キャプチャ番号を変更

#deffunc SetCap int myN

beforeCap = cap


tmpCap = myN

if(tmpCap > n) : tmpCap = cap;もし作ったウィンドウ数以上のキーを押したらcapはそのまま

cap = tmpCap


if(beforeCap != cap){

title "" + cap + "番ウィンドウからキャプチャ中です"

}


return