tool)があるので、作業証跡の取得には困らないが、それの整理となると少し面倒ではないだろうか。hhMMss」となっている。数が少ないうちはこれでも良いが、ファイル数が増えるとどのファイルがどの作業項番にあたるものなのか、後から追うのはちょっと面倒だ。(少なくとも私は)Excelの適当なシートに次々と貼り付けていくのも手だが、Excelだとサムネイル表示等がないので、それこそキャプチャ画面が多くなるとどの画面がどこにあるのか、遡るのが大変になる。ファイル名で検索もできないので、貼り付けるたびに別のセルに取得日時や作業項番を手動で控えておかないといけない。そこで、スクリーンショットを取るたびに自動でPowerPointの新規スライドにスクショ画像とスクショ取得日時、必要に応じてカスタムテキストを貼り付けられるスクリプトを作成した。PowerPointならば、1つのファイル(.ppt/.pptx)にまとめつつサムネイル表示が可能であり、かつ取得した画像の修正も容易であり、後から画像を別ファイルへ流用することも容易だ。搭載機能スクリーンショットの取得が行われるたびに、予め開いているPowerPointの末尾に新規スライドを追加し、スクショ画像とスクショ取得日時、指定があればカスタムテキストを貼り付ける。イメージ貼り付け先となるPowerPointファイルは、指定することと新規作成すること双方に対応する。カスタムテキストは作業項番や作業メモとして利用することを想定している。そのため、毎回カスタムテキストの指定をさせるのではなく、カスタムテキストを入力したい時だけカスタムテキストの入力フォームを開くようにしている。カスタムテキストの入力を求められない場合は、スクショ画像とスクショ取得日時のみをPowerPointのスライドに貼り付ける。コード絶対改善余地があるけどこんな感じ。今回、機能としてはシンプルだがGUIを多様している都合上かなり長文となっている。Powerpointを起動する。CustomTextフォームを表示する。実行イメージさすがに長過ぎるので、少しコードを解説する。COMオブジェクト格納配列、PowerPoint操作用配列、PowerPoint定数コードで以下に該当する箇所について解説する。Model)オブジェクトとして利用(操作)する。COM[0]~COM[9]を予め定義しているが、これは後続のPowerPoint操作用配列「ppApp、ppPress、ppPres、ppPres、ppSlds、ppSld、ppShps、ppPic、ppTitle、ppTxtFrm、ppTxtRng」に対応する形となる。PowerPoint定数のところでは変数ppLayoutTitleOnlyの値を11としているが、これは以下サイトで定められているとおり「タイトルのみ」のスライドスタイルのことを表している。トピックlearn.microsoft.comC言語でClipboardの更新ごとに処理を行うクラスの定義コードで以下に該当する箇所について解説する。System.Windows.Formsこれはスクリーンショットの取得を検知するために、C#言語を利用してClipboard監視を行うクラス「ClipboardListeningForm」を定義している。これにより、スクリーンショットの取得(=クリップボードが更新される)のイベント駆動が出来るようになっている。細かい項目一つ一つの意味は参考文献等を確認されたし。FilePathフォーム要素、CustomTextフォーム要素、OnOffフォーム要素それぞれ以下のシーンで利用するWindowsFormsである。FilePathフォームスクリプトを立ち上げた際に、スクリーンショットを追記するPowerPointファイルをユーザーに指定/入力してもらうためのフォームである。フルパスを入力してもよいし、参照ボタンから対象ファイルを指定してもよい。空欄のままOKボタンを押してもよい。(その場合は新規PowerPointファイルを立ち上げる)コードに関して、特にこのフォームでは難しい記述はないので解説は省略する。OnOffフォーム順番が前後するが先にこちらを解説する。これはFilePathフォームでOKをクリックしたあとに立ち上がる画面である。本フォームを立ち上げた際に、FilePathフォームで指定したPowerPointファイルまたは新規PowerPointファイルを開く。このままの状態ではスクショを撮ってもPowerPointへの貼り付けは行われず、「Start」ボタンを押下して状態が「実行中」となっている間に実行したスクショのみPowerPointへの貼り付けが行われる。「スクリーンショット取得時、日時情報に任意のテキストを付与する(作業項番等)」のチェックボックスをチェックすることで、PowerPointに貼り付けるカスタムテキストを入力するフォームがスクショをする度に立ち上がるようになる。コードに関して、特にこのフォームでは難しい記述はないので解説は省略する。CustomTextフォームOnOffフォームでチェックボックスにチェックが入っていた場合、スクショを撮る度に表示されるカスタムテキストを入力するためのフォームである。22:43:48_test」のように、ユーザーカスタムのテキストを追記させることができる。作業項番や作業時の事象などをタグ付け代わりにメモすることで、遡ってのエビデンス確認が容易になる、と考えている。実際にPowerPointにスクショ画像、日時、カスタムテキストが貼り付けられているCustomTextフォームのコードでは、2点ほど分かりづらい動きがあるので解説する。サブフォーム(CustomTextフォーム)のクロージングイベントCustomTextフォームは、ShowDialog()ではなく、Show()で起動/表示している。これはなぜかと言うと、CustomTextフォームが開かれるタイミングでは、OnOffフォームがShowDialog()を利用しており、モーダルなShowDialog()はCustomTextフォームで並行利用が出来ないためである。ここで一点問題が起きる。Show()でCustomTextフォームを開き、カスタムテキストを入力したあと、OKボタンやキャンセルボタンを押してもShowDialog()ではないので、.DialogResultプロパティの更新が出来ず、CustomTextフォームが閉じれなくなってしまう(ボタンを押しても無反応になってしまう)。そこで、OKボタンやキャンセルボタンを押された時に明示的にCustomTextフォームを閉じるため$CustomTextForm.Close()を実行するのだが、ここで破棄してしまうと2回目以降のスクショで$CustomTextForm.Show()の再利用ができなくなり、カスタムテキストの入力ができなくなってしまう。これを解決するためには、CustomTextフォームを閉じるため$CustomTextForm.Close()を実行するが、実際は非表示にするだけでCustomTextフォームは終了させない、という処理が必要になる。この疑似クロージングを定義しているのが、以下のコードである。$OnOffFormCustomTextフォームは、OnOffフォームが実行されている最中に呼び出されるフォームである。そのため、OnOffフォームが閉じられてしまう(=スクリプトの終了処理が走る)ときに、CustomTextフォームを閉じていないと、CustomTextフォームの処理結果の行き先がなくなってしまい、スクリプトがフリーズ状態になってしまう。これを解決するためには、OnOffフォームが閉じられた場合に、CustomTextフォームも追随して閉じるようにしてやる必要がある。.Ownerを使用することでフォーム間で親子関係を作ることができる。$OnOffFormと指定することでOnOffフォームが閉じられた場合に、CustomTextフォームも追随して閉じる動作を実現する。本スクリプトは長さの割にやっていること(処理)そのものはそれほど難解ではないと思うが、処理5の部分だけ前述したShowDialog()とShow()の制限などで複雑になっているので解説する。処理5はスクリーンショットを取得するためStartボタンが押されている+スクリーンショットが実行された場合に分岐する処理である。以下のコードで判定している。[System.Windows.Forms.Clipboard]::ContainsImage())次に、現在のスライド枚数を参照して、末尾にスクリーンショットとスクショ取得日時を挿入する処理を行う。これは、事前に定義していたCOMオブジェクトで現在のスライド枚数を参照し、+1したスライドを新規作成したのち、ペーストの実行とスライドタイトルへのテキスト挿入で実現している。OnOffフォームのチェックボックス($CheckBoxOnOff)にチェックが入っている場合、日時に付与するテキストを入力させるCustomTextフォームの項で触れたが、OnOffフォームのチェックボックス($CheckBoxOnOff)にチェックが入っている場合にCustomTextフォームを表示する。カスタムテキスト指定時に前回入力情報を残さないよう、$TextBoxCustomText.textをnullする。カスタムテキストが空白の場合は何もせず後続処理へ続ける。OKボタンの処理がすべて完了したのち、$CustomTextForm.Close()でCustomTextフォームを閉じる(実際は、非表示状態にする)キャンセルボタンが押された場合も、同様に$CustomTextForm.Close()でCustomTextフォームを閉じる。CustomTextフォームを表示する。})注意点と補足PowerShellが実行可能な環境である必要があります。PowerPointが実行可能な環境である必要があります。tool等)が実行可能な環境である必要があります。(screenpressoなんかでも動作します)OnOffフォームでStartボタンを押下している状態で、PowerPointを閉じてしまうと、次にスクリーンショットを撮った際にエラーが発生します。改善(改案)点コードが長すぎるので、もう少しコンパクトにまとめたい。PowerPoint操作用配列の部分を列挙型に変えることも考えたが、拡張性を考慮するようなスクリプトでもないので、効果は薄い気がする。PowerPointへの画像貼り付けについて、ど真ん中に貼り付ける仕様なので少し見辛いと感じることがある。一応位置指定やスライドのサイズに合わせて画像を縮小させることも出来そうだが、使用者によってはかえって使いづらく感じる要素でもあり、一旦シンプルな形としている。コピーhamutetuをフォローするhamutetuはむてつの仕事場-IT業務改善を求めて関連記事powershell【Powershell】ファイルダイアログやフォルダダイアログを利用する方法まとめダイアログを使えればUXは向上する!・・・かも。うちの社内SNSにも、たまーにpowershellスクリプトを上げている人がいるけど、みんなコードに直接変数を入力する方式で上げている。仕事でWindowsイベントログをCSVに保存しようとしたら何故か350レコードぐらいしか出力されない、というバグに遭遇したので作成。家のPCなら普通に全量出力できた。訳あってドメイン参加している複数のWindowsサーバ上のローカルユーザーを一部削除する必要があったので、Powershellを利用して一括削除できるようにした。現代のビジネス環境では、AIを活用した効率的なデータ分析とコスト管理が成功の鍵である。世界的なテレワーク化が進んだことで「通勤時間は減ったけど会議が増えた・・・」というのは意外とメジャーな悩みの様子。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。ΔホームpowershellPowerPoint操作hamutetuはむてつと申します。某大企業でIT技術者として業務改善に勤しんでいます。仮想基盤の構築運用、監視/ID管理/監査/ジョブ管理/バックアップ・リストア/ファイルサーバ/メール基盤等々の企画設計開発運用なんかをやっています。外注業務の内製化/自動化/省力化を行い、年間500万円のコスト削減だったり、6時間かかっていた業務を20分で済むようにするなどしてきました。コピペで使えるプログラム(Powershellとか)を公開しています。はむてつの仕事場-IT業務改善を求めて.プライバシーポリシーお問い合わせサイトマップタイトルとURLをコピーしました。