C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 別プログラムへドラッグ&ドロップ経由でのファイル送信方法


(過去ログ 119 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■69699 / inTopicNo.1)  別プログラムへドラッグ&ドロップ経由でのファイル送信方法
  
□投稿者/ azutake (1回)-(2014/01/21(Tue) 21:49:05)

分類:[C#] 

現在,C#にて特定のプログラムに仮想にてファイルをドラッグ&ドロップする処理を作成しています.
ですが,いくら検索をかけてもドラッグ&ドロップを受け付けるコードはヒットするのに対し,ドラッグ&ドロップをするコードがヒットしません.
そのためこの掲示板へ投稿したのですが,この場合どのようなコードを書けば良いのか,ご教授願えませんでしょうか.
引用返信 編集キー/
■69700 / inTopicNo.2)  Re[1]: 別プログラムへドラッグ&ドロップ経由でのファイル送信方法
□投稿者/ Azulean (262回)-(2014/01/21(Tue) 22:56:19)
仮想的にと言うことは、ユーザーにドラッグ&ドロップ操作をさせずに、ドラッグ&ドロップしたかのように振る舞うと言うことでしょうか。
そうなると、非常に難しいか、実現できない可能性が考えられます。

単純にドラッグ開始だけであれば、IDataObject に適切なデータを詰めた上で DoDragDrop でドラッグ開始すればよいだけです。
しかし、その後の動きは通常、Windows にお任せになります。カーソル位置のウィンドウの特定、そのウィンドウに紐付けられた IDropTarget の取得、IDropTarget への情報の受け渡し、カーソルの変更、ドロップ時のデータの引き渡しは Windows が担当し、この部分を一般のプログラマーが書くことは、ほぼありません。

海外で同種の質問が過去にありましたが、解決策が寄せられていないのが実情です。
http://stackoverflow.com/questions/915272/win-api-to-emulate-drag-of-a-file-onto-a-window
引用返信 編集キー/
■69701 / inTopicNo.3)  Re[2]: 別プログラムへドラッグ&ドロップ経由でのファイル送信方法
□投稿者/ azutake (2回)-(2014/01/22(Wed) 00:33:06)
No69700 (Azulean さん) に返信
> 仮想的にと言うことは、ユーザーにドラッグ&ドロップ操作をさせずに、ドラッグ&ドロップしたかのように振る舞うと言うことでしょうか。
> そうなると、非常に難しいか、実現できない可能性が考えられます。
>
> 単純にドラッグ開始だけであれば、IDataObject に適切なデータを詰めた上で DoDragDrop でドラッグ開始すればよいだけです。
> しかし、その後の動きは通常、Windows にお任せになります。カーソル位置のウィンドウの特定、そのウィンドウに紐付けられた IDropTarget の取得、IDropTarget への情報の受け渡し、カーソルの変更、ドロップ時のデータの引き渡しは Windows が担当し、この部分を一般のプログラマーが書くことは、ほぼありません。
>
> 海外で同種の質問が過去にありましたが、解決策が寄せられていないのが実情です。
> http://stackoverflow.com/questions/915272/win-api-to-emulate-drag-of-a-file-onto-a-window

なるほど,その方法で一度試しにやってみます.
海外フォーラムの検索等ありがとうございます.
引用返信 編集キー/
■69702 / inTopicNo.4)  Re[1]: 別プログラムへドラッグ&ドロップ経由でのファイル送信方法
□投稿者/ 魔界の仮面弁士 (505回)-(2014/01/22(Wed) 09:48:34)
2014/01/22(Wed) 10:11:51 編集(投稿者)

No69699 (azutake さん) に返信
> 特定のプログラムに仮想にてファイルをドラッグ&ドロップする処理を作成しています.
過去ログ No15616 とか No15727 などのスレッドとか。

直接の C# コード回答では無いですし、可能かどうかは分かりませんが、
上記ログによれば、GetProp(hwnd, "OleDropTargetInterface") で IDropTarget を取得し、
そこから IDropTarget.Drop メソッドを呼び出す手法が書かれていますね。

ドロップ先のアプリ実装によっては、その前に DragEnter や DragOver を
呼び出す事が求められるかも知れませんが、いずれにせよ、ウィンドウ内の
どの場所にドロップするのか、座標情報も渡しておく必要があるでしょう。
まぁ、座標情報やボタン情報(マウス左右、Shift、Ctrl等)を無視する実装も多いですが。


> この場合どのようなコードを書けば良いのか

System.Runtime.InteropServices.ComTypes.IDataObject data;
Clipboard.Clear();
Clipboard.SetFileDropList(ファイルリスト);
OleGetClipboard(out data);

// IDropTarget IID … {00000122-0000-0000-C000-000000000046}
IDropTarget target = GetProp(hwnd, "OleDropTargetInterface");

DragDropEffects dwEffect = DragDropEffects.Copy | DragDropEffects.Link;
target.Drop(data, MK_LBUTTON, pt, ref dwEffect);


