|
|
2019/1/11(Fri) 08:11:10|NO.86297
パソコン自体で [Alt]+[PrtSc] でスクリーンショットを保存した場合は
オブジェクトもオブジェクト内の内容も画像保存されますが、
bmpsave で画像保存したものには、それらが反映されていません。
アクティブ画面内の全てのイメージを画像保存させる方法を教えて下さい。
|
|
2019/1/11(Fri) 09:56:15|NO.86298
デスクトップ全体をキャプチャし、自分のウィンドウだけを切り抜いて表示。
※但し、他のウィンドウと重なっている場合は正常に動きません。
gsel命令などを活用してください。
#uselib "gdi32.dll"
#cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int
#func DeleteDC "DeleteDC" int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
#define NULL 0
#define SRCCOPY 0x00CC0020
#define CAPTUREBLT 0x40000000
; ウィンドウ非表示
screen 0,640,480
winx=ginfo(12):winy=ginfo(13)
wpx=ginfo(4)+3 //なんか誤差あるんで+3
wpy=ginfo(5)+(ginfo(11)-ginfo(13))-2 //デスクトップ全体から見た位置+タイトルバーのYサイズ(誤差で-2)
sdim a
a="qうぇrちゅいおp@「"
font"meiryo",64:objmode 2
input a,320,240,-1
wait 50
; デスクトップ画面のサイズでバッファ画面を作成
sx = ginfo_dispx : sy = ginfo_dispy
buffer 2, sx, sy
; デスクトップ画面のデバイスコンテキスト取得
hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL)
; デスクトップ画面の画像をコピー
BitBlt hdc, 0, 0, sx, sy, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT
; デバイスコンテキスト削除
DeleteDC hdcScreen
; ビットマップファイルとして保存
buffer 3,winx,winy
pos 0,0:gcopy 2,wpx,wpy,winx,winy
dialog "bmp", 17
if stat {
bmpsave refstr
}
end
参考 : http://chokuto.ifdef.jp/advanced/capturescreen.html
|
|
2019/1/11(Fri) 11:08:21|NO.86300
他のウィンドウで隠れてもちゃんとキャプチャーできるやつ。
win7でAero無効か、win7以前だとうまくキャプチャーできないかもしれません。
#uselib "user32.dll"
#cfunc GetDC "GetDC" int
#uselib "gdi32.dll"
#func DeleteDC "DeleteDC" int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
#define NULL 0
#define SRCCOPY 0x00CC0020
#define CAPTUREBLT 0x40000000
; ウィンドウ非表示
screen 0,640,480
boxf
sdim a
a="qうぇrちゅいおp@「"
font"meiryo",64:objmode 2
input a,320,240,-1
wait 50
; 自ウィンドウのデバイスコンテキストを取得
hdcScreen = GetDC(hwnd)
; 画面のサイズでバッファ画面を作成
buffer 2,ginfo_winx,ginfo_winy
; 画面の画像をコピー。
BitBlt hdc,0,0,ginfo_winx,ginfo_winy, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT
; デバイスコンテキスト削除
DeleteDC hdcScreen
; ビットマップファイルとして保存
dialog "bmp", 17
if stat {
bmpsave getpath(refstr,1)+".bmp";拡張子を消してからつけ直す。
}
end
|
|
2019/1/11(Fri) 17:48:05|NO.86301
PrintWindow を使った方法です。
#uselib "user32.dll"
#func PrintWindow "PrintWindow" int,int,int
#define PW_CLIENTONLY 0x00000001
screen 0
input a
//画面を保存するウィンドウの情報を取得
hnd = hwnd
sx = ginfo_sx
sy = ginfo_sy
buffer 1, sx, sy
PrintWindow hnd, hdc, PW_CLIENTONLY //ウィンドウの中身をbufferに描画する
dialog "bmp",17
if stat{
s=refstr
if getpath(s, 2)=="":s+=".bmp"
bmpsave s //保存
}
|
|
2019/1/12(Sat) 06:38:31|NO.86306
よっぴーさん、ソラさん、いののてさん
ご返答ありがとうございます。理解が追いつかず、お礼が遅れました。
よっぴーさんのものと格闘していると、ソラさんからも頂き、恐縮しきりでいると、
いののてさんからも別のアプローチで、本当にありがたく思います。
しかしながら、私の力不足で、時間ばかり過ぎてしまいました。
よっぴーさんが参考に上げていらしたサイトの解説を読んでみました。
知識としては、なんとなくそういうものか、といった程度にしか理解が進んでいません。
また、いののてさんの方法に関しては、「PrintWindow」で過去ログ検索してヒットした
f さん、begriffさんのものも参考にし、突き合わせて理解に努めました。
当てずっぽうの一知半解状態ですが、それでも、皆さんの方法、どうにか使えるだけは
使えるように思えてきました。
本来の自分のプログラムは、条件によって大きさを変える「screen」とそれとは別の
「screen」といった、ふたつの「screen」を行き来し、「gosub」で入り組んでいます。
そのため、皆さんの命令を記述する位置によって、なかなか思っている結果を得られません。
試しに作った短かめのものでは、どなたの命令でも成功しているので、引き続き
取り組んでいきます。うまく行き次第、解決といたします。
追伸
NO.86305 の ゆう やん さんも、自分と同じような質問をもっていらっしゃるようです。
|
|
2019/1/12(Sat) 10:58:25|NO.86308
御三方のどの方法でも、元の自分のプログラムに組み込んで、
狙い通りの結果を得ましたので、解決といたします。
ありがとうございました。
|
|