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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0401
kai自作モジュール「SSget」を公開!!4解決


kai

リンク

2014/4/1(Tue) 06:29:27|NO.61151

自作モジュール「SSget」を公開しました。

SSgetは、スクリーンショットを簡単に撮影することができるモジュールです。

自由に使ってください。

https://www.sugarsync.com/pf/D2057718_290_660944218



この記事に返信する


kanahiron

リンク

2014/4/1(Tue) 14:14:56|NO.61158

マルチディスプレイ環境だとプライマリディスプレイしか取れないのですが…
PrintScreenでの取得は出来るんですけどね

他にも
buffer 2を内部で使っているのでそこにボタン用のバッファなどを使っていた場合は消されてしまう(笑)
描画先ウィンドウIDが勝手に変更される

と問題が有ります



YSR

リンク

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
修正は後で考えます。



YSR

リンク

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



MillkeyStars

リンク

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



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