tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルクリップボードから貼り付けたときに発生するイベントにつきまして
記事No16704
投稿日: 2024/10/10(Thu) 09:49
投稿者アラ
お世話になります。

Windows10 Microsoft Visual Basic 6.0

クリップボードから貼り付けた時に発生するイベントの記載方法を教えて頂けますと幸いであります。

宜しくお願いいたします。

[ツリー表示へ]
タイトルRe: クリップボードから貼り付けたときに発生するイベントにつきまして
記事No16705
投稿日: 2024/10/10(Thu) 11:11
投稿者魔界の仮面弁士
> クリップボードから貼り付けた時に発生するイベントの記載方法を教えて頂けますと幸いであります。

何のために、そのイベントを使いたいかのにもよりますが:

たとえば、WebBrowser コントロールの <TEXTAREA> タグ内への貼り付けなら、
HTMLTextAreaElement の onbeforepaste イベント / onpaste イベントが発生しますので、
WithEvents 変数を通じて受け取れます。
とはいえ、今回は WebBrowser を使っているとも思えないので記載方法については省略。

標準コントロールの TextBox の場合、直接的なイベントはありません。
KeyPress イベントで Ctrl+V / Shift+Insert などを捉える手法などはありますが
https://hanatyan.sakura.ne.jp/vbhlp/txtpaste.htm
ほかにもコンテキストメニューや、スタイラスやマウスでのジェスチャー貼り付けなどもあるので
厳密にやる場合は、サブクラス化して WM_PASTE メッセージを捉える手法が用いられます。
http://rucio.a.la9.jp/main/technique/ShareEvent.htm

[ツリー表示へ]
タイトルRe^2: クリップボードから貼り付けたときに発生するイベントにつきまして
記事No16706
投稿日: 2024/10/10(Thu) 11:34
投稿者アラ
魔界の仮面弁士 様

ご返答を下さいまして、ありがとうございました。

ご教示くださいました、ご説明について調べて見ます。
少し時間がかかるかも知れませんが、ご報告させて頂きます。

宜しくお願い致します。

[ツリー表示へ]
タイトルRe^3: クリップボードから貼り付けたときに発生するイベントにつきまして
記事No16707
投稿日: 2024/10/10(Thu) 11:59
投稿者アラ
魔界の仮面弁士 様

使用目的について、ご説明します。

>何のために、そのイベントを使いたいかのにもよりますが
クリップボードから貼り付けた時に発生しましたら"BackColor/背景色"
を変更したいと思っています。例・・・Option1.BackColor = &HFFFFC0

ご教示くださいました、ご説明について調べて見ます。

[ツリー表示へ]
タイトルRe^4: クリップボードから貼り付けたときに発生するイベントにつきまして
記事No16708
投稿日: 2024/10/10(Thu) 13:36
投稿者アラ
魔界の仮面弁士 様

>標準コントロールの TextBox の場合、直接的なイベントはありません。
はい、分かりました。大変、参考になり決断がつきました。

以下は参考になりました。
>KeyPress イベントで Ctrl+V / Shift+Insert などを捉える手法などはあり
>ますがhttps://hanatyan.sakura.ne.jp/vbhlp/txtpaste.htmほかにも
>コンテキストメニューや、スタイラスやマウスでのジェスチャー貼り付けな
>どもあるので>厳密にやる場合は、サブクラス化して WM_PASTE メッセージを
>捉える手法が用いられます。
>http://rucio.a.la9.jp/main/technique/ShareEvent.htm

本当にありがとうございました。深く感謝申し上げます。

[ツリー表示へ]
タイトルRe^4: クリップボードから貼り付けたときに発生するイベントにつきまして
記事No16709
投稿日: 2024/10/10(Thu) 14:19
投稿者魔界の仮面弁士
>> 何のために、そのイベントを使いたいかのにもよりますが
> クリップボードから貼り付けた時に発生しましたら"BackColor/背景色"
> を変更したいと思っています。例・・・Option1.BackColor = &HFFFFC0

何のために、クリップボードからの貼り付け時に限定して視覚化したいのかが読み取れませんが、
とにかく『貼り付け前』ではなく、『貼り付け後』にイベントを受け取りたい、ということですね。
そして、クリップボード操作以外のデータ転送(SendKeys や Drag&Drop 等)については反応させる必要が無い、と。


では、それを「どこ」に貼り付けた時に反応させたいのか。
(貼り付ける相手が特定されているのか否か、ということです)

監視する相手先を特定できているとして、それが 自アプリのコントロール、たとえば
RichTextBox 上なのか、TextBox 上なのか、ComboBox 上のテキスト入力部なのか。
あるいは、自身の EXE 以外の特定のアプリ上のコントロールの話なのか、
それとも、相手を問わず任意のアプリケーション上での貼り付け動作を捉えたいのか…。

というのも、貼り付ける相手が自アプリ上のコントロールなのかどうかによって、
実装難易度が途端に変わってくるためです。


No.16705 にて紹介した WM_PASTE を捉える方法の場合、どのウィンドウ(VB6 的には「コントロール」に相当)を
監視するのかを、事前に定めておく必要があります。先のサンプルでは、対象コントロールの
ウィンドウハンドル(hWnd プロパティ)に対して通知されてくる WM_PASTE メッセージを
捉えるという方法が用いられています。これで事足りる場合は前回の回答で解決できそうですね。
https://learn.microsoft.com/ja-jp/windows/win32/dataxchg/wm-paste

一方、これが任意の相手となると、難易度が途端に跳ね上がってくるので、正直お奨めしません。
(未検証ですが…SetWindowsHookExW 案、RawInput 案、あるいはアクティブウィンドウを追跡するとか?)


あとは、クリップボード内の「何を」貼り付けたのかを検知する必要があるか否かも気になるところ。
クリップボードには複数形式のデータが同時に格納されていることがありますが、
特定の形式の貼り付けにしか反応したくない、とか。クリップボードの内容も検知したい場合、
SetClipboardViewer/ChangeClipboardChain API を使って、コピーされた時点で
その内容を検査しておくなどの手段があります。

[ツリー表示へ]
タイトルRe^5: クリップボードから貼り付けたときに発生するイベントにつきまして
記事No16710
投稿日: 2024/10/10(Thu) 17:47
投稿者アラ
魔界の仮面弁士 様

度重ね、ご返答をして下さいまして、ありがとうございます。

>何のために、クリップボードからの貼り付け時に限定して視覚化したいのかが読み取れませんが、
済みません。説明不足があり申し訳ありませんでした。
今後は、ご質問するときは目的等など気を付けて詳細に、ご説明する必要を感じました。
目的につきまして
ソフトは荷物伝票番号をコピーして荷物伝票番号の追跡をします。
>とにかく『貼り付け前』ではなく、『貼り付け後』にイベントを受け取りたい、ということですね。
はい、『貼り付け後』にイベントを受け取りたいということでした。
>そして、クリップボード操作以外のデータ転送(SendKeys や Drag&Drop 等)については反応させる必要が無い、と。
>では、それを「どこ」に貼り付けた時に反応させたいのか。
>(貼り付ける相手が特定されているのか否か、ということです)

訂正:
自身の EXE 以外でテキストファイル、エクセル、ワード等のコピーしたい数値を範囲選択→右クリック(メニュー)→コピーを選択しますと
自アプリのForm1上のText1 TextBoxに範囲選択した数値を表示しています。Form1上のText1 TextBoxの下にOption1〜3 OptionButtonがあります。
ソフトは自分が主に使用する運送会社(3社)の荷物伝票番号をコピーしますとText1 TextBoxに荷物伝票番号が表示されます。
荷物伝票番号が表示された時にOptionButtonのBackColorを変更したいと思っていました。そして
Option1〜3(3社) OptionButtonを選択すると選択運送会社(3社)の荷物伝票番号の追跡をします。実際に使用しています。

お詫び:
ソフトは一年前以上に作成したものです。コピーを貼り付けと思い込んでいました。
ご指摘等によソフトを見直しましたら荷物伝票番号の適応の桁数、数値等を確認して表示していました。
この度は、大変ご迷惑をおかけしました。誠に申し訳ございませんでした。

今後、以下情報は貴重なものとなりました。
>No.16705 にて紹介した WM_PASTE を捉える方法の場合、どのウィンドウ(VB6 的には「コントロール」に相当)を
>監視するのかを、事前に定めておく必要があります。先のサンプルでは、対象コントロールの
>ウィンドウハンドル(hWnd プロパティ)に対して通知されてくる WM_PASTE メッセージを
>捉えるという方法が用いられています。これで事足りる場合は前回の回答で解決できそうですね。
>hhttps://learn.microsoft.com/ja-jp/windows/win32/dataxchg/wm-paste

