Thread Rating:
  • 456 Vote(s) - 2.92 Average
  • 1
  • 2
  • 3
  • 4
  • 5
スクリーンショットを取得したい
05-31-2013, 06:50 PM,
#4
RE: スクリーンショットを取得したい
ご指摘の通り、エラーが発生したときの状況把握という目的だとイマイチなのですよね・・・
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でもこの技つかえましたね、
ということでご参考まで。


Messages In This Thread
RE: スクリーンショットを取得したい - by dyoshida - 05-31-2013, 06:50 PM
Forum Jump:


Users browsing this thread:
2 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('906')