C#を使って指定のキーワードでブラウザを開き、Google検索を行うコードを記載します。
自作ツールに「このワードでそのまま検索したい」というボタンを付けたいことがあります。たとえばエラーメッセージをそのまま検索したいときや、リストで選んだ商品名・型番をすぐ調べたいときです。ソフトから自動で既定のブラウザを開き、検索結果を表示するところまでやります。
結論のコード
using System.Diagnostics;
public void GoogleSearch(string keyword)
{
string searchUrl = "https://www.google.com/search?q=" + Uri.EscapeDataString(keyword);
Process.Start(new ProcessStartInfo(searchUrl));
}
呼び出し側はこれだけです。
GoogleSearch("C# ブラウザ 開く");
実行すると、Windows に設定されている既定のブラウザ(Edge や Chrome など)が起動し、検索結果ページが表示されます。私はこのコードを .NET Framework のデスクトップアプリで使っていて、これで問題なく動いていました。
追記:.NET 5以降で使うなら UseShellExecute を指定すべき
上のコードは .NET Framework では動きますが、.NET Core / .NET 5 以降(.NET 6, .NET 8 など)に持っていく場合は注意が必要です。同じ書き方では動かず、Win32Exception(指定されたファイルが見つかりません)が発生するとされています。
最近の .NET では、次のように UseShellExecute = true を明示するのが正しい書き方です。
Process.Start(new ProcessStartInfo(searchUrl) { UseShellExecute = true });
動かなくなる理由は、Process.Start の既定値が変わったためです。
- .NET Framework:
UseShellExecuteの既定値はtrue - .NET Core / .NET 5 以降: 既定値が
falseに変更された
UseShellExecute が true のときは Windows のシェル(エクスプローラーでダブルクリックしたときと同じ仕組み)経由で起動するため、URL を渡すと「既定のブラウザで開く」という関連付けが働きます。false のときは exe ファイルを直接起動しようとするため、URL は「そんなファイルはない」と怒られてしまうわけです。
UseShellExecute = true を明示する書き方なら .NET Framework でも新しい .NET でも同じ意味になるので、これから書くコードはこちらに統一しておくのが安全です。
日本語キーワード対策:Uri.EscapeDataString
もうひとつ地味に大事なのが Uri.EscapeDataString です。
Google 検索の URL は https://www.google.com/search?q=キーワード という形式ですが、キーワードに日本語・スペース・& や # などの記号がそのまま入っていると、URL として正しく解釈されません。
Uri.EscapeDataString("C# 配列 コピー")
// → "C%23%20%E9%85%8D%E5%88%97%20%E3%82%B3%E3%83%94%E3%83%BC"
このように URL エンコードしてから連結することで、日本語もスペース入りの複数キーワードも安全に渡せます。特に C# の # はエンコードしないと # 以降が URL のフラグメント扱いになって消えてしまうので、C# の記事を検索するツールでは必須です(笑)
応用:検索エンジンを切り替える
URL の形式を変えれば、Google 以外の検索にもそのまま使えます。
// Bing で検索
string bingUrl = "https://www.bing.com/search?q=" + Uri.EscapeDataString(keyword);
// Google 画像検索
string imageUrl = "https://www.google.com/search?tbm=isch&q=" + Uri.EscapeDataString(keyword);
検索エンジン部分を設定ファイルに持たせておけば、ユーザーが好みの検索エンジンを選べるツールにもできます。
まとめ
- C# からブラウザで Google 検索するには
Process.Start+ProcessStartInfoを使う(.NET Framework では冒頭のコードで動作) - .NET Core / .NET 5 以降に持っていくなら
UseShellExecute = trueの明示が必要(最重要) - キーワードは
Uri.EscapeDataStringでエンコードしてから URL に連結する
3行のメソッドですが、UseShellExecute の既定値の違いは知らないとハマりやすいポイントです。同じところで詰まった方の参考になれば幸いです。