布団が俺を呼んでいる

丘山大一のぶろぐ

別プロセスの画面キャプチャをしたい

言語はC#。実態(実体)はWinAPI。

別プロセスの画面キャプチャを取得し、画像として保存したい。

今回の対象プロセスはskype(exe名はlync)です。
こんな感じで書きました。

        [System.Runtime.InteropServices.DllImport("User32.dll")]
        private extern static bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);

        [System.Runtime.InteropServices.DllImport("User32.dll")]
        private static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);

        private const string FORMAT_TIME = "yyyyMMddhhmmss";

        private void SavePicture()
        {
                    //Skypeのハンドルの取得
                    var pLst = System.Diagnostics.Process.GetProcesses().Where(p => p.ProcessName == "lync").ToArray();
                    var handle = pLst.First().MainWindowHandle;
                    RECT rec = new RECT();
                    var size = GetClientRect(handle, out rec);
                    //画像処理
                    Bitmap img = new Bitmap(rec.Right - rec.Left, rec.Bottom);
                    Graphics memg = Graphics.FromImage(img);
                    IntPtr dc = memg.GetHdc();
                    PrintWindow(handle, dc, 0);
                    memg.ReleaseHdc(dc);
                    memg.Dispose();

                    DateTime dt = DateTime.Now;
                    img.Save($@".\DATA\{dt.ToString(FORMAT_TIME)}.png");
        }

上記の問題点

プロセス名で単純に取得しているため、skype上で別ウィンドウ(例えばIM)を開いたりすると、メインウィンドウではなくそちらがキャプチャされてしまいます。
自分の用途としては許容範囲なのでOKとしました。
※上記処理では、例外処理を省いています。


プログラミングWindows 第6版 上 (Microsoft Press)

新品価格
¥7,560から
(2016/4/7 18:54時点)

コメントを書く

布団が俺を呼んでいる | SQL Server BCPユーティリティ 空文字はNULL文字として出力される

布団が俺を呼んでいる

丘山大一のぶろぐ

SQL Server BCPユーティリティ 空文字はNULL文字として出力される

恥ずかしながら知りませんでした。

ココで確認

>bcp ユーティリティは、データを抽出するときに、空文字列を NULL 文字列で、NULL 文字列を空文字列で表すことに注意してください。
NULLをNULL文字 で、ではなく、NULL なら空文字。
空文字なら NULL文字。
直感と逆なんですね。

なんでコレに困ったか

bcpで吐き出したファイルを別プログラムで処理しようとしました。
んが、途中でNULL文字が入っているため、本当なら空文字として取り扱いところが、終端文字として扱われてしまってうまく処理できなかった、という。

SQL Server 2016の教科書 開発編

新品価格
¥3,888から
(2016/8/27 22:22時点)

コメントを書く