質問説明、説明不足等に不慣れな所がありましたので大変申し訳ありませんでした。

[ツリー表示へ]
タイトルRe^6: クリップボードから貼り付けたときに発生するイベントにつきまして
記事No16711
投稿日: 2024/10/10(Thu) 19:57
投稿者魔界の仮面弁士
> ソフトは一年前以上に作成したものです。コピーを貼り付けと思い込んでいました。

貼り付けの監視だと面倒ですが、コピーの監視が目的なら、
先に回答したクリップボードチェインという仕組みを使えば良いですね。
WM_DRAWCLIPBOARD メッセージ(&H308&)と WM_CHANGECBCHAIN(&H30D&) を処理すれば OK 。

https://hp.vector.co.jp/authors/VA020830/note/clip.html
https://www.vbforums.com/showthread.php?899759-VB6-Monitoring-Manipulating-clipboard-example-clipboard-viewer
https://hatakanajp.livedoor.blog/archives/4129189.html


Vista 以降なら、AddClipboardFormatListener/RemoveClipboardFormatListener  API で
WM_CLIPBOARDUPDATE メッセージ(&H31D&) を捉える形でもいけそう。
https://chikaratakanashi.blogspot.com/2018/05/blog-post_15.html


リアルタイム性がそこまで厳密でなくても良いのなら、Timer 監視して
定期的に Clipboard オブジェクトの GetFormat / GetData メソッドを呼び出す手もあります。
(クリップボードは OS 全体で排他的に利用されるものなので、On Error Resume Next を忘れずに)


> Text1 TextBoxに荷物伝票番号が表示されます。

コピー時判定や貼り付け時判定ではなく、「TextBox に入力された時」という前提なら、
クリップボード以外から入力された場合(バーコードスキャナ、キーボード入力など)も含めた方が良いので
Change イベントあたりで入力された内容を見れば良いはず。

入力済みのテキストの一部の文字だけを選択した状態で貼り付けられた場合のことを考えたら、
クリップボードの中身がどうだったかというより、Text1 に何と入力されたか、の方が大事だと思うので。

[ツリー表示へ]
タイトルRe^7: クリップボードから貼り付けたときに発生するイベントにつきまして
記事No16712
投稿日: 2024/10/10(Thu) 21:39
投稿者アラ
魔界の仮面弁士 様

度重ね、ご返答をして下さいまして、本当にありがとうございました。

>先に回答したクリップボードチェインという仕組みを使えば良いですね。
>WM_DRAWCLIPBOARD メッセージ(&H308&)と WM_CHANGECBCHAIN(&H30D&) を処理すれば OK 。
はい、分かりました。

>hhttps://hp.vector.co.jp/authors/VA020830/note/clip.html
>hhttps://www.vbforums.com/showthread.php?899759-VB6-Monitoring-Manipulating-clipboard-example-clipboard-viewer
>hhttps://hatakanajp.livedoor.blog/archives/4129189.html

>Vista 以降なら、AddClipboardFormatListener/RemoveClipboardFormatListener  API で
>WM_CLIPBOARDUPDATE メッセージ(&H31D&) を捉える形でもいけそう。
>hhttps://chikaratakanashi.blogspot.com/2018/05/blog-post_15.html

>リアルタイム性がそこまで厳密でなくても良いのなら、Timer 監視して
>定期的に Clipboard オブジェクトの GetFormat / GetData メソッドを呼び出す手もあります。
>(クリップボードは OS 全体で排他的に利用されるものなので、On Error Resume Next を忘れずに)
はい、分かりました。ありがとうございます。

>コピー時判定や貼り付け時判定ではなく、「TextBox に入力された時」という前提なら、
>クリップボード以外から入力された場合(バーコードスキャナ、キーボード入力など)も含めた方が良いので
>Change イベントあたりで入力された内容を見れば良いはず。
Change イベントはコピー時判定や貼り付け時判定でないのでシンプルになるのではないかと感じました。

>入力済みのテキストの一部の文字だけを選択した状態で貼り付けられた場合のことを考えたら、
>クリップボードの中身がどうだったかというより、Text1 に何と入力されたか、の方が大事だと思うので。
はい、分かりました。ありがとうございます。

ご指導下さいまして何をすれば良いのか色々な方法を知りました。
時間がかかると思いますが明日から上記を理解出来るように勉強します。
詳細な、ご説明、ご指導下さいまして心より深く感謝申し上げます。

[ツリー表示へ]