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

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

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

Re[12]: ドラッグ&ドロップでwebページのタイトルを


(過去ログ 83 を表示中)

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

■49148 / inTopicNo.1)  ドラッグ&ドロップでwebページのタイトルを
  
□投稿者/ Akkie (1回)-(2010/04/24(Sat) 12:09:13)

分類:[.NET 全般] 

こんにちは。こちらの掲示板は初めてお世話になります。
VB2008のExpress使用で自分用のWindows Formアプリを作っています。

ブラウザ(IE7,8がほとんど)のアドレスバーからアドレスやアイコンをTextBox1にドラッグ&ドロップした際
TextBox1にブラウザの表示ページのURLを、TextBox2にはページのタイトルを取得したいと思っています。
URLは下記の方法で出来ましたが、タイトルの取得方法がわかりません(そもそも可能なのか?)。

何か良い方法がありましたらご教授お願いします。

  'ドラッグ&ドロップでTextBox1に表示ページのURL
    Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop

        Dim url As String = e.Data.GetData(DataFormats.Text).ToString()
        TextBox1.Text = url

    End Sub

引用返信 編集キー/
■49160 / inTopicNo.2)  Re[1]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ Hongliang (617回)-(2010/04/25(Sun) 00:40:52)
無理ですね。そんな情報は載ってきていません。
引用返信 編集キー/
■49161 / inTopicNo.3)  Re[2]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ .SHO (1313回)-(2010/04/25(Sun) 07:55:12)
ドラッグしてない情報はドロップできません。
ドラッグ&ドロップですから。
引用返信 編集キー/
■49164 / inTopicNo.4)  Re[3]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ Akkie (2回)-(2010/04/25(Sun) 10:34:04)
返信ありがとうございます。

アドレスバーのアイコンをデスクトップ等にドロップすると
ショートカットの名前がページタイトルになるので、情報は載っているものと思っていましたが・・・
引用返信 編集キー/
■49167 / inTopicNo.5)  Re[4]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ よねKEN (486回)-(2010/04/25(Sun) 13:27:16)
> アドレスバーのアイコンをデスクトップ等にドロップすると
> ショートカットの名前がページタイトルになるので、情報は載っているものと思っていましたが・・・

受け側であるデスクトップのプログラムが、ドロップされたURLから
htmlを取得して<title>タグの情報を取得しているのではないでしょうか。
引用返信 編集キー/
■49169 / inTopicNo.6)  Re[5]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ ぽぴ王子 (491回)-(2010/04/25(Sun) 14:23:16)
ぽぴ王子 さんの Web サイト
No49167 (よねKEN さん) に返信
>>アドレスバーのアイコンをデスクトップ等にドロップすると
>>ショートカットの名前がページタイトルになるので、情報は載っているものと思っていましたが・・・
> 
> 受け側であるデスクトップのプログラムが、ドロップされたURLから
> htmlを取得して<title>タグの情報を取得しているのではないでしょうか。

自分もそんな感じがして少し調べてみました。
結論から言うと、ショートカットに使用するファイル名(?)を含めたデータも一緒に渡されているようです。

どぼん!さんのこちらのページが少し参考になりました。
http://dobon.net/vb/dotnet/control/dropfromwebbrowser.html

MemoryStreamとして取れるようなので、その中の76バイト目からがファイル名になっているようです。
(本当はちゃんとした構造体の一部なのだと思いますが、そこまで調べるのは面倒だったので)
どぼん!さんはシフトJISで処理していましたが、Google ChromeなどはUnicodeでしか渡されないようだったので
Unicodeで取得しています。

ページのタイトルというわけにはいかないかもしれませんが(ショートカットのファイル名として渡されるもの
みたいだし)以下のコードでなんとかなるのではないかと。
当然ながらテストもしていませんし、保証はできませんので、何をしているか理解するために使用してください。

        private void Form_DragDrop(object sender, DragEventArgs e)
        {
            // FileGroupDescriptorWフォーマットのメモリーストリームを読む
            MemoryStream desciptor = (MemoryStream)e.Data.GetData("FileGroupDescriptorW");

            // 76バイト目からショートカットのファイル名らしきものが格納されている?
            desciptor.Seek(76, SeekOrigin.Begin);

            // Unicodeでファイルを読み取る
            List<byte> byteList = new List<byte>();
            while (true)
            {
                // 1文字分取得
                List<byte> letter = new List<byte>();
                for (int i = 0; i < 4; i++)
                {
                    int letterByte = desciptor.ReadByte();
                    if (letterByte == -1)
                    {
                        break;
                    }
                    letter.Add((byte)letterByte);
                }

                // 1文字分(4バイト)読み取れなかった、あるいは最後まで達していたら終了
                if (letter.Count != 4 || desciptor.Position > desciptor.Length)
                {
                    break;
                }

                // 4バイトすべてが0だったら終端
                if (letter[0] == 0 && letter[1] == 0 && letter[2] == 0 && letter[3] == 0)
                {
                    break;
                }

                // 1文字分のデータを追加
                byteList.AddRange(letter);
            }

            // タイトルを取得
            string title = Encoding.Unicode.GetString(byteList.ToArray()).TrimEnd('\0');

            // 終端に ".url" がついている場合は削除
            if (title.ToUpper().EndsWith(".URL") == true)
            {
                title = title.Substring(0, title.Length - 4);
            }

            System.Diagnostics.Debug.Print("タイトル:{0}", title);
        }

引用返信 編集キー/
■49170 / inTopicNo.7)  Re[6]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ 渋木宏明(ひどり) (1312回)-(2010/04/25(Sun) 15:28:00)
渋木宏明(ひどり) さんの Web サイト
> (本当はちゃんとした構造体の一部なのだと思いますが、そこまで調べるのは面倒だったので)

多分、OLE ドラッグ&ドロップのシリアライズデータです。

なので、テストや調査目的ならともかく、第三者に配布すようなアプリケーションでは、シリアライズデータを直読みするような実装は避けるべきです>スレ主の人

引用返信 編集キー/
■49175 / inTopicNo.8)  Re[7]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ Akkie (3回)-(2010/04/25(Sun) 17:32:23)
No49170 (渋木宏明(ひどり) さん) に返信
>>(本当はちゃんとした構造体の一部なのだと思いますが、そこまで調べるのは面倒だったので)
>
> 多分、OLE ドラッグ&ドロップのシリアライズデータです。
>
> なので、テストや調査目的ならともかく、第三者に配布すようなアプリケーションでは、シリアライズデータを直読みするような実装は避けるべきです>スレ主の人
>

配布する予定はありませんが、理解に乏しいまま進めるのも何ですから
再考してみたいと思います。

御返信くださった皆さん、ありがとうございました。
解決済み
引用返信 編集キー/
■49186 / inTopicNo.9)  Re[6]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ とっちゃん (499回)-(2010/04/26(Mon) 11:48:02)
とっちゃん さんの Web サイト
No49169 (ぽぴ王子 さん) に返信

済になっちゃってるのですが...

FileGroupDescriptor(W)は、CF_FILEGROUPDESCRIPTOR で定義されてる Windows Shell で定義されているクリップボードフォーマットの一つです。
http://msdn.microsoft.com/en-us/library/bb773290(VS.85).aspx
にある、FILEGROUPDESCRIPTOR 構造体になります。

ちゃんと規定されていますよ。あと、ついになる情報として FileContents(ファイルの中身そのもの)というのもあります。
このあたりも全部規定されています。

ざっと見た感じ、唯一ドキュメントされてないのは、UniformResourceLocator オブジェクトくらいですね。

名前から推測はつくけど、ドキュメントがあるとしたらIEの開発関連情報のどこかだろうなぁ。。。

解決済み
引用返信 編集キー/
■49187 / inTopicNo.10)  Re[7]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ 渋木宏明(ひどり) (1313回)-(2010/04/26(Mon) 13:43:50)
渋木宏明(ひどり) さんの Web サイト
> ざっと見た感じ、唯一ドキュメントされてないのは、UniformResourceLocator オブジェクトくらいですね。

コレがたぶん、ショートカットオブジェクトのシリアライズデータな予感。
引用返信 編集キー/
■49188 / inTopicNo.11)  Re[8]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ とっちゃん (500回)-(2010/04/26(Mon) 14:54:39)
とっちゃん さんの Web サイト
No49187 (渋木宏明(ひどり) さん) に返信
>>ざっと見た感じ、唯一ドキュメントされてないのは、UniformResourceLocator オブジェクトくらいですね。
>
> コレがたぶん、ショートカットオブジェクトのシリアライズデータな予感。

おそらくこいつが本体だと思います。<IE的にはw

ま、FileContentsも、FileGroupDescriptorも、情報としては、明文化されてるので、利用そのものは問題なく使えますけどね。
意味が分かってさえいれば。。。w

引用返信 編集キー/
■49190 / inTopicNo.12)  Re[8]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ aetos (287回)-(2010/04/26(Mon) 15:23:20)
No49187 (渋木宏明(ひどり) さん) に返信
>>ざっと見た感じ、唯一ドキュメントされてないのは、UniformResourceLocator オブジェクトくらいですね。
>
> コレがたぶん、ショートカットオブジェクトのシリアライズデータな予感。

単に ASCII 文字であらわされた URL ですね。
# IUniformResourceLocator じゃなかったか。
引用返信 編集キー/
■49191 / inTopicNo.13)  Re[9]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ 渋木宏明(ひどり) (1314回)-(2010/04/26(Mon) 16:11:00)
渋木宏明(ひどり) さんの Web サイト
>>コレがたぶん、ショートカットオブジェクトのシリアライズデータな予感。
>
> 単に ASCII 文字であらわされた URL ですね。

URL だけしか入ってないの?

web ページのタイトルや favicon なんかの情報も入ってそうな気がするけど、そーでもないんだ。
引用返信 編集キー/
■49194 / inTopicNo.14)  Re[10]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ aetos (288回)-(2010/04/26(Mon) 16:55:04)
No49191 (渋木宏明(ひどり) さん) に返信
> >>コレがたぶん、ショートカットオブジェクトのシリアライズデータな予感。
>>
>>単に ASCII 文字であらわされた URL ですね。
>
> URL だけしか入ってないの?
>
> web ページのタイトルや favicon なんかの情報も入ってそうな気がするけど、そーでもないんだ。

URL 文字列の後はひたすら長ーい \0 が入っているだけでした。

IUniformResourceLocator だとしても、どうやって MemoryStream から取り出すのかわかんないけどね。
引用返信 編集キー/
■49195 / inTopicNo.15)  Re[11]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ 渋木宏明(ひどり) (1315回)-(2010/04/26(Mon) 17:25:55)
渋木宏明(ひどり) さんの Web サイト
> IUniformResourceLocator だとしても、どうやって MemoryStream から取り出すのかわかんないけどね。

IPersistXXX を QI してデシリアライズ。
引用返信 編集キー/
■49202 / inTopicNo.16)  Re[12]: ドラッグ&ドロップでwebページのタイトルを
□投稿者/ れい (895回)-(2010/04/26(Mon) 21:49:05)
仕様がどこにあったかもう忘れてしまいましたが。
普通に読めばいいだけだったはず。

昔の私のコードではこんなになってます。

                Dim u As Uri = Nothing
                Dim memst As MemoryStream = TryCast(e.Data.GetData(ShellClipboardFormats.UniformResourceLocatorW), MemoryStream)
                Dim str As String
                Dim i As Integer

                If memst Is Nothing Then Exit Sub

                Using sr As New StreamReader(memst, System.Text.Encoding.Unicode) ' Unicodeで読む
                    str = sr.ReadToEnd()
                End Using
                i = str.IndexOf(vbNullChar)
                If i >= 0 Then str = str.Substring(0, i)

                If Not Uri.TryCreate(str, UriKind.Absolute, u) Then Exit Sub

とりあえず「W」付きじゃないほうはANSIなのでプラットフォーム依存です。

仕様はどこにあったっけなぁ?
他にもドラッグ中に発生する通信用のデータフォーマットとか、いろいろ規定されていたはずなんですが。


引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -