ブラウザについて

タグの編集
投稿者 ugonight  (中学生) 投稿日時 2012/4/21 15:41:15
↑を利用して、テキストボックスに入力された文字列で検索するプログラムを作ろうかと思っているのですが、使い方が全く分かりません…
よろしければ使い方を教えてください

あと、新しいウィンドウを開くときに、自分を新しく起動させることができると聞いたのですがどうやってやるのでしょうか?
投稿者 るきお  (社会人) 投稿日時 2012/4/22 13:32:57
まず、Yahoo!検索の使用例です。

ugonightさんが、挙げているURLは普通にブラウザーからYahoo検索で検索した場合のURLの説明のようです。


半角英数のみのキーワードであれば下記のプログラムでOKです。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    Using internet As New Net.WebClient

        Dim utf8 = System.Text.Encoding.UTF8
        Dim keyword = "VB"
        Dim query = "http://search.yahoo.co.jp/search?fr=yjdnqp&p=" & keyword & "&ei=UTF-8"

        Dim result As Byte()
        result = internet.DownloadData(query)
        WebBrowser1.DocumentText = utf8.GetString(result)

    End Using

End Sub


全角文字がある場合はエンコードの必要があるので多少手間があります。ugonightさんが、Windows フォーム アプリケーションを使っていると仮定します。VB2005の場合は下記のプログラムをそのまま実行すればうまくいきます。
VB2008以降であれば、コンパイラの詳細設定で対象のフレームワークに「.NET Fremewark xx Client Profile」と書いてある部分を変更し、「.NET Framework xx」にします。たとえば、「.NET Framework 4 Client Profile」を「.NET Framework 4」に変更します。そのあとでSystem.Webに参照設定をして下記コードを実行すると結果が取得できます。

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
   
    Using internet As New Net.WebClient

        Dim utf8 = System.Text.Encoding.UTF8
        Dim keyword = "Visual Basic 中学校"
        Dim b() As Byte = utf8.GetBytes(keyword)
        Dim encodedKeyword = Web.HttpUtility.UrlEncode(keyword)
        Dim query = "http://search.yahoo.co.jp/search?fr=yjdnqp&p=" & encodedKeyword & "&ei=UTF-8"

        Dim result As Byte()
        result = internet.DownloadData(query)
        WebBrowser1.DocumentText = utf8.GetString(result)

    End Using
End Sub


なお、上記の2つのサンプルはネットワーク構成がシンプルな場合の例です。プロキシーを経由している場合などは追加のコードが必要になります。
投稿者 るきお  (社会人) 投稿日時 2012/4/22 13:38:58
>あと、新しいウィンドウを開くときに、自分を新しく起動させることができると聞いたのですがどうやってやるのでしょうか? 
これは何を言っているのかわかりません。

「新しいウィンドウを開くとき」とはどういうときでしょうか?「ボタンをクリックしたとき」や「フォームが開いたとき」なら意味がわかるのですが。「フォームが開いたとき」という意味でしょうか?

>自分を新しく起動させる
「自分」とはなんでしょうか?

たとえば、Windows フォーム アプリケーションでボタンをクリックしたときに実行しているアプリケーション自体をもう1つ起動するには下記のようにします。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    Shell(Application.ExecutablePath, AppWinStyle.NormalFocus)
   
End Sub

投稿者 るきお  (社会人) 投稿日時 2012/4/22 13:42:41
訂正します。

最初の投稿の2つ名の例の下記行は不要でした。
Dim b() As Byte = utf8.GetBytes(keyword)

試しているときにエンコード方式の勘違いして書いた不要なコードを消し忘れてしまいました。
この行はあってもなくても動作は同じです。
投稿者 ugonight  (中学生) 投稿日時 2012/4/22 14:59:37
ご丁寧に有難うございます

コンパイラの詳細設定というのは

で大丈夫なんでしょうか?

教えていただいたコードをもとに、Enterキーを押したらテキストボックスに入力されている値を検索しようと思って
    Private Sub ToolStripTextBox2_KeyUp(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles ToolStripTextBox2.KeyUp
        If e.KeyCode = Keys.Enter Then
            Using internet As New Net.WebClient

                Dim utf8 = System.Text.Encoding.UTF8
                Dim keyword = ToolStripTextBox2.Text
                Dim encodedKeyword = Web.HttpUtility.UrlEncode(keyword)
                Dim query = "http://search.yahoo.co.jp/search?fr=yjdnqp&p=" & encodedKeyword & "&ei=UTF-8"

                Dim result As Byte()
                result = internet.DownloadData(query)
                WebBrowser1.DocumentText = utf8.GetString(result)

            End Using
        End If
    End Sub

としたところ'HttpUtility' は 'Web' のメンバーではありません。というエラーが出てきてしまいました。
クラスを生産するとエラーが増える一方です、どうすればいいでしょうか…

あいまいな表現を使って申し訳ありません
自分を起動するのは、ご推測通りですが、新しいウィンドウを開くときというのは、たとえばここでの記事を編集するときに上部に「投稿で使用できるコードの説明」というところをクリックすると別ウィンドウで開きますよね?
そうすると、InternetExplorerが起動してしまうので、そこで起動しているアプリケーション自体を起動したいということです。
新しいウィンドウを開こうとしていることを取得したり、新しく起動したアプリケーションのwebbrowserコントロールをnavegateすることはできるのでしょうか


投稿者 るきお  (社会人) 投稿日時 2012/4/22 16:11:11
>コンパイラの詳細設定というのは
はい。合っています。

>'HttpUtility' は 'Web' のメンバーではありません。というエラーが出てきてしまいました。
System.Webに参照設定をしていないのではないでしょうか?

>InternetExplorerが起動してしまうので、そこで起動しているアプリケーション自体を起動したいということです。

過去の投稿のxvmmさんのアイディアを使うと次のようになります。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=9359

Public Class Form1

    Private Sub WebBrowser1_NewWindow(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles WebBrowser1.NewWindow
        e.Cancel = True
        Dim url As String = sender.Document.ActiveElement.GetAttribute("href")
        Process.Start(Application.ExecutablePath, url)
    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        If My.Application.CommandLineArgs.Count = 0 Then
            Return
        End If

        Dim url As String = My.Application.CommandLineArgs(0)
        WebBrowser1.Navigate(url)

    End Sub

End Class


ポイントは
Dim url As String = sender.Document.ActiveElement.GetAttribute("href")

の部分ですが、新しいウィンドウを開くいろいろな状況のどの部分にまで対応できているか確認はできていません。
ちょっと試してみたところ、ハイパーリンクを右クリック→「新しいウィンドウで開く」や、target="_blank"の場合うまく動作するようです。

この件は過去にも何回か出ており、正攻法での攻略は難易度が高いです。
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=10230
投稿者 YuO  (社会人) 投稿日時 2012/4/22 16:51:42
HttpUtility.UrlEncodeではなく,Uri.EscapeDataString使えばClient Profileでも使えますし,
参照設定の追加もいらないと思うのですが……。
投稿者 ugonight  (中学生) 投稿日時 2012/4/22 17:11:05
有難うございます
皆さんのおかげでどちらもうまくいきました♪

検索はUri.EscapeDataStringを使わせていただきました
投稿者 ugonight  (中学生) 投稿日時 2012/4/22 17:38:38
あ、新しいウィンドウを開いたときに、最初のページが表示されてしまうのですが
どうすれば、そのページを新しいウィンドウで開けるのでしょうか?
投稿者 るきお  (社会人) 投稿日時 2012/4/23 13:06:19
>新しいウィンドウを開いたときに、最初のページが表示されてしまうのですが
>どうすれば、そのページを新しいウィンドウで開けるのでしょうか? 
困っていることとやりたいことがよくわからないです。

>新しいウィンドウを開いたとき
とは、前の投稿にあるProcess.Start(Application.ExecutablePath, url)を使って新しくプログラムを起動したときということでよろしいでしょうか?

>最初のページ
これはなんのことか検討もつきません。
IEに設定しているホームページを指していますか?

>そのページ
これも検討がつきません。最初のページのことではないと思いますが、
他に「その」が指す言葉が文中に見当たらないようです。

>HttpUtility.UrlEncodeではなく,Uri.EscapeDataString使えばClient Profileでも使えますし,
>参照設定の追加もいらないと思うのですが……。 
思いつきませんでした。ご指摘ありがとうございます。

それから、
試していませんが、理屈上新しいページを開くタイミングでアクティブな要素に目的のURLを記したhref属性がないとこの手法は失敗しますのでugonightさんが使いたいシーンで役に立つかどうかは十分に試してみてください。
たとえば、多分JavaScriptからポップアップを開くような動作だとこの仕組みはうまく動かないと思います。

投稿者 るきお  (社会人) 投稿日時 2012/4/23 13:10:38
ひょっとして、
リンクをクリックして新しいウィンドウとして開いた場合に、クリックしたリンク先が表示されずにプログラムで既定のURLに設定しているページが表示されてしまう。
ということでしょうか?

そうであれば、新しいウィンドウを開く手段がhref属性のあるアクティブな要素によるものだとすれば、私が投稿したコードのFormのLoadイベントでクリックしたURLに自動的に遷移するようにしているはずですがうまく機能しませんか?

href属性があるアクティブな要素によらないポップアップだとすればこの手法では対応できません。

どのような手段で新しいウィンドウが開こうとしているでしょうか?
投稿者 ugonight  (中学生) 投稿日時 2012/6/16 16:23:04
あっ、browserのコントロールのURLプロパティがYahooになってたからでした.
お騒がせしましたすみません。