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参考文献
- C#でClipboard監視(Windows API) - Qiita
- クリップボードを監視してテキストボックスに追加していく感じの。 · GitHub
- Monitor Clipboard changes in C# using AddClipboardFormatListener / WM_CLIPBOARDUPDATE. See Clipboard class: http://msdn.microsoft.com/en-us/library/system.windows.clipboard(v=vs.110).aspx · GitHub
- PowerShell で Excel をどうのこうのすることに興味を持ってくれると嬉しい - Qiita