DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ドラック&ドロップ

分類:[.NET]

初めまして。

C# で、特定のファイルにドラック&ドロップしたのと同じ状況を作り出したいのですが、C# で実現可能なものでしょうか?例えば、圧縮解凍ソフトのショートカットにファイルをドロップしたというような感じのイベントを発生させたいのです(圧縮ファイルを作りたいとかではありません)。

ご存知の方がいらっしゃいましたらご教授ください。
■No2307に返信(Yamaさんの記事)
> 初めまして。
>
> C# で、特定のファイルにドラック&ドロップしたのと同じ状況を作り出したいのですが、C# で実現可能なものでしょうか?例えば、圧縮解凍ソフトのショートカットにファイルをドロップしたというような感じのイベントを発生させたいのです(圧縮ファイルを作りたいとかではありません)。

# No2282 で同じような話題が出ています。

ショートカットにファイルをドロップして起動させるということは、そのファイル名をコマンドライン引数にして起動させるということです。具体的には次のようになります。ここではメモ帳でtest.txtファイルを開いています。

System.Diagnostics.Process.Start("notepad.exe", "test.txt");
管理人様

ありがとうございます。

> System.Diagnostics.Process.Start("notepad.exe", "test.txt");

この方法では考えていたことが実現できませんでした。

正確にはショートカットではなく、C:\Documents and Settings\Default User\SendTo\ の中のファイルに引き渡したい(右クリック→送るを再現したい)のですが、良い方法はありますでしょうか?
>>System.Diagnostics.Process.Start("notepad.exe", "test.txt");
>
> この方法では考えていたことが実現できませんでした。

考えていたことというのは具体的に何でしょう?

> 正確にはショートカットではなく、C:\Documents and Settings\Default User\SendTo\ の中のファイルに
> 引き渡したい(右クリック→送るを再現したい)のですが、良い方法はありますでしょうか?

「送る」を使った場合も、コマンドライン引数として渡されるので、
「ファイルにドラック&ドロップ」の場合とまったく同じです。
よねKENさんありがとうございます。


> 「送る」を使った場合も、コマンドライン引数として渡されるので、
> 「ファイルにドラック&ドロップ」の場合とまったく同じです。
---
System.Diagnostics.Process.Start(@"C:\Documents and Settings\Default User\SendTo\メール受信者.MAPIMail",@"c:\windows\羽毛.bmp");

としてみても、.MAPIMail などショートカットではないD&Dイベントで例外が発生します。
>>「送る」を使った場合も、コマンドライン引数として渡されるので、
>>「ファイルにドラック&ドロップ」の場合とまったく同じです。
> ---
> System.Diagnostics.Process.Start(@"C:\Documents and Settings\Default User\SendTo\メール受信者.MAPIMail",@"c:\windows\羽毛.bmp");

このファイルは中身0バイトの何の意味もないファイルで、
「メール受信者.MAPIMail」という名前のファイルが特別扱いされているようですね。

Process.Startの2つ引数取るものは、
・実行ファイルのパス
・コマンドライン引数に渡す値
でないといけないはずなので、これでは実現できませんね。

添付ファイル付きでメールを送ることが目的なら、ここのサイトのTipsの
http://dobon.net/vb/dotnet/internet/smtpmail2.html
では駄目でしょうか?
>System.Diagnostics.Process.Start(@"C:\Documents and Settings\Default User\SendTo\メール受信者.MAPIMail",@"c:\windows\羽毛.bmp");
>
>としてみても、.MAPIMail などショートカットではないD&Dイベントで例外が発生します。

#はじめの質問とはかなり内容が変わったようですが...。

「メール受信者」を実行させる方法に関しては、次のニュースグループのスレッドで説明されているようです。

・How implement SendTo Mail Recipient?
http://groups.google.co.jp/groups?hl=ja&lr=&ie=UTF-8&inlang=ja&threadm=OiW1HqbhDHA.884%40TK2MSFTNGP10.phx.gbl&rnum=1&prev=/groups%3Fhl%3Dja%26lr%3D%26ie%3DUTF-8%26inlang%3Dja%26selm%3DOiW1HqbhDHA.884%2540TK2MSFTNGP10.phx.gbl

エクスプローラの「送る」と同じ事を行う方法は、C++での例が上記リンク先で紹介されているリンク先、または次のリンク先にあります。

・SendTo mail recipient
http://www.arstdesign.com/articles/sendtomail.html

Outlook Expressで添付ファイルを送る方法としては、emlファイルを作るやり方があるようです。

・Visual Basic: Mailto and attachments
http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_20256503.html

結局は、やはりSmtpMailクラスを使うのがよさそうですが。
  • 題名: .MAPImail へのファイルドロップno
  • 著者: Yama
  • 日時: 2004/02/12 14:18:09
  • ID: 2471
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> #はじめの質問とはかなり内容が変わったようですが...。

申し訳ございません。タイトルも変えました。


> エクスプローラの「送る」と同じ事を行う方法は、C++での例が上記リンク先で紹介されているリンク先、または次のリンク先にあります。

やはり C# でのサンプルは見つからないですね。C++でDLL化して使うのが良さそうな感じですが、C# 単体で実現できればうれしいですね。

[DllImport("ole32.dll", PreserveSig=false)]
[return: MarshalAs(UnmanagedType.IUnknown)]
public static extern object CoCreateInstance( [MarshalAs(UnmanagedType.LPStruct)] Guid rclsid, [MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter, uint dwClsContext, [MarshalAs(UnmanagedType.LPStruct)] Guid riid);

とかして、 CoCreateInstance さえ作れば C# でも実現可能なのでしょうか。


行いたい内容は foo@hogehoge.test.MAPIMail というファイルを作成し、そこにファイルをドラックドロップしたことにしたい(既定のメーラが foo@hogehoge.test 宛てに ドロップされたファイルが添付された状態で起動する)だけなんですが…難しいもんですね。

DOBON.NET | プログラミング道 | プログラミング掲示板