貼り付けを監視するには?

解決


よっさん  2007-04-09 11:45:42  No: 25687

クリップボードの内容を監視して履歴を取るソフトは
よくありますが、貼り付けを監視することは出来ないでしょうか?
やりたい内容は、コピーした内容の末尾にある数字を貼り付けをする度に
+1して、クリップボードに入れる処理です。

WM_PASTEをフックで監視して処理をしてみましたが、
Ctrl + V で貼り付けるとWM_PASTEが引っかかりませんでした。
クリップボードの内容を取得したことを監視できる方法などが
あればと思い書き込みました。

よろしくお願いします。


がきさん  2007-04-10 06:40:02  No: 25688

CTRL+V の監視

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
  case Msg.Message of
    WM_CHAR:
      begin
        if (GetKeyState(VK_CONTROL) < 0) then begin
          case Msg.wParam of
             1: // [CTRL+A]
             3: // [CTRL+C]  コピー
             22: // [CTRL+V]  貼り付け
            24: // [CTRL+X]
            26: // [CTRL+Z]
          end;
        end;
      end;
    .....
  end;
end;


よっさん  2007-04-10 11:29:49  No: 25689

がきさんありがとうございます。
Ctrl + Vの監視が無難でしょうかね。

SetClipboardViewerでクリップボードの変更(コピー)が
監視できるので、逆に貼り付けが監視できるAPIとかがないのかなあ
と思っていました。

今日、MSDNライブラリを見ていたら、「WM_RENDERFORMAT」という
メッセージを発見し、クリップボードの遅延レンダリングを知りました。
これが利用できそうな気がするので、うまくいったら報告をします。


うんと  2007-04-10 14:31:51  No: 25690

遅延レンダリングは大きな画像とかのデータの大きいのとか、多くのフォーマットに対応するときとか、で必ずしも利用されない。paste の監視はできないと思うよ。


よっさん  2007-04-12 08:29:22  No: 25691

うんとさんレスどうもありがとうございます。
遅延レンダリングを利用というのは、

1.クリップボードにコピーするのを監視
2.コピーされたら、一旦自分のアプリに取り込んで遅延レンダリング状態にする。
3.WM_RENDERFORMATメッセージが来たらクリップボードに取り込んだ内容を戻す

という手順で出来ないかと思ったのです。
投稿した後に時間があまり取れなくて実験が出来ていないのでまだ想像ですが・・・
上がうまくいくようなら、残りの問題は手順3の後にもう一度遅延レンダリングの状態にする方法ですね・・・

実験したら報告します。


うんと  2007-04-12 12:25:00  No: 25692

おお、一般論ではでなくて自作アプリで必ず遅延レンダリングを使う場合なら
できそうですね。是非結果を教えてくださいね。


よっさん  2007-05-10 08:56:28  No: 25693

結果報告に一月近くかかってしまい申し訳ありません。
WM_RENDERFORMATを利用した貼り付けの監視ですが参考になるページがありました。
http://hp.vector.co.jp/authors/VA003525/tips21.htm

この方法で貼り付けを監視しつつクリップボードの変更も
監視をしたプログラムを作ってみたのですが、
他のクリップボードのツールなどを動作させると場合に無限ループの
ような状態に陥ることが判明しました。

例えば、WM_RENDERFORMATを待つソフトをAとして、
他のクリップボードのツールをBとすると、

1.クリップボードに変更があったことをソフトAが感知
2.ソフトAがクリップボードの中身を取得し
    遅延レンダリング状態にする。
3.ソフトBがクリップボードの変更を感知し、
    クリップボードの中身を取得する。
4.ソフトAにWM_RENDERFORMATメッセージが届きクリップボードに
    値を書き込み、少し待機(貼り付けの完了待ち)した後、
    遅延レンダリング状態にする。
    (このときクリップボードが変更されたことになる)
5.ソフトBがクリップボードの変更を感知し、
    クリップボードの中身を取得する。
あとは4と5を繰り返すので無限ループのような状態に陥ってしまう。

クリップボードのチェーンでソフトBに変更を渡さない方法などを
考えたのですが、そのようなことをするソフトは非常にお行儀が悪い
ので、遅延レンダリングによる貼り付け監視は出来ないという結論に
なりました。

RegisterHotKeyなどを利用して貼り付け用ホットキーを作り、
このホットキーで貼り付けた場合に限り末尾の数字を書き換える処理を
実行する方法が一番現実的だと思いました。

長文すみません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加