Copilot in Windowsを使ったWebページの内容要約処理をショートカットキーから実行できるようにする方法を紹介する。前回はこの自動化手段としてPower Automateを使ったが、今回はPowerShellとショートカットファイルを使う方法を取り上げる。プログラミングのスキルが必要になるが、Power Automateを使う方法よりも高速に処理を実行したい場合にはこの方法を参考にしてもらえれば幸いだ。

連載「Copilot in Windowsを使ってみよう」のこれまでの回はこちらを参照

Power Automateは起動までが遅い

WindowsではPower Automateを使うことでさまざまなデスクトップ操作を自動化することができる。Power Automateはいわゆるローコードツールであり、プログラミングの経験がない方でも比較的なんとかなるように工夫されている。

Power AutomateはWindowsのGUI操作を自動化する上で効果的な方法なのだが、プログラムのロードから実行までに一定の時間がかかるという特長がある。プログラムをクラウドでホストしている関係上、この部分は高速化が期待できない。

しかし、ショートカットキーを押して処理をするケースというのはそもそも高速に処理がはじまってほしいことが多く、Power Automateのこの特徴は受け入れられないこともあるかもしれない。今回はそうした問題の解決手段として、Power AutomateではなくPowerShellとショートカットファイルを使う方法を紹介する。

PowerShellから操作を自動化すればよい

Copilot in Windowsはユーザーに対して操作を受け付けるためのAPIを提供していないようにみえる。この状態で自動化するために、前回は次のようにショートカットキーを使ってCopilot in Windowsのプロンプトに指令を送る方法を考えた。

  1. Webブラウザーにフォーカスがある状態でCtrl+L Ctrl+Cを押してURLをコピーする
  2. システムクリップボードの内容を変数に保存する
  3. Win+Cを押してCopilot in Windowsのパネルを表示する
  4. URLの内容を要約するように指示したテキストをプロンプトに貼り付ける

Copilot in WindowsはWin+Cで表示することができ、表示された段階でプロンプトにフォーカスがあたっている。この状態でテキストを送り込めば指令を与えることができる。こうした動作を利用して入力処理を自動化しようということだ。

今回も同じことをする。前回は上記処理をPower Automateから行ったが、今回はこの処理をPowerShellから行うことにする。

あとはショートカットキーを押したときに作成したPowerShellスクリプトが実行されるようにすればよい。Windowsはショートカットファイルにショートカットキーを設定できるようにしているので、この機能を使ってショートカットキーによるPowerShellスクリプトの実行を実現させる。

PowerShellスクリプトを開発する

今回のPowerShellスクリプトの作成にはそれなりにスキルが必要になる。つくり方はどのようなかたちでもよいが、せっかくなのでCopilotにPowerShellスクリプトの生成を指示する方法を使う。まずは、次のようにCopilotに指示を出す。

次の処理を行うPowerShellスクリプトを生成してください。

  • マウスの左ボタンがクリックされるまで待つ
  • フォーカスのあるウィンドウへ Ctrl+L Ctrl+C RWin+C を送信する
  • システムクリップボードのテキストを $text に代入する
  • フォーカスのあるウィンドウへ「Summarize the contents of the following URL in Japanese: $text」と改行を2つ送信する
  • Copilot in WindowsにPowerShellスクリプトの生成を指示

    Copilot in WindowsにPowerShellスクリプトの生成を指示

Copilotはそれらしいスクリプトを生成してくれる。これをファイルに保存して実行すると、エラーが出力されて実行できない。エラーを再度Copilotに入力して修正を指示する。このやり取りを繰り返していくと、うまくいけば動作するPowerShellスクリプトが生成される。

ただいろいろ試した限りでは、現在無償で利用できるCopilot in Windowsの能力では今回の目的に必要となるスクリプトを生成するのはちょっとばかり難しいかもしれない。プロンプトへの指示を巧みに変えていけば目的のものが得られる可能性もあるが、それほど簡単ではなさそうだというのが自分が試行錯誤してみた感想だ。

ここではある程度手動で書いてしまったが、次のようなPowerShellスクリプトを用意した。

gen_abst.ps1

# System.Windows.Formsアセンブリをロード
Add-Type -AssemblyName System.Windows.Forms

# マウスクリックを待機するためのMouseListenerクラスを定義
Add-Type @"
using System;
using System.Runtime.InteropServices;

public class MouseListener
{
    [DllImport("user32.dll")]
    public static extern short GetAsyncKeyState(int vKey);

    public static void WaitForLeftClick()
    {
            while (true)
            {
                    if (GetAsyncKeyState(0x01) != 0) // 0x01は左マウスボタンの仮想キーコード
                    {
                            break;
                    }
                    System.Threading.Thread.Sleep(100); // 高いCPU使用率を避けるために100ミリ秒スリープ
            }
    }
}
"@

# キーイベント用にuser32.dllをインポート
Add-Type @"
using System;
using System.Runtime.InteropServices;

public class KeyboardRWin
{
    [DllImport("user32.dll")]
    public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

    public const int KEYEVENTF_EXTENDEDKEY = 0x1;
    public const int KEYEVENTF_KEYUP = 0x2;
    public const byte VK_RWIN = 0x5C; // 右Windowsキーの仮想キーコード
    public const byte VK_C = 0x43; // 'C'キーの仮想キーコード

    public static void Press()
    {
            keybd_event(VK_RWIN, 0, KEYEVENTF_EXTENDEDKEY, 0); // RWinキーを押す
            keybd_event(VK_C, 0, KEYEVENTF_EXTENDEDKEY, 0); // Cキーを押す
            keybd_event(VK_C, 0, KEYEVENTF_KEYUP, 0); // Cキーを離す
            keybd_event(VK_RWIN, 0, KEYEVENTF_KEYUP, 0); // RWinキーを離す
    }
}
"@

# 左マウスボタンのクリックを待つ
[MouseListener]::WaitForLeftClick()

# フォーカスされているウィンドウにCtrl+L, Ctrl+C, RWin+Cを送信
[System.Windows.Forms.SendKeys]::SendWait("^{l}") # Ctrl+Lを送信
Start-Sleep -Milliseconds 100 # シーケンスの確実な実行のための短い遅延
[System.Windows.Forms.SendKeys]::SendWait("^c") # Ctrl+Cを送信
Start-Sleep -Milliseconds 100 # シーケンスの確実な実行のための短い遅延

# Windows APIを使用してRWin+Cを送信
[KeyboardRWin]::Press()

# クリップボードからテキストを取得
$text = Get-Clipboard
Start-Sleep -Milliseconds 200 # シーケンスの確実な実行のための短い遅延

# フォーカスされたウィンドウに要約リクエストを送信
[System.Windows.Forms.SendKeys]::SendWait("Summarize the contents of the following URL in Japanese: $text`r`n`r`n"

このスクリプトを実行すると想定していた動作が実現する。

本連載はPowerShellの連載ではないので詳しい説明は割愛する。PowerShellスクリプトについて知りたい場合には「【連載】PowerShell Core入門 - 基本コマンドの使い方 | TECH+(テックプラス)」などを参考にしていただければ幸いだ。

これで前準備となるPowerShellスクリプトの作成は完了だ。

ショートカットファイルの作成

次に作成したPowerShellスクリプトへのショートカットファイルを作成する。

ここで注意が必要だ。ショートカットファイルはショートカットキーを設定することができるが、それはデスクトップやスタートメニューのフォルダに配置されているショートカットファイルなど特定のフォルダに配置されたものに限られている。

デスクトップにずっとショートカットファイルを置くのは邪魔なので、ここではスタートメニューフォルダにショートカットファイルを作成することにする。

まず、「ファイル名を指定して実行」ダイアログを起動する。

  • 「ファイル名を指定して実行」ダイアログを起動

    「ファイル名を指定して実行」ダイアログを起動

名前に「%appdata%\Microsoft\Windows\Start Menu\Programs」と入力して「OK」をクリックする。

  • 名前に「%appdata%\Microsoft\Windows\Start Menu\Programs」と入力して「OK」をクリック

    名前に「%appdata%\Microsoft\Windows\Start Menu\Programs」と入力して「OK」をクリック

ファイルエクスプローラーが起動してスタートメニューフォルダを閲覧している状態になる。このフォルダでマウスの右クリックから[新規作成]>[ショートカット]を選択する。

  • スタートメニューフォルダーでショートカットを作成

    スタートメニューフォルダーでショートカットを作成

「ショートカットの作成」のダイアログの「項目の場所を入力してください」のフィールドに「powershell.exe -ExecutionPolicy Bypass -File C:\path\to\gen_abst.ps1」のようにPowerShellスクリプトを実行するコマンドを入力する。C:\path\to\gen_abst.ps1は先程作成したPowerShellスクリプトのパスに置き換えてもらえればと思う。

  • ショートカット先としてPowerShellスクリプトの実行を指定

    ショートカット先としてPowerShellスクリプトの実行を指定

ショートカットに分かりやすい名前をつけて「完了」する。

  • ショートカットに名前をつけて「完了」をクリック

    ショートカットに名前をつけて「完了」をクリック

ショートカットキーを設定

作成したショートカットファイルのプロパティを開く。

  • ショートカットファイルのプロパティ

    ショートカットファイルのプロパティ

上記スクリーンショットのようにショートカットキーが「なし」に設定されている。このフィールドにフォーカスを移し、使いたいショートカットキーを入力する。

  • Ctrl+Shift+2のショートカットキーを設定

    Ctrl+Shift+2のショートカットキーを設定

上記スクリーンショットではCtrl+Shift+2をショートカットキーとして設定している。これでCtrl+Shift+2を押したら作成したPowerShellスクリプトが実行されることになる。

実行して動作確認

早速動作を確認する。まず、要約を生成させたいWebページをWebブラウザで表示する。

  • 要約を生成したいWebページを表示

    要約を生成したいWebページを表示

この状態で設定したCtrl+Shift+2を押し、マウスで対象のWebブラウザをクリックする。

自動的にURLのコピー処理とCopilot in Windowsパネルの表示およびプロンプトへ指示を送る処理が行われる。

  • ショートカットキー経由で動作したCopilot in Windows

    ショートカットキー経由で動作したCopilot in Windows

このようにショートカットキー経由でCopilotのプロンプトに指示を出して自動処理をさせることができる。

作り込めばもっと便利になる

今回の方法は目的の動作をするPowerShellスクリプトを組めるかどうかが成功の可否を分けることにつながる。生成AIが存在している現在であれば、ある程度プログラミングの能力があればこれはそれほど難しい作業ではないが、プログラミングの経験がない場合にはかなり厳しいかもしれない。

前回の方法よりも敷居は高くなるものの、PowerShellスクリプトはPower Automateよりもさまざまなことを実現できる。今回作成したスクリプトはあくまでも動作を紹介するものなので荒削りなつくりになっているが、常用するのであればここからつくり込んでいくことでさらに便利にすることができる。

Copilotの活用に注力するために、Copilotを使うまでの処理を自動化していく。これはロジカルな戦術のように思える。WindowsはPowerShellを使うことでさまざまな操作を行うことができるので、興味があれば試してみてもらえればと思う。

付録: ショートカットキー

ショートカットキー 内容
「Windows」+「C」 Copilot in Windowsの表示・非表示を切り替え
「Ctrl」+「Shift」+「.」(Microsoft Edge) Copilotパネルの表示・非表示を切り替え

付録: 対応バージョン

OS バージョン
Windows 11 Windows 11, version 22H2以降
Windows 10 Windows 10, version 22H2以降のProおよびHome

参考