後半部、IDropTarget の取得については一切試していませんが、
イメージコードということで…。


前半部については、png ファイルを Clipboard.SetFileDropList した結果を
OleGetClipboard で受け取り、それを SHDoDragDrop したところ
ペイントや Visual Studio へのドラッグ&ドロップ処理が行われると
いう点までは確認しました。
引用返信 編集キー/
■69704 / inTopicNo.5)  Re[2]: 別プログラムへドラッグ&ドロップ経由でのファイル送信方法
□投稿者/ azutake (3回)-(2014/01/22(Wed) 13:06:21)
No69702 (魔界の仮面弁士 さん) に返信
> 2014/01/22(Wed) 10:11:51 編集(投稿者)
>
> ■No69699 (azutake さん) に返信
>>特定のプログラムに仮想にてファイルをドラッグ&ドロップする処理を作成しています.
> 過去ログ No15616 とか No15727 などのスレッドとか。
>
> 直接の C# コード回答では無いですし、可能かどうかは分かりませんが、
> 上記ログによれば、GetProp(hwnd, "OleDropTargetInterface") で IDropTarget を取得し、
> そこから IDropTarget.Drop メソッドを呼び出す手法が書かれていますね。
>
> ドロップ先のアプリ実装によっては、その前に DragEnter や DragOver を
> 呼び出す事が求められるかも知れませんが、いずれにせよ、ウィンドウ内の
> どの場所にドロップするのか、座標情報も渡しておく必要があるでしょう。
> まぁ、座標情報やボタン情報(マウス左右、Shift、Ctrl等)を無視する実装も多いですが。
>
>
>>この場合どのようなコードを書けば良いのか
>
> System.Runtime.InteropServices.ComTypes.IDataObject data;
> Clipboard.Clear();
> Clipboard.SetFileDropList(ファイルリスト);
> OleGetClipboard(out data);
>
> // IDropTarget IID … {00000122-0000-0000-C000-000000000046}
> IDropTarget target = GetProp(hwnd, "OleDropTargetInterface");
>
> DragDropEffects dwEffect = DragDropEffects.Copy | DragDropEffects.Link;
> target.Drop(data, MK_LBUTTON, pt, ref dwEffect);
>
>
> 後半部、IDropTarget の取得については一切試していませんが、
> イメージコードということで…。
>
>
> 前半部については、png ファイルを Clipboard.SetFileDropList した結果を
> OleGetClipboard で受け取り、それを SHDoDragDrop したところ
> ペイントや Visual Studio へのドラッグ&ドロップ処理が行われると
> いう点までは確認しました。

ご丁寧にコードの提示,検証等ありがとうございます.

現在外出先のためコードの確認が取れないので,帰宅後コード確認,解決後解決済み化しようと思います.
また,Clipboardの使用は必須となりますでしょうか.
何故必要か問うのかと言うと現在作成しているものはあるツールへ文字列を転送しようとしています.
また,SendKeysでのキー送信は出来ませんでした.
そこでClipBoardにて送信を行い,成功したのですが今度はクリップボードを独占してしまう問題が発生したためドラッグ&ドロップにて出来ないか,と考えに至りました.
後付となり申し訳ありません.
引用返信 編集キー/
■69705 / inTopicNo.6)  Re[3]: 別プログラムへドラッグ&ドロップ経由でのファイル送信方法
□投稿者/ 魔界の仮面弁士 (506回)-(2014/01/22(Wed) 13:51:21)
2014/01/22(Wed) 14:00:39 編集(投稿者)

No69704 (azutake さん) に返信
> また,Clipboardの使用は必須となりますでしょうか.

OLEドラッグ&ドロップ、クリップボード、OLE埋め込みなどにおいては、
プロセス間のデータ交換に、いずれも IDataObject が用いられています。
そのため実験時には、てっとり早く Clipboard を流用しています。

Clipboard を使わずとも、IDataObject の実装さえ用意できれば OK かと思います。

たとえば、先に紹介した過去ログにもある IShellFolder.GetUIObjectOf を使う方法があります。
これなら、物理パスを持たないアイテム(コントロールパネル内のアイコンとか)さえも処理できます。
ドロップ先のアプリがそれを受け取るかどうかは別として。

 Windows SDK - IShellFolder::GetUIObjectOf method
 http://msdn.microsoft.com/en-us/library/windows/desktop/bb775073.aspx

関連情報として:
 Knowledge Base 183860 (Q183860) - How To Support Dropping of Items on Your Namespace Root
 http://support.microsoft.com/kb/183860/en-us


あるいは、System.Runtime.InteropServices.ComTypes.IDataObject インターフェースを
実装するクラスを作成し、ドラッグ&ドロップの機能を実装することもできます。
出来合いの実装を利用する方法に比べると、手間はかかりますが、
下記にサンプルがあるので参考までに。

 MSDN Blogs - Creating something from nothing [Developer-friendly virtual file implementation for .NET!]
 http://blogs.msdn.com/b/delay/archive/2009/10/26/creating-something-from-nothing-developer-friendly-virtual-file-implementation-for-net.aspx



