質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1758閲覧

webbrowserのショートカットキーのイベント強制発火

BeatStar

総合スコア4958

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

0クリップ

投稿2020/11/10 06:59

概要: (C#で) Form上にあるメニューまたはToolStripから、WebBrowserのショートカットキーによるイベントを 強制的に発火させたい( つまり間接的に発火させる方法 )

趣味でプログラミングをしています。

基本的にはC++でやっているのですが、簡易的なウェブブラウザを作ってみたいと思っています。
C#でなら簡単に作れると知り、自分なりに試行錯誤して、作っています。
(ただし、csc.exeで直接コンパイルする方法で。VC#は使わない方向で)

まず、メインフォームを用意し、そこにWebBrowserオブジェクトやToolStrip等を貼り付けています。
この簡易ブラウザに『サイト内検索』を追加したいのです。

WebBrowser自体が、Ctrl + F で『検索』ができるのはわかるのですが、
これだと『一般の方』が使えないですよね。(私はこれを作るまで知らなかったので…)

できれば、ToolStripもしくはメニューのやつを選択すると Ctrl + F でやったときのような
ダイアログ表示 + 色付け (検索結果の反転?) したいのです。

WebBrowserオブジェクトのメンバを一通り見ていると、OnKeyDownメソッドなるものを発見し、
これを使えば行けそうじゃないかなと思い、試してみました。

(以下はC#のコード. ただし、字数制限のため、一部のみ)

C#

1using System; 2using System.Drawing; 3using System.Windows.Forms; 4using System.Collections.Generic; 5 6using Resources; 7using ExtendedWebBrowsers; 8 9 10namespace SimpleWebBrowser{ 11 class EntryPoint{ 12 [STAThread] 13 static void Main( string[] args ){ 14 try{ 15 // コマンドライン引数の処理 16 ArgumentsEx argumentsEx = createArgumentsExObject( args ); 17 // メインウィンドウの生成と初期化 18 MainForm mainForm = new MainForm( argumentsEx ); 19 Application.Run( mainForm ); 20 }catch( System.Exception err ){ 21 MessageBox.Show( err.Message, "例外発生" ); 22 } 23 } 24 25 // コマンドライン引数の処理とオブジェクト生成 26 static ArgumentsEx createArgumentsExObject( string[] args ){ 27 // ここでコマンドライン引数を処理する. ちゃんと変数の宣言等はされているとする. 28 return new ArgumentsEx( w, h, defaultPage, iconPath, usingAsHelpFile, allow2ControlScriptError ); 29 } 30 31 // コマンドライン引数を省略形でも可能にするための配列生成 32 static string[] createStringArray( string arg1, string arg2 ){ 33 string[] s = new string[2]; 34 s[0] = arg1; 35 s[1] = arg2; 36 return s; 37 } 38 } 39 40 // コマンドライン引数を保持するクラスオブジェクト 41 public class ArgumentsEx{ 42 // メンバを持っているとする 43 } 44 45 abstract class CommonForm : Form{ 46 protected WebBrowser2 webBrowser1; 47 protected ToolStrip toolStrip1; 48 protected ToolStripButton prevToolStripButton; 49 protected ToolStripButton homeToolStripButton; 50 protected ToolStripButton nextToolStripButton; 51 protected ToolStripButton refreshToolStripButton; 52 protected ToolStripTextBox urlTextBoxToolStrip; 53 protected ToolStripButton searchToolStripButton; 54 55 protected ArgumentsEx argumentsEx_; 56 57 public CommonForm( ArgumentsEx argumentsEx ){ 58 59 this.argumentsEx_ = argumentsEx; 60 61 this.AllowDrop = true; 62 63 // このFormの描画を一時中断 64 this.SuspendLayout(); 65 66 // ツールバーとしてToolStripを生成 67 this.toolStrip1 = new ToolStrip(); 68 69 // ツールバーのレイアウトを一時的停止 70 this.toolStrip1.SuspendLayout(); 71 72 // ツールバーに追加するボタン(Home)の生成と初期化 73 this.homeToolStripButton = new ToolStripButton(); 74 this.homeToolStripButton.Text = "ホーム(&M)"; 75 this.homeToolStripButton.Image = ResourceHandler.getAssemblyImageResource( "toolstrip_home" ); 76 this.homeToolStripButton.ImageScaling = ToolStripItemImageScaling.None; 77 this.homeToolStripButton.DisplayStyle = ToolStripItemDisplayStyle.Image; 78 79 this.homeToolStripButton.Click += homeToolStripButton_Click; 80 81 // ツールバーに登録 82 this.toolStrip1.Items.Add( this.homeToolStripButton ); 83 84 // ウィンドウにツールバーを登録 85 this.Controls.Add( this.toolStrip1 ); 86 87 // ツールバーのレイアウト再開 88 this.toolStrip1.ResumeLayout(false); 89 this.toolStrip1.PerformLayout(); 90 91 // WebBrowser2コントロールの生成と初期化 92 webBrowser1 = new WebBrowser2(); 93 //webBrowser1.Dock = DockStyle.Bottom; 94 webBrowser1.Name = "webBrowser1"; // コントロールとしてフォーム上に追加 95 this.Controls.Add(webBrowser1); // Webページを表示 96 97 // Webbrowserのイベント登録 98 99 this.ResumeLayout(false); 100 this.PerformLayout(); 101 102 // フォーム自体のイベント設定 103 this.Closing += commonForm_Closing; 104 this.Resize += commonForm_Resize; 105 } 106 107 private void prevToolStripButton_Click( object sender, EventArgs e ){ 108 this.webBrowser1.GoBack(); 109 } 110 111 private void homeToolStripButton_Click( object sender, EventArgs e ){ 112 KeyEventArgs k = new KeyEventArgs( Keys.F | Keys.Control ); // <- ここでやっている。本来は別のところだが、 113 this.webBrowser1.OnKeyDown( k ); // サンプルのためにここでテスト。 114 //this.webBrowser1.Navigate( argumentsEx_.defaultPage() ); 115 } 116 117 // そのほかのメンバもあり 118 } 119 120 121 class MainForm : CommonForm{ 122 // 継承して独自の見栄え等を指定 123 } 124 125 class SubForm : CommonForm{ 126 // 継承して独自の見栄え等を指定 127 } 128}

homeToolStripButton_Clickメソッド (イベント) 内に書いていますが、
本来は別のイベント内に書く予定です。
(動かないとできないので、まずはテスト。)

WebBrowser2 はWebBrowser の拡張 - WebSurfer's Homeにあるコードをもとにやっています。(つまり WebBrowserを継承している)

すると、

main.cs(318,30): error CS1540: 'ExtendedWebBrowsers.WebBrowser2' 型の修飾子をとおして プロテクト メンバー 'System.Windows.Forms.Control.OnKeyDown(System.Windows.Forms.KeyEventArgs)' にアクセスすることはできません。修飾子は 'SimpleWebBrowser.CommonForm' 型、またはそれから派生したものでなければなりません。

とあり、定義を確認すると確かにprotectedだったので、エラー理由自体は理解できます。

そのため、WebBrowser2のほうに、

C#

1public void OnKeyDownEx( System.Windows.Forms.KeyEventArgs e ){ 2 base.OnKeyDown( e ); 3}

を追加し、呼び出し元の this.webBrowser1.OnKeyDown( e ); を OnKeyDownEx( e ); にしてみました。

するとコンパイルは通るのですが、いざ起動して試してみると、『無反応』でした。

やはり、自前でダイアログを用意して検索系の処理を追加するべきなのでしょうか。

できれば メニュー等で Alt + F をしたときに 間接的に webBrowser2に Ctrl + F のメッセージが送り付けられる
みたいな処理がしたいのですが…

[情報]
言語: C#
コンパイラ: csc.exe (VC#不使用)

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

手元(Visual Studio 2019)でざっと試したところ、これで出ましたがどうでしょう?

cs

1webBrowser1.Focus(); 2SendKeys.Send("^f");

参考
c# - Using browser search Ctrl+F through a button in user control - Stack Overflow

投稿2020/11/10 09:17

編集2023/07/23 09:40
TN8001

総合スコア9244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2020/11/10 10:55

あー、そっちかぁ…。 今、家族のPCからなので自分のPCでやるときに試してみます。 (おそらくこれかも…)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問