ご指摘の通り、エラーが発生したときの状況把握という目的だとイマイチなのですよね・・・
Curlだけで書いているのでプラットフォーム依存がないというメリットはあるのですが
>ちょっと調べた範囲では、Excelを使った方法があるみたいですが
Excelマクロの機能をつかってWin32APIのkeybd_event()でキーイベントを送信・・・
なにかいろいろとレガシーな機能やAPIを使った方法のようなので、OSやExcelの
バージョンによっては動かなくなりそうな裏技っぽい気もしますが、書いてみました。
とりあえず、Windows7 pro(32bit) +Excel2007の環境ではこれで動作しました。
Code:
{import * from CURL.GRAPHICS.ACTIVEX}
{import * from CURL.DESKTOP.CLIPBOARD}
|| WindowsへALT+PrintScreenキー押下イベントを送るプロシージャ
{define-proc {send-alt-print-screen-key}:void
def obj-excel =
{ActiveXObject
ProgId = "Excel.Application"
}
{obj-excel.ExecuteExcel4Macro( "CALL(\"user32\",\"keybd_event\",\"JJJJJ\",18, 0, 1,0)" )} || ALT press
{obj-excel.ExecuteExcel4Macro( "CALL(\"user32\",\"keybd_event\",\"JJJJJ\",44, 0, 1,0)" )} || PrintScreen press
{obj-excel.ExecuteExcel4Macro( "CALL(\"user32\",\"keybd_event\",\"JJJJJ\",44, 0, 3,0)" )} || PrintScreen release
{obj-excel.ExecuteExcel4Macro( "CALL(\"user32\",\"keybd_event\",\"JJJJJ\",18, 0, 3,0)" )} || ALT release
}
|| クリップボードの画像をPNG形式のファイルに保存するプロシージャ
{define-proc {save-clip-board}:void
|| クリップボードを取得
let cb:Clipboard = {Clipboard.get-system-clipboard}
def cb-obj = {cb.get-object}
|| クリップボードから取得したPixmapをImageDataへ格納
|| Todo クリップボードから取得したオブジェクトがpixmapかチェックが必要
let img:ImageData = {ImageData}
{img.pixmaps.append (cb-obj asa Pixmap)}
|| ファイル保存先のダイアログを表示
{let file-url:#Url =
{choose-file
style = FileDialogStyle.save-as,
title="Save screen shot",
filters={{Array-of FileDialogFilter}
{FileDialogFilter
"PNG",
{new
{Array-of FileDialogTypeFilter},
{FileDialogTypeFilter "png"}
}
}
}
}
}
|| ImageDataをPNG形式で指定ファイルパスへ保存
{if-non-null file-url then
{img.save-to-url file-url, "image/png"}
{popup-message "保存しました"}
}
}
|| 保存ボタン押下イベント
{def on-save-button-event:EventHandler =
{on Action at b:CommandButton do
|| WindowsへALT+PrintScreenキー押下イベントを送る
{send-alt-print-screen-key}
|| クリップボードに貼られたスクリーンショットを保存する処理をイベントキューへ積む
|| Todo
|| PrintScreenキーによるスクリーンショットのクリップボードへの貼り付けの完了待ちが
|| イベントキューへ積むだけで取れるのか不明なので念のため1s待って処理
{after 1s do
{save-clip-board}
}
}
}
|| 画面表示
{value
{View
visibility = "normal",
{VBox
halign="center",
margin=2mm,
{bold このアプリのスクリーンショットを保存},
{Fill height = 2mm},
{CommandButton
label="スクリーンショット保存",
on-save-button-event
}
},
{on WindowClose do
{exit}
}
}
}
アクティブウィンドウをキャプチャするために、ALTキーのon/offを追加していますが、
ディスクトップ全体をキャプチャしたい場合は"ALT press"/ ”ALT release”の
コメントが付いている行を削ってください。
とりあえず動きますという程度のコードですが、Curlでもこの技つかえましたね、
ということでご参考まで。