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

C#を使った必要十分なクリップボードの監視

$
0
0

目的

業務上、特定の場所のテキストを一定の法則で置き換えて更新する作業が発生した。
本来ならpyautoguiなどを使って自動化できないか考えるところだったが、
派遣開始してからの日が浅く、納期も短いために時間のかかることはできない。

そのため、次善の策としてC#でクリップボードを監視・置き換えするアプリを作成した。

方法

インターネットで検索をかけると、このようなクリップボードの監視方法があるらしい。
ただ、僕は今の会社に無限にいるわけでもないので、もう少しシンプルな方法で実装しておいて、他人がメンテナンスできるようにしておいたほうが良いと思った。

なので今回はシンプルにSystem.Windows.Forms.Clipboardクラスを使ってフォームアプリケーションとして作ることにした。

なお、Clipboardクラス自体は.Net Framework1.1から対応しているようなので、
今使用可能なWindowsならバージョン依存はなく動くはずである。

UI

下の画像のようなUIを準備した。

クリップボード.png

数字の書かれているラベルはcountLabel、監視中と書かれているボタンは見た目をボタンにしたcheckEnablerという名前のチェックボックス、
変換後のテキストボックスはlastText、変換前のテキストボックスはnextTextと名付けた。
また、timer1という名前のタイマも適当な間隔を指定してある。

コード

特に難しいことは考えず、一定周期でクリップボードにテキストデータが入っているかを確認し、
テキストデータが最後に取得したテキストデータと異なっているのであれば一定の条件で処理を行っている。

数百回レベルの作業が予想されていたため、確認処理を行うたびにラベルのテキストと色を反転させて、
処理が行われているかどうかをわかりやすくした。
業務アプリだったら変換前・後のテキストをどこかに保存しておくのも有効だと思う。

usingSystem;usingSystem.Drawing;usingSystem.Windows.Forms;namespaceClipboardCheckApp{publicpartialclassForm1:Form{privateintcheckCount;publicintclipboardCounter{get{returncheckCount;}privateset{checkCount=value;// 視認性の向上。クリップボードの操作を行うたびに背景とテキストの色が反転する。if((checkCount&1)==0){countLabel.BackColor=SystemColors.ControlText;countLabel.ForeColor=SystemColors.Window;}else{countLabel.ForeColor=SystemColors.ControlText;countLabel.BackColor=SystemColors.Window;}countLabel.Text=checkCount.ToString();}}publicForm1(){InitializeComponent();if(Clipboard.ContainsText()){lastClipboard=Clipboard.GetText();}}privatevoidcheckEnabler_CheckedChanged(objectsender,EventArgse){if(checkEnabler.Checked){checkEnabler.Text="監視中";}else{checkEnabler.Text="監視停止中";}timer1.Enabled=checkEnabler.Checked;}privatestringlastClipboard{get{returnlastText.Text;}set{lastText.Text=value;}}privatestringnextClipBoard;privatevoidtimer1_Tick(objectsender,EventArgse){// 適当な感覚でクリップボードを監視する。if(Clipboard.ContainsText()){nextClipBoard=Clipboard.GetText();if(lastClipboard!=nextClipBoard){// クリップボードに対して何らかの処理を行う場所。nextText.Text=nextClipBoard;lastClipboard=nextClipBoard.Replace("ham","egg");Clipboard.SetText(lastClipboard);clipboardCounter++;}}}}}

とりあえず自分で動かしてみた限りでは問題なく動いた。


Viewing all articles
Browse latest Browse all 9699

Trending Articles