プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

クリップボードの中身を取得

以前作ったスクレイピングアプリなのだが、ChromeからURLをコピペして…実行し、ということを延々と行っていた。
s51517765.hatenadiary.jp

f:id:s51517765:20171021223347j:plain

この本を読んでいたら、クリップボードのテキストを取得する方法が載っているのを見つけました。

もしかしたら、C#でもできるんじゃないか?と思い調べたら、もちろんできたので紹介します。

これを組み込めば、

Chromeで必要なPageを探す。
②①のURLをコピー
スクレイピングアプリをアクティブに
クリップボードの中身をペースト
⑤ボタンクリックで必要な情報ゲット!

という工程が、

Chromeで必要なPageを探す。
②①のURLをコピー
③ボタンクリックで必要な情報ゲット!

とすることができます。

ボタンクリックも省略することも可能ですが、必要なURLを取得しているかどうか確認する必要があるので、やりすぎは逆効果になることもあると思い今回は組み込みません。

ボタンクリックの時にクリップボードの中身を取得し、web取得を走らせることもできるが、ここでは、クリップボードにURLが取り込まれたらアプリにURLを入力するようにしました。
このためには定期的にクリップボードを確認し、URLが取り込まれたら、URL boxに取り込み、アプリをアクティブにする、というようにします。
(省略しますが、URLであるかどうかをクリップボードのテキストが"http"で始まるかどうかを確認することでURL以外では動作させないということもできます。)

これにはタイマーイベントを利用します。

Visual StudioのForm1.cs[デザイン]のツールボックスから、Timerコンポーネントを追加すします。
デザイン画面のフォーム外にタイマーコンポーネントが追加されるので、タイマーコンポーネントをダブルクリックします。
すると、タイマーイベント private void timer1_Tick() が作成されます。

f:id:s51517765:20171021225237j:plain

Form1_Loadでtimer1を起動し、Intervalをセットします。これが、クリップボードのチェック間隔になります。
Form1起動時に、クリップボードの中身を取得し、初期化。これを変数”clp_text0”としました。
timer1_Tick()がInterval毎に実行され、クリップボードの中身が変化していれば、textBoxURLに中身をテキストで入力されます。
bool check_clp というbool型変数を設定し、一度しか実行されないようにします。これをつけないと何度も起動されてしまいます。
異なるURLを連続して取得したいので、テキストの取得が完了したら、この変数は初期化します。

private void Form1_Load(object sender, EventArgs e)
    {
        InitializeComponent();
        string clp_text0;
        bool check_clp=false;
        timer1.Interval = 1000; //タイマーインターバル
        timer1.Start();
        clp_text0 = Clipboard.GetText(); //クリップボードの中身を取得、初期化
     }
       private void timer1_Tick(object sender, EventArgs e)
        {
            if (clp_text0 != Clipboard.GetText()&&check_clp==false)
            {
                textBoxURL.Text(Clipboard.GetText());
                check_clp = true;
                this.TopMost = !this.TopMost;  //フォームを最前面に
            }
        }