-1

ウィンドウ内のツリービュー項目を別のプロセスで列挙できます。ツリービュー内のノードでプログラムによってドラッグ アンド ドロップ操作を開始し、項目を自分が制御するウィンドウにドラッグできるようにしたいと考えています。DataObject最終的には、各ツリービュー項目にアクセスしたいだけです。

PostMessageまたはその他の方法を使用して、ドラッグ アンド ドロップ シーケンスを開始および完了することは可能ですか? マウスの所有権を取得せずに (つまり、ユーザーのマウス位置を中断せずに) 実行できますか?

ツリービュー アイテムが折りたたまれたツリービュー フォルダーにある場合でも (フォルダーを展開せずに) 、同じタスクを完了することは可能ですか?

4

1 に答える 1

1

IDataObjectTreeView 自体にはありません。

ユーザーが TreeView ノードをドラッグしようとしたことを検出するのは、TreeView を所有するアプリケーションの役割です (TreeView は を介し​​てアプリケーションに通知しますTNV_BEGINDRAG)。その時点で、アプリは適切なノードを作成し、IDataObjectそれを関数に渡してDoDragDrop()OLE を開始できます。プロセス境界を越えてデータを渡すことができるドラッグ操作。

IDataObjectツリー ノードの を取得したり、ドラッグ操作を直接開始したりするために TreeView (またはアプリ) に送信できるウィンドウ メッセージはありません。あなたの側でできる唯一のことは、次のいずれかです。

  1. TreeView 自体に対するマウス入力をシミュレートするため、ユーザーがノードを正常にドラッグしていると見なされます。

  2. TVN_BEGINDRAG手動でシミュレートします。これには、VirtualAllocEx()およびを使用して、TreeView の所有プロセスのメモリ アドレス空間内にWriteProcessMemory()適切な構造体を割り当てて入力し、TreeView の親ウィンドウに送信して、その構造体を指すようにする必要があります。つまり、最初にとのようなものを使用して、アプリに報告する必要がある情報(特に、ツリー ノードのハンドルと値) を取得します。NMTREEVIEWTVN_BEGINDRAGNMTREEVIEWTVM_HITTESTTVM_GETITEMTVN_BEGINDRAGHTREEITEMLPARAM

これにより、所有しているアプリは、ユーザーがツリー ノードをドラッグしてそれに応じて行動しようとしていると思い込ませることができます。ただし、実際の OLE ドラッグ操作を開始する動作がまだ行われているため、ユーザーはアプリ ウィンドウ上にマウスを移動し、マウス ボタンを離す必要があります (または、プログラミングを行うためにマウス入力をシミュレートする必要があります)。そのため、IDataObject通常はウィンドウにドロップされます。

于 2017-01-06T00:09:40.487 に答える