クリップボードの履歴をとりペーストできるようにする

ではクリップボードの履歴から文字列をペーストすることができるようにしましたが、メニューをキーボードで選択することはできませんでした。マウスに持ち替えるのは面倒なのでキー操作で選択できるようにします。

それから履歴の上限はない、履歴をとるとらないの選択ができないので必要のないものまで履歴をとってしまったり、必要なものをすぐに選ぶことができないという問題もありました。

さらにパスワードらしきもの(文字列に全角文字や改行がない場合)は機械的に履歴にとらないようにしてきましたが、ソースコードも半角英数ばかりなので履歴を取ることができませんでした。パスワードらしきものがクリップボードに転送された場合はユーザーにどのように処理をするのか選択できるようにします。

キーフックをして他のアプリケーションでキーが押されたとき、もしコンテキストメニューが表示されているのであれば自作メソッド SelectMenuItemFromKeyCode(KeyEventArg e)を呼び出します。

自作メソッド SelectMenuItemFromKeyCode(KeyEventArg e)は以下のような内容になっています。

引数からどのキーが押されたかを調べて「1」ならコンテキストメニューの最初のアイテム、「2」なら2番目のアイテムが選択されたのと同じ処理をおこなわせます。

それからどのキーを押したらどんな文字列がペーストされるのかをコンテキストメニューに表示したほうが使いやすいと思われます。そこでShowMenu()メソッドを以下のように改良します。

またコンテキストメニューの項目を選択するために「1」とか「a」のキーが押されたら、その文字もエディタに入力されてしまいます。そこでこの場合は通常の処理はおこなわれないようにする必要があります。そのためにはフックプロシージャーのなかで CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam)を呼ばずにIntPtr(1)を返せばよいのです。

そこでKeyboardHookクラスとKeyEventArgクラスを少し変更します。

次に履歴をとるとらないの選択ができない問題を解消します。また履歴の最大件数も制御できるようにします。

次にパスワードらしきものがクリップボードに転送された場合、ユーザーにどのように処理をするのか選択させるための機能を追加します。