Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9699

PowerShell でスクリーンショットを Excel シートに自動ペースト

$
0
0

C♯ のたすけをかりてクリップボードのイベント駆動に成功

拙文『スクリーンショットをExcelシートに半自動でペーストする(エビデンス取得用)』 (Excel VBA) ではイベント駆動に挫折し無限ループをまわしていますが、こちらは成功いたしました。

Paste-ScreenShotToExcelSheet.ps1
Add-Type-TypeDefinition@'
    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;

    public class ClipboardListeningForm : Form
    {
        [DllImport("user32.dll", SetLastError = true)]
        private extern static void AddClipboardFormatListener(IntPtr hwnd);

        [DllImport("user32.dll", SetLastError = true)]
        private extern static void RemoveClipboardFormatListener(IntPtr hwnd);

        public event EventHandler ClipboardUpdate;
        public const int WM_CLIPBOARDUPDATE = 0x031D;

        protected override void OnLoad(EventArgs e)
        {
            AddClipboardFormatListener(Handle);
            base.OnLoad(e);
        }

        protected override void Dispose(bool disposing)
        {
            RemoveClipboardFormatListener(Handle);
            base.Dispose(disposing);
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_CLIPBOARDUPDATE)
            {
                OnClipboardUpdate(EventArgs.Empty);
                m.Result = IntPtr.Zero;
            }
            else
                base.WndProc(ref m);
        }

        protected virtual void OnClipboardUpdate(EventArgs e)
        {
            EventHandler handler = ClipboardUpdate;
            if (handler != null)
            {
                handler(this, e);
            }
        }            
    }
'@-ReferencedAssembliesSystem.Windows.FormsAdd-Type-AssemblyNameMicrosoft.Office.Interop.Excel$form=New-Object-TypeNameClipboardListeningForm$form.Text='Start Capturing'$excel=New-Object-ComObjectExcel.Application$excel.Visible=$true$xlBook=$excel.Workbooks.Add([Microsoft.Office.Interop.Excel.xlWBATemplate]::xlWBATWorksheet)$xlWorksheet=$xlBook.Worksheets(1)$toggleButton=New-Object-TypeNameSystem.Windows.Forms.CheckBox$toggleButton.Appearance=[System.Windows.Forms.Appearance]::Button$toggleButton.Left=($form.ClientRectangle.Width-$toggleButton.Width)/2$toggleButton.Top=($form.ClientRectangle.Height-$toggleButton.Height)/2$toggleButton.TextAlign=[System.Drawing.ContentAlignment]::MiddleCenter$toggleButton.Text='Start'$toggleButton.add_CheckedChanged({if($toggleButton.Checked){$toggleButton.Text='Stop'$form.Text='Capturing'}else{$toggleButton.Text='Start'$form.Text='Stopped'}})$form.Controls.Add($toggleButton)$form.add_ClipboardUpdate({$targetColumn,$targetRow=2,2if($toggleButton.Checked-and[System.Windows.Forms.Clipboard]::ContainsImage()){$shapesCount=$xlWorksheet.Shapes.Countif($shapesCount-gt0){$targetRow=$xlWorksheet.Shapes($shapesCount).BottomRightCell.Offset(1).Row}$xlWorksheet.Cells($targetRow,$targetColumn).Select()$xlWorksheet.Paste()}})$form.ShowDialog()$xlWorksheet,$xlBook,$excel=$null,$null,$null

参考文献


Viewing all articles
Browse latest Browse all 9699

Trending Articles