個人的にアプリを作るときに3DはUnityで表示させてその上に動画などをAIRで表示というように二重にアプリを重ねて表示させるという手法を取っています。
そういう二重構造アプリで画面全体をキャプチャしたいということがたまに出てきます。Unityのアプリ内、AIRのアプリ内のキャプチャは簡単にできますが、画面全体だと思わぬ苦戦をしたのでその時に作ったC#でスクリーンショットアプリを紹介します。ここで紹介しているC#アプリはこちらGitHubにプロジェクトファイルをアップしています。
C#(WPF) code
以下の方法以外にもクリップボード経由の[Print Screenキーストロークを送信する方法]もやったのですが、AIR側から実行するとたまにクリップボードに画像が保存されないという不安定な動作があったため以下のような方法をとっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
using System; using System.Windows; using System.Windows.Media.Imaging; using System.Drawing; using System.Windows.Interop; using System.IO; namespace Capture { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // BitmapSourceを保存する using (Stream stream = new FileStream(System.Windows.Forms.Application.StartupPath + @"capture.png", FileMode.Create)) { PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(CopyScreen())); encoder.Save(stream); } Environment.Exit(0); } private static BitmapSource CopyScreen() { using (var screenBmp = new Bitmap( (int)SystemParameters.PrimaryScreenWidth, (int)SystemParameters.PrimaryScreenHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { using (var bmpGraphics = Graphics.FromImage(screenBmp)) { bmpGraphics.CopyFromScreen(0, 0, 0, 0, screenBmp.Size); return Imaging.CreateBitmapSourceFromHBitmap( screenBmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } } } } } |
参考
http://sourcechord.hatenablog.com/entry/20131013/1381691785
http://bacchus.ivory.ne.jp/gin/post-994/
AIR(ActionScript) code
AIRで上記のC#アプリを起動させる場合は以下のように NativeProcess を使用して実行させます。
1 2 3 4 5 |
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); var file:File = new File(File.applicationDirectory.resolvePath("Capture.exe").nativePath); nativeProcessStartupInfo.executable = file; var process:NativeProcess = new NativeProcess(); process.start(nativeProcessStartupInfo); |
コメントを残す