いくつかの COM 型は、System.Runtime.InteropServices あるいはその配下の名前空間に
まとめられていますが、今回の場合はそれだけでは足りないかも知れません。その場合は
定数値やCOMインターフェイスの定義を調べて、自前で宣言しておいてください。


なお、OLEドラッグ&ドロップの仕組みについては、下記が参考になるかと思います。
後者については、IShellFolder.GetUIObjectOf にて
IDataObject を取得する手法も紹介されていますよ。

 窓プログラミング - 窓プログラミング2
 http://hp.vector.co.jp/authors/VA016117/winsdk2.html


 EternalWindows - OLE - OLE D&D
 http://eternalwindows.jp/ole/oledrag/oledrag00.html


本来であれば、ドロップ先アプリで実装された Drop メソッドが、OS によって
呼び出されることでドロップ処理が行われるわけですが、今回はそれを
自作アプリから呼び出すことになるかと思います。


# あくまでも可能性を提示しているのみです。実装可能かどうかは分かりません。
引用返信 編集キー/
■69710 / inTopicNo.7)  Re[4]: 別プログラムへドラッグ&ドロップ経由でのファイル送信方法
□投稿者/ kumatti (1回)-(2014/01/22(Wed) 19:54:49)
2014/01/22(Wed) 19:55:53 編集(投稿者)

過去ログ
http://bbs.wankuma.com/index.cgi?mode=al2&namber=15727&KLOG=32
引用返信 編集キー/
■69718 / inTopicNo.8)  Re[4]: 別プログラムへドラッグ&ドロップ経由でのファイル送信方法
□投稿者/ azutake (4回)-(2014/01/24(Fri) 01:37:12)
No69705 (魔界の仮面弁士 さん) に返信
> 2014/01/22(Wed) 14:00:39 編集(投稿者)
>
> ■No69704 (azutake さん) に返信
>>また,Clipboardの使用は必須となりますでしょうか.
>
> OLEドラッグ&ドロップ、クリップボード、OLE埋め込みなどにおいては、
> プロセス間のデータ交換に、いずれも IDataObject が用いられています。
> そのため実験時には、てっとり早く Clipboard を流用しています。
>
> Clipboard を使わずとも、IDataObject の実装さえ用意できれば OK かと思います。
>
> たとえば、先に紹介した過去ログにもある IShellFolder.GetUIObjectOf を使う方法があります。
> これなら、物理パスを持たないアイテム(コントロールパネル内のアイコンとか)さえも処理できます。
> ドロップ先のアプリがそれを受け取るかどうかは別として。
>
>  Windows SDK - IShellFolder::GetUIObjectOf method
>  http://msdn.microsoft.com/en-us/library/windows/desktop/bb775073.aspx
>
> 関連情報として:
>  Knowledge Base 183860 (Q183860) - How To Support Dropping of Items on Your Namespace Root
>  http://support.microsoft.com/kb/183860/en-us
>
>
> あるいは、System.Runtime.InteropServices.ComTypes.IDataObject インターフェースを
> 実装するクラスを作成し、ドラッグ&ドロップの機能を実装することもできます。
> 出来合いの実装を利用する方法に比べると、手間はかかりますが、
> 下記にサンプルがあるので参考までに。
>
>  MSDN Blogs - Creating something from nothing [Developer-friendly virtual file implementation for .NET!]
>  http://blogs.msdn.com/b/delay/archive/2009/10/26/creating-something-from-nothing-developer-friendly-virtual-file-implementation-for-net.aspx
>
>
>
> いくつかの COM 型は、System.Runtime.InteropServices あるいはその配下の名前空間に
> まとめられていますが、今回の場合はそれだけでは足りないかも知れません。その場合は
> 定数値やCOMインターフェイスの定義を調べて、自前で宣言しておいてください。
>
>
> なお、OLEドラッグ&ドロップの仕組みについては、下記が参考になるかと思います。
> 後者については、IShellFolder.GetUIObjectOf にて
> IDataObject を取得する手法も紹介されていますよ。
>
>  窓プログラミング - 窓プログラミング2
>  http://hp.vector.co.jp/authors/VA016117/winsdk2.html
>
>
>  EternalWindows - OLE - OLE D&D
>  http://eternalwindows.jp/ole/oledrag/oledrag00.html
>
>
> 本来であれば、ドロップ先アプリで実装された Drop メソッドが、OS によって
> 呼び出されることでドロップ処理が行われるわけですが、今回はそれを
> 自作アプリから呼び出すことになるかと思います。
>
>
> # あくまでも可能性を提示しているのみです。実装可能かどうかは分かりません。

結局ご回答していただいた資料等を参照にしたりWM_DROPFILESを使用したりし,作成しました.
ご回答した皆様,お騒がせし申し訳ありません.
また、沢山のご回答ありがとうございました.
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -