HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0917
スペースDirectXのキャプチャ3未解決


スペース

リンク

2015/9/17(Thu) 15:44:13|NO.71761

フルスクリーンモードで動作するDirectXを使用したゲーム等の画面を取得したいのですが、
BitBltだと取得することが出来ません。

http://www.hsp.tv/play/pforum.php?mode=pastwch&num=38561
自分が調べた限り、最も近いスレはこちらしか発見できませんでした。

一応、仮想Webカメラを使ってのキャプチャは出来たのですが、
配布するとなると各自でインストールする必要があり、非常に面倒です。
なのでできれば他の方法を使いたいと思い質問しました。
もし方法を知っている方が居ましたら、教えていただけないでしょうか?



この記事に返信する


くちくん

リンク

2015/9/17(Thu) 17:41:04|NO.71762

#include "llmod3/llmod3.hsp"
#include "llmod3/input.hsp" keybd_event 44,-1,1 ;Print Screenを押したことになる、アクティブウィンドウのみをキャプチャ exec "C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe",4 ;テスト用 keybd_event 17,0,0 keybd_event 86,-1,1 keybd_event 17,0,$2 end
llmod3を使います。(keybd_event)
これでアクティブウィンドウはキャプチャできるんですけどね・・・
DirectXでできるのかな?



くちくん

リンク

2015/9/17(Thu) 18:05:24|NO.71764

hmm.dllをダウンロードしてhsp34フォルダに突っ込んでください。
下記サンプルを実行ファイルにしてください。

/* DirectGraphicsのサンプルです。 マウスカーソルをの位置で画像を表示します。 ESCで終了します。 SHIFTで画面モードを切り替えます。 SPACEで残像っぽいエフェクトサンプル */ ;---------------------- ; ;---------------------- #include "hmm.as" #include "hspext.as" #packopt name "ax" ;---------------------- ; ;---------------------- #define FULL_SCREEN_MODE 0 #define WINDOW_MODE 1 #define STAR_MAX 256 #define PARAM_MAX 10 #define pos_x 0 #define pos_y 1 #define speed_x 2 #define speed_y 3 #define scale 4 #define angle 5 #define color_r 6 #define color_g 7 #define color_b 8 #define color_a 9 ;---------------------- ; ;---------------------- *init title "hmm.dll sample [esc=end][shift=chngscrmode][space=effect]" randomize diInit ScreenMode = 1: gosub *initdg dim SinTbl, 256: dim CosTbl, 256 repeat 256 emsin SinTbl.cnt, cnt: emcos CosTbl.cnt, cnt loop dim Star, STAR_MAX, PARAM_MAX repeat STAR_MAX StarNumber = cnt: gosub *setparam loop ;---------------------- ; ;---------------------- *main await 0 hmmgetfps fps gosub *keycheck gosub *draw gosub *moveparam dgReDraw ;画面更新 if stat == 0 { // ALT+TAB、スクリーンセーバー、省電力モードなどで // 画面更新が失敗したら初期化して画像などを読み込みし直す // この時にはウィンドウモードにすること ScreenMode = WINDOW_MODE gosub *initdg } goto *main ;---------------------- ; ;---------------------- *setparam Star.StarNumber.pos_x = mousex<<8: Star.StarNumber.pos_y = mousey<<8 r = rnd( 256 ) Star.StarNumber.speed_x = CosTbl.r Star.StarNumber.speed_y = SinTbl.r Star.StarNumber.scale = rnd( 392 ) Star.StarNumber.angle = rnd( 257 ) Star.StarNumber.color_r = rnd( 128 ): Star.StarNumber.color_r += 128 Star.StarNumber.color_g = rnd( 128 ): Star.StarNumber.color_g += 128 Star.StarNumber.color_b = rnd( 128 ): Star.StarNumber.color_b += 128 Star.StarNumber.color_a = rnd( 128 ): Star.StarNumber.color_a += 128 return ;---------------------- ; ;---------------------- *moveparam repeat STAR_MAX StarNumber = cnt ;パラメーターの変更 Star.StarNumber.pos_x += Star.StarNumber.speed_x: Star.StarNumber.pos_y += Star.StarNumber.speed_y Star.StarNumber.color_a --: Star.StarNumber.angle += 4 ;パラメーターの初期化判定 x = Star.StarNumber.pos_x>>8: y = Star.StarNumber.pos_y>>8: a = Star.StarNumber.color_a if ( x < 0 ) || ( x > 640 ) || ( y < 0 ) || ( y > 480 ) || ( a <= 0 ): gosub *setparam loop return ;---------------------- ; ;---------------------- *draw dgGsel 0 dgColor 0, 0, 0, 255: dgClear ;画面のクリア dgGsel 2: dgColor 0, 0, 0, 255: dgClear /* ;星の描画( ver DGGCOPY ) dgBlendMode 2: dgRect 0, 0, 96, 32 repeat STAR_MAX StarNumber = cnt dgScaleAndAngle Star.StarNumber.scale, Star.StarNumber.scale, Star.StarNumber.angle dgColor Star.StarNumber.color_r, Star.StarNumber.color_g, Star.StarNumber.color_b, Star.StarNumber.color_a dgPos Star.StarNumber.pos_x>>8, Star.StarNumber.pos_y>>8: dgGcopy 1,5 loop */ ;星の描画( ver DGDRAWPRIMITIVE ) dgTexture 1: dgBlendMode 2: dgRect 0, 0, 96, 32 repeat STAR_MAX StarNumber = cnt dgScaleAndAngle Star.StarNumber.scale, Star.StarNumber.scale, Star.StarNumber.angle dgColor Star.StarNumber.color_r, Star.StarNumber.color_g, Star.StarNumber.color_b, Star.StarNumber.color_a dgPos Star.StarNumber.pos_x>>8, Star.StarNumber.pos_y>>8: dgAddPrimitive 5 loop: dgDrawPrimitive dgBlendMode 2 repeat 128 ca = rnd( 256 ): cb = rnd( 256 ): cg = rnd( 256 ) ex = rnd( 320 ): ey = rnd( 240 ) dgColor ca, cb, cg, 255: dgLine 0, 0, ex, ey loop if AfterEffect { dgGsel 3 dgBlendMode 1: dgColor 255, 255, 255, 16 dgRect 0, 0, 640, 480: dgScaleAndAngle 256, 256, 0 dgPos 0, 0: dgGcopy 2 cpybufid = 3 } else { cpybufid = 2 } dgGsel 0 dgBlendMode 0: dgColor 255, 255, 255, 255 dgRect 0, 0, 640, 480: dgScaleAndAngle 256, 256, 0 dgPos 0, 0: dgGcopy cpybufid dgPos 640-96, 480-16: dgColor 255, 255, 255, 255: dgDrawText "fps="+fps, 96, 16 return ;---------------------- ; ;---------------------- *keycheck diGetKeyState key, 0 diGetMomentKeyState key, 0 //押した瞬間のキーを取得 //サンプルの終了と画面のキャプチャ hmmBitCheck key, KEY_ESC_BIT if stat == 1 { dgBmpSave "bmpsave.bmp" end //ESCが押されたら終了 } //画面モードチェンジ hmmBitCheck key, KEY_SHIFT_BIT if stat == 1 { if ScreenMode { ScreenMode = FULL_SCREEN_MODE } else { ScreenMode = WINDOW_MODE } gosub *initdg } hmmBitCheck key, Key_SPACE_BIT if stat == 1 : AfterEffect = AfterEffect^1 return ;---------------------- ; ;---------------------- *initdg dgInit: if stat == DG_ERR: dialog "init err": end dgScreen 640, 480, ScreenMode, 32, 0: if stat == DG_ERR: dialog "screen err": end dgRenewalTiming 60 //PCの性能にまかせて描画 //dgScreen 640, 480, ScreenMode, 32, 1: if stat == DG_ERR: dialog "screen err": end //dgRenewalTiming 60 dgBuffer 1, 64, 64: if stat == DG_ERR: dialog "buffer err": end dgFont "MS ゴシック", 32: if stat == DG_ERR: end dgGsel 1: dgScaleAndAngle 256, 256, 0: dgClear dgColor 255, 255, 255, 255: dgPos 0, 0 dgDrawText "HSP", 96, 32: if stat == DG_ERR: end dgCreatePrimitive STAR_MAX dgFont "MS ゴシック", 16: if stat == DG_ERR: end dgBuffer 2, 640, 480: dgBuffer 3, 640, 480 return
そのあと、
#include "llmod3/llmod3.hsp"
#include "llmod3/input.hsp" exec "保存した実行ファイルのパス" wait 300;*1参照 keybd_event 44,-1,1 exec "C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe" keybd_event 17,0,0 keybd_event 86,-1,1 keybd_event 17,1,$2 end
を実行すると、ワードパッドの画面にDirectx描画がコピーされます。
*1
waitは最低100あったらいいかもしれない。いろいろ試してください。

違ったらごめんなさい。



スペース

リンク

2015/9/17(Thu) 18:59:10|NO.71766

>>くちくんさん
有難うございます。サンプルを実行した所、確かにキャプチャできました。
ただ、キャプチャソフトを作っていて連続してキャプチャする必要があるので、
キーイベントを何度も何度も送信し続けるというのは処理的にも重く、
ソフトによってはスクリーンショットを保存するショートカットキーとして割り当てられている場合もある為、
申し訳ないのですがキーイベントを送信する方法は使用することが出来ません。
最初から「キャプチャソフトを作っている」と伝えるべきでした。



ONION software Copyright 1997-2023(c) All rights reserved.