WebBrowser で、innterTextやリンクを取得する方法

環境: Visual Studio 2010 / WPF

インターネット上のHTMLより、リンクや文書を取得するには、単にWebClient でHTMLを取って来て、処理すればいいのですが・・・

とある理由でHTMLをブラウズしながら、ドキュメントに含まれるリンクなどを取得する必要があったので、WebBrowser を使って作ってみました。

WebBrowser は、裏側で mshtml の COMで実装されているので、ちょっと使い方が面倒だったのでメモしておきます。

 

参照の追加より、COM のmshtml.tlb を追加する。

image

 

WebBrowserに対して、Navigate でブラウズする。

Navigated イベントだと、document を完全に取得する前に、Navigated イベントが発生してしまう。

そこで、Document が完全にロードを完了したイベントとして、LoadCompleted を使用する。

 

例1: innterTextを取得する場合

例2: リンクの HTML をリストする場合

実際の実行結果はこんな感じ。

image

Splashtop OS

http://os.splashtop.com/

マイクロソフトがDeviceVM社と組み、瞬間起動するOS「Splashtop OS」の無料ダウンロードを開始。

ただし、今サポート対象は次のデバイスのみ。

• HP Mini 110
• Compaq Mini CQ10
• HP Mini 210
• HP Pavilion dm4
• HP Pavilion dv4
• HP Pavilion dv5
• HP Pavilion dv6
• HP Pavilion dv7

手持ちのWindows 7でインストールしてみたが、インストールに失敗。

Intel GMA のバージョンをあげてみる

出荷時(Inetl Graphics Media Accelerator 500 2010/09/21 version 8.14.10.12026)

プロセッサ 2.1

メモリ 4.2

グラフィクス 4.5

ゲーム用グラフィクス 2.0

プライマリハードディスク 5.2

————–

(Inetl Graphics Media Accelerator 500 2010/09/16 version 8.14.10.12030)

プロセッサ 2.2

メモリ 4.3

グラフィクス 4.4

ゲーム用グラフィクス 2.4

プライマリハードディスク 5.2

スレートPC上でのマルチタッチ開発メモその1

ONKYOのスレートPCを入手した。

tw217_main

http://www.jp.onkyo.com/pc/personalmobile/

さっそく、マルチタッチアプリケーションを作ってみる。

まずは、スレートPC上では開発できないというか、とてもやりにくいので、メインPC上で開発して、スレートPC上で動作させる形。リモートデバッグはできないので、ちょっと厄介かも。

ちょっとイベントがどのように取れているのか確認するプログラムをWPFで作ってみる。

.NET Framework 4.0 がないと動かないので、.NET Framework 4.0をインストール。

TouchEnter, TouchMove, TouchLeave, TouchUp関連は、

private void image1_TouchMove(object sender, TouchEventArgs e)
{
    this.textBoxTouchType.Text = “TouchMove”;

    ShowTouchParams(e);
}

private void ShowTouchParams(TouchEventArgs e)
{
    this.textBoxID.Text = “Touch ID = ” + e.TouchDevice.Id;

    TouchPoint tp = e.GetTouchPoint(this);

    this.textBoxPointX.Text = tp.Position.X.ToString();
    this.textBoxPointY.Text = tp.Position.Y.ToString();
    this.textBoxWidth.Text = tp.Size.Width.ToString(); // 値取れず
    this.textBoxHeight.Text = tp.Size.Height.ToString(); // 値取れず

    this.textBoxBoundsX.Text = tp.Bounds.X.ToString();
    this.textBoxBoundsY.Text = tp.Bounds.Y.ToString();
    this.textBoxBoundsW.Text = tp.Bounds.Width.ToString(); // 値取れず
    this.textBoxBoundsH.Text = tp.Bounds.Height.ToString(); // 値取れず
}

Manipulation系は、

IsManipulationEnabled を trueにセットして、
private void checkBoxManipulationEnabled_Click(object sender, RoutedEventArgs e)
{
    this.image1.IsManipulationEnabled = (bool)checkBoxManipulationEnabled.IsChecked;
    this.textBoxManipulation.Text = this.image1.IsManipulationEnabled.ToString();
}

