プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#、ラズパイ始めました。

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

以前作ったスクレイピングアプリなのだが、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;  //フォームを最前面に
            }
        }