コピーしたデータは基本的に直前のものしか使えません。コピーやカットをすると以前にクリップボードに保存されていたデータは消えてしまいます。このようなデータの履歴をとっておいて、また使いたいときに使えるようにしておくと便利かもしれません。そこでクリップボードの履歴をとるアプリを作ってみようと思います。

私が使っているのはCliborです。

クリップボード履歴や定型文の管理 履歴は最大10,000件 FIFO・migemo他 シンプルで高機能 Win10対応

だから別に自分でつくる必要はないのですが、あえて(四角い)車輪の再発明をすることにします。

テキストがコピーされたことを知るには?

まずテキストがコピーされたことを知るにはどうすればいいのでしょうか?

これが使えそうです。

クリップボードの内容の変化を知る方法

API関数のAddClipboardFormatListener関数とRemoveClipboardFormatListener関数。そしてWM_CLIPBOARDUPDATEメッセージを使えばクリップボードの内容が変更されたことがわかります。あとはクリップボードの内容がテキストであるかどうか調べて、テキストであれば必要な処理をおこないます。

これで履歴をとることはできます。

つぎに履歴からテキストを選択できるようにする必要があります。

フォームの左側にリストボックスを表示し、アイテムを選択したらリッチテキストボックスにテキストの内容を表示させています。そしてペーストボタンをクリックすればクリップボードにテキストがコピーされます。

ただちょっと不便です。テキストエディタを使っていてウィンドウを切り替えるというのは地味に面倒です。そこでショートカットキーを登録しておいて、これを押したらフォームが現れるようにすると少しは使いやすくなるかもしれません。

ホットキーを登録してみる

ホットキーを登録するためにはAPI関数のRegisterHotKeyを使います。また必要なくなったら削除する必要があります。このときに必要になるのが UnregisterHotKey関数です。

アプリケーションが開始されたら登録して終了時に解除するようにする。これでいいでしょう。

アプリケーション開始時に、自作メソッドのMyRegisterHotKeyでCtrlキーとAltキーを押しながらVキーを押したときにフォームが表示されるようにしています。WM_HOTKEYメーセージを捕捉したら登録したホットキーが押されたということなので、自作メソッド OnPressHotkeyを呼び出しています。

OnPressHotkeyメソッドがやっていることはフォームが見えるように最上位に表示させることです。

ペーストも自動でできるようにする

これでCtrlキー+Altキー+Vでフォームが前面に表示されるのですが、ボタンを押したらクリップボードに文字列がコピーされて、そのあとメニュー[ペースト]を選択したり、Ctrl+Vを押すなどの方法でペーストをするのでは、これも面倒くさいです。ボタンを押したら自動でペーストまでやってくれると便利です。

そこでペーストも自動でできるようにするにはどうすればいいのでしょうか? ホットキーが押されたときに編集されていたウィンドウがどれなのか記憶させることができればペーストも自動でできるようになりそうです。

OnPressHotkey()を少し変更します。

まずホットキーが押されたらフォームを最前面にもってくるまえに現在最前列にあるアプリのウィンドウハンドルを記憶しておきます。

そしてボタンが押されたら、まずテキストをクリップボードに転送したあと、保存しておいた_oldForegroundをAPI関数 SetForegroundWindow関数をつかってそのウィンドウをアクティブにします。それからペーストのためのキーボード操作をアクティブなウィンドウに送信します。

またこのときもクリップボードの内容が変化することになりますが、この履歴は必要ないと思います。そこで以下のような処理はどうでしょうか?

クリップボードが変化しても無視をするフラグとしてignoreClipbordChangeというフィールド変数を用意します。そして