private void image1_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
    this.textBoxManipulation.Text = “ManipulationDelta”;
    this.textBoxRotationDelta.Text = e.DeltaManipulation.Rotation.ToString();
    this.textBoxManipulationOrigX.Text = e.ManipulationOrigin.X.ToString();
    this.textBoxManipulationOrigY.Text = e.ManipulationOrigin.Y.ToString();
    this.textBoxRotation.Text = e.CumulativeManipulation.Rotation.ToString();
    this.textBoxManTransX.Text = e.CumulativeManipulation.Translation.X.ToString();
    this.textBoxManTransY.Text = e.CumulativeManipulation.Translation.Y.ToString();

    if (e.DeltaManipulation.Rotation != 0)
    {
        Matrix mat = this.image1.RenderTransform.Value;
        mat.RotateAt(e.DeltaManipulation.Rotation, e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
        this.image1.RenderTransform = new MatrixTransform(mat);
    }
    else
    {
        Matrix mat = this.image1.RenderTransform.Value;
        mat.Translate(e.CumulativeManipulation.Translation.X, e.CumulativeManipulation.Translation.Y);
        this.image1.RenderTransform = new MatrixTransform(mat);
    }
}

イナーシャーは、

private void checkBoxInertier_Click(object sender, RoutedEventArgs e)
{
    if(checkBoxInertier.IsChecked == true)
        Manipulation.StartInertia(this.image1);
}

private void image1_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingEventArgs e)
{
    this.textBoxManipulation.Text = “ManipulationInertiaStarting”;
    this.textBoxManipulationOrigX.Text = e.ManipulationOrigin.X.ToString();
    this.textBoxManipulationOrigY.Text = e.ManipulationOrigin.Y.ToString();

    e.TranslationBehavior.DesiredDeceleration = 0.001;
    e.RotationBehavior.DesiredDeceleration = 0.001;
}

これで、Delta, Cumulative が取れた。イベントをモニタリングのためにTextBoxに書き出していたら、かなりもっさりした感じになってしまった。

リモートデバッグできないのは、やっかいだな。

移動・ローテーションは、もう少しまともなコードの気がするが、とりあえず機能の説明を忘れないうちにっと。あとでスクリーンショットをもらおう・・・

グルーピング

出所不明

西原さんは、漫画を描いているのは、「保護者」としてではなく、
「作者」として描いているのであるから、漫画に関する事項は、
作者として扱うべきであり、学校は、作者を呼び出す権利を持っ
ていない、不当な表現の自由の侵害である、という論理を展開し
ます。

このようなグルーピングは、色々なところで使えます。

ある男性が女性を殴った時、

「女を殴る男なんてサイテーよ!」

と言われたのに対し、

「女として殴ったのではない。人間として許せなかったから殴っ
たのだ。」

などと言い訳するのも都合のよいグルーピングに属するでしょう。

帰納法

出所不明

「学生時代に弁護士と合コンしたら、ブ男ばかりだった。」
「就職してすぐ弁護士と合コンしたら、ブ男ばかりだった。」
「昨日弁護士と合コンしたら、ブ男ばかりだった。」

「よって、弁護士は皆ブ男だ。」

例外を挙げるのが一つ目であり、例外を立証すれ
ば、帰納法は崩壊します。それに対し、帰納法は、その例外を排除
する論理を展開してゆくことになります。

帰納法に対する反論の二つめは、推論の過程に疑義を差し挟むこと
です。

「たった3回の合コンで何がわかると言うのだ。君の論理でいうと、
職業は関係なしに3回合コンをやって全てブ男だったら、全ての男
性がブ男だということになるのではないか。違うというのであれば、
なぜ弁護士だけが違うのか、理由を明らかにせよ。」

後は、いつもどおり定義を攻めていく方法もあります。

「君の言うブ男の定義を教えてもらおう。・・・。ところで、弁護
士とは、司法試験に合格し、研修を受け、裁判官や検事ではなく弁
護士登録をした者であるが、君の定義に従うと、どの時点でブ男に
なるのか。また上記のような者がブ男になる論理的必然性を立証せ
よ。」

二者択一を切り返す方法

出所不明

「株主のものでもあるし、リスナーのものでもある。」と断定を避
ける方法や、
「どちらのものでもなく、○○のものだ。」と第三の選択肢を作り
出す方法。

誤った二者択一で、もっとおもしろい返し技がある。
「なんだ。このパーティは。田舎者か、オタクしかいないじゃないか。」
自分のことを棚に上げてこんなことを言っています。

「田舎者とはどういう者を言うのか。」
「オタクとはどういう者を言うのか。」
と定義から攻めていき、二者択一を崩していく。

しかし、自分のことを棚に上げてこういう二者択一を主張している
場合には、
「あなたは田舎者ですか?」
水村「は?違いますよ。私は東京生まれですよ。」
篠原「あなたの論法によると、このパーティには、田舎者かオタク
しかいないのですよね。あなたが田舎者でないなら、オタクなので
すね。」
水村「・・・。」
議論に有効な二者択一ですが、意外なところに落とし穴がありました。