internal static Tuple<string, string> GetUrlFromDataObject(IDataObject data)
{
if (data.GetDataPresent("text/x-moz-url"))
{
// Firefox, Google Chrome で利用可能
// 参照: https://developer.mozilla.org/ja/docs/DragDrop/Recommended_Drag_Types
using (var stream = (MemoryStream)data.GetData("text/x-moz-url"))
{
var lines = Encoding.Unicode.GetString(stream.ToArray()).TrimEnd('\0').Split('\n');
if (lines.Length < 2)
throw new ArgumentException("不正な text/x-moz-url フォーマットです", nameof(data));
return new Tuple<string, string>(lines[0], lines[1]);
}
}
else if (data.GetDataPresent("IESiteModeToUrl"))
{
// Internet Exproler 用
// 保護モードが有効なデフォルトの IE では DragDrop イベントが発火しないため使えない
using (var stream = (MemoryStream)data.GetData("IESiteModeToUrl"))
{
var lines = Encoding.Unicode.GetString(stream.ToArray()).TrimEnd('\0').Split('\0');
if (lines.Length < 2)
throw new ArgumentException("不正な IESiteModeToUrl フォーマットです", nameof(data));
return new Tuple<string, string>(lines[0], lines[1]);
}
}
else if (data.GetDataPresent("UniformResourceLocatorW"))
{
// それ以外のブラウザ向け
using (var stream = (MemoryStream)data.GetData("UniformResourceLocatorW"))
{
var url = Encoding.Unicode.GetString(stream.ToArray()).TrimEnd('\0');
return new Tuple<string, string>(url, null);
}
}
throw new NotSupportedException("サポートされていないデータ形式です: " + data.GetFormats()[0]);
}