|
|
2014/4/1(Tue) 14:14:56|NO.61158
マルチディスプレイ環境だとプライマリディスプレイしか取れないのですが…
PrintScreenでの取得は出来るんですけどね
他にも
buffer 2を内部で使っているのでそこにボタン用のバッファなどを使っていた場合は消されてしまう(笑)
描画先ウィンドウIDが勝手に変更される
と問題が有ります
|
|
2014/4/3(Thu) 00:22:35|NO.61286
ここまで小規模なコードだとそのまま掲示板に貼り付けた方がいいのではないのでしょうか。
#module
#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
#deffunc SSget str p1
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
bmpsave p1
return
#global
修正は後で考えます。
|
|
2014/4/3(Thu) 01:46:11|NO.61287
修正完了。
/* 指定したバッファに保存する方が汎用性が高いと思います */
// モジュール
#module
#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
// 構文 : getSS BufferID(int), ScreenShotSizeX(var), ScreenShotSizeY(var), SSFlg(int)
// 機能 : 画面のスクリーンショットを取得し、バッファに保存する。
// 引数 : BufferIDは保存先のバッファIDを示す。ScreenShotSizeXとScreenShotSizeYは返値の項を参照。
// SSFlgは0の時プライマリディスプレイのみ、1の時全ディスプレイのものを取得。
// 返値 : 正常に取得できた場合はScreenShotSizeXとScreenShotSizeYに画像サイズが代入される。
// そうでない場合は共に-1になる。
#deffunc getSS int BufferID, var ScreenShotSizeX, var ScreenShotSizeY
// 変数初期化
ScreenShotSizeX = -1 :ScreenShotSizeY = -1
// ディスプレイのデバイスコンテキストを取得
hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL)
if(hdcScreen == NULL) :return
// バッファを作成し、画像を保存する
DisplaySizeX = ginfo_dispx :DisplaySizeY = ginfo_dispy
buffer BufferID, DisplaySizeX, DisplaySizeY
BitBlt hdc, 0, 0, DisplaySizeX, DisplaySizeY, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT
if(stat == 0) :return
DeleteDC hdcScreen
if(stat == 0) :return
ScreenShotSizeX = DisplaySizeX :ScreenShotSizeY = DisplaySizeY
return
#global
// サンプルコード
BufferID = ginfo(25) ;スクリーンショットを保存するためのウィンドウID
getSS BufferID, ScreenShotSizeX, ScreenShotSizeY ;スクリーンショットを取得
if((ScreenShotSizeX <= 0) | (ScreenShotSizeY <= 0)){
mes "スクリーンショットを取得できませんでした。" :stop
}
PutWindowID = ginfo(25) ;スクリーンショットを表示するためのウィンドウID
screen PutWindowID, ScreenShotSizeX, ScreenShotSizeY ;新しくウィンドウを作成
title "キャプチャ後の画面"
gcopy BufferID, 0, 0, ScreenShotSizeX, ScreenShotSizeY ;画像データをコピーする
stop
マルチディスプレイ全体のスクリーンキャプチャにはGetDC(NULL)すれば大丈夫なはずですが、
それで得たハンドルにGetWindowRectやGetClientRectを使ってもサイズが取得できませんでした……。
参考: http://chokuto.ifdef.jp/advanced/capturewindow.html
| |
|
2014/4/3(Thu) 03:20:18|NO.61288
マルチディスプレイじゃないので検証はできないけど、MonitorFromPoint でマルチディスプレイの座標に対してのハンドルを取得すればいいんじゃないかなー?
#uselib "user32.dll"
#cfunc MonitorFromPoint "MonitorFromPoint" int,int,int
#cfunc GetMonitorInfo "GetMonitorInfoA" int,var
MainMoni = MonitorFromPoint(0,0,0) //引数 指定点x,指定点y,戻り値モード(0を指定する事)
dim MonitorData,72/4
MonitorData(0) = 72
if GetMonitorInfo(MainMoni,MonitorData)=0 : dialog "取得失敗"
mes "Disp.left = "+MonitorData(1)
mes "Disp.top = "+MonitorData(2)
mes "Disp.right = "+MonitorData(3)
mes "Disp.bottom = "+MonitorData(4)
mes "Work.left = "+MonitorData(5)
mes "Work.top = "+MonitorData(6)
mes "Work.right = "+MonitorData(7)
mes "Work.bottom = "+MonitorData(8)
mes "DisplayMode = "+MonitorData(9)
sdim DispName,32
memcpy DispName,MonitorData,32,0,40
mes "DisplayName = "+DispName
|
|