Yahoo!動画を最前面にして表示する

Yahoo!動画

最近 GyaOYahoo!動画をよく見るのですが、全画面で表示していると、仕事ができない、、、というか、仕事中に TV を見るな、とも言えますが、まあ、そのあたりは脇に置いて、、、エディタやら Visual Studio やらを使いながら、動画も眺めてみたいわけです。

そうすると考えられるのは、

1. IE をトップ画面にする
 → すると、常に前面に出てくるので、他のアプリの邪魔をしない。
2. 広告やらメニューの部分はいらないから、最小で表示する。
 → ウィンドウのタイトルバーを無しにすればいけそうです。
3. あとは、ストリーミングの URL を叩く。
 → どうせだから、画像の部分だけを切り出してしまう。

これを考えると、

  • Windows プログラムにして WebBrowser を貼り付ける。
  • 貼り付けてある OBJECT タグを Yahoo!動画がから引っ張ってくる。

ということで出来そうです。

        // URLを指定する
        private void button1_Click(object sender, EventArgs e)
        {
            string url = textUrl.Text;

            // リストの「動画を見る」では、player.htmlに渡している。
            // これを、makeAsx.php に渡す方式に変換
            if (url.IndexOf("player.html") >= 0)
            {
                url = url.Replace("player.html", "makeAsx.php");
                url = url.Replace("spid", "spaceid");
                url += "&channel_no=0&ad_stream=1&product_type=1";

                textUrl.Text = url;
            }


            if ( url == "" ) {
                // サンプル用のURL
                url = "http://player.streaming.yahoo.co.jp/player/makeAsx.php?" + 
 "s_id=t&cp_id=00114&pg_id=v00630&co_id=v0063000000000325863&vw=3620&spaceid=2013007262&" +
 "channel_no=0&ad_stream=1&product_type=1";
            }
            this.webBrowser1.DocumentText = string.Format( m_html, url );
            this.TopMost = true;
        }

        // メニューの表示/非表示を切り替え
        private void buttonTitle_Click(object sender, EventArgs e)
        {
            if (buttonTitle.Tag == null )
            {
                // タイトルを隠す
                buttonTitle.Text = "表示";
                this.FormBorderStyle = FormBorderStyle.None;
                this.groupBox1.Visible = false;
                // 描画領域を設定して、ブラウザ部分だけを表示する
                GraphicsPath gp = new GraphicsPath();
                gp.AddRectangle(new Rectangle(
                    webBrowser1.Location, webBrowser1.Size));
                this.Region = new Region(gp);
                buttonTitle.Tag = true;
            }
            else
            {
                // タイトルを表示
                buttonTitle.Text = "隠す";
                this.FormBorderStyle = FormBorderStyle.Fixed3D;
                this.groupBox1.Visible = true;
                this.TransparencyKey = Color.Empty;
                this.Region = null;
                buttonTitle.Tag = null;
            }
        }

URLを引っ張ってくるのが結構面倒なのですが、Yahoo!動画の場合、メニュー部分(「動画を見る」ボタンが表示されているリスト)から、実際に動画を表示するページを割り出しています。

「動画を見る」のURLは、そのままではIEでソースを見ることができないので、一旦ファイルに保存するか、別途 WebBrowserコントロールを使って、ソースを抜き出します。

キャプチャ画面では、動画が見えませんが、実際は動画が表示されている状態です。これで Visual Studio が邪魔されずに(?)仕事ができます。

追記

おやすみオーバーレイ http://hp.vector.co.jp/authors/VA033596/ojos/001overlay.html#wmp8
に、オーバーレイを無効化してキャプチャする手段が載っていました。

不定形フォームを作る

でもって、最初は単純なところから、不定形フォームを作ります。VC++6.0の頃は、Regionを作って苦労したわけですが、.NETの場合は、Form クラスの TransparencyKey プロパティに透明色を指定するだけで完了です。

this.panel1.Visible = false;
// ビットマップを作成
Bitmap bmp = new Bitmap(this.panel1.BackgroundImage);
// 左上の点を透明色にする
Color col = bmp.GetPixel(0, 0);
// フォームの背景を変える
this.BackgroundImage = bmp;
this.BackgroundImageLayout = ImageLayout.None;
// リサイズ
this.Size = bmp.Size;
// 透明色を設定する
this.TransparencyKey = col;

要は、フォームの背景(BackgroundImage)に、画像を設定して、その画像の透明色(この場合は、左上の点を透明色と決めています)とフォームの色とを一緒にすればOK。
こうすることで、画像に合わせた不定形のフォームが簡単にできます。不定形フォームというと、円型とか星型(自分もやるけど)が多いのですが、背景の絵にあわせるならば、あらかじめ画像を用意してやるほうが簡単になります。

ちなみに、変形フォームを作ると、タイトルバーがなくなるのでフォームの移動ができなくなります。これは、マウスダウン&アップを独自に取る必要があります。このあたりは、明日、続きを書きます。

カテゴリを決める

不定形フォーム


この日記の目的として、単純なTipsでは面白くないので、ちょっとディープなものを集めていきます。これは、私自身の技術向上&保持でもあるし、そういう情報を手元に広げておけば、.NET Frameworkの不思議な部分(ドキュメントには書いてあるものの、どう使ったらいいのか分からない、あるいは、何かを作ろうと思ったけど、本当に .NET&Windowsでいけるのかどうか分からない)を、あらかじめ回避しておこうかな、という趣旨になります。

という訳で、.NETのクラスライブラリのカテゴリとしては、

  • GDI+(画像関係)
  • 暗号化
  • 証明書
  • .NET リモート
  • サービス
  • IEコンポーネント(WebBrowser)

あたりを中心に紹介&調査していきます。
この他のものは、だいたい、書籍やWebで調べられるので、ちょっと難しめ&それなりに役に立ちそう、な分野を狙います。

エンジニアマインド vol.2

エンジニアマインド Vol.2

エンジニアマインド Vol.2

技術トピックは、はてなに移動することに決定。
正式には、2007年から稼動することにします。

その前哨戦として、当方の記事の紹介(つーか宣伝)。
エンジニアマインド vol.2」(技術評論社)に、「賢い開発プロセスの選び方」という特集(30頁)を書いています。巷のアジャイル開発を網羅、ウォータフォールやCCPM(クリティカル・チェーン)の話もちらほら。原稿料は受領済みなので、立ち読みでもOKよw

というわけで、はてなには、.NET関係の技術情報を載せていくことにします。
mymy-mycompany分室(http://mycom.jugem.jp/)は、非技術ネタ(思考とか発想とか)を中心に。