デスクトップ複数キャプチャして切り替え
//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