C 言語ファミリをルーツとし、コンポーネント指向プログラミングのサポートを含む、オブジェクト指向およびタイプセーフのプログラミング言語。
Windows 11 では想定された動作です:タッチ(ポインター)でのタップは、SetStyle(ControlStyles.Selectable, false) を呼び出していても Button にフォーカスを移します。このスタイルはキーボード(Tab/ショートカット)による選択を無効化するだけで、ポインターによるフォーカスはブロックしません。Windows 10 では WebView2 がフォーカスを保持しているように見えましたが、それは偶然で保証された動作ではありません。
Button がフォーカスを取ると、WebView2 はキャレットを失い、合成キーイベント(keybd_event 経由)がページに届かなくなります。
重要なポイント:
-
ControlStyles.Selectable = falseはマウスやタッチクリックによるフォーカスを防ぎません。 - Windows 11 のタッチ入力は、タップされたコントロールにより一貫してフォーカスを移します。
-
keybd_eventは非推奨です。WebView2 のスクリプトを使えば完全に回避できます。
推奨解決策(ニーズに合う最も簡単なものを選択):
1. Button のクリックハンドラで WebView2 に再フォーカスしてから入力を送信(最も簡単)
private async void notSelectableButton1_Click(object sender, EventArgs e)
{
webView21.Focus(); // ページにフォーカス/キャレットを戻す
// 低レベルのキーイベントではなく文字を直接挿入:
await webView21.CoreWebView2.ExecuteScriptAsync(
"document.activeElement && (document.activeElement.value += '1');");
}
(OSレベルのキー入力が本当に必要なら、webView21.Focus() を先に呼び、keybd_event ではなく SendInput を使用してください。)
2. Button の代わりに非フォーカスな代替コントロールを使用
Button を Label や PictureBox に置き換え、ボタン風にスタイル設定(BackColor、BorderStyle、Cursor)。これらのコントロールは通常タッチでフォーカスを取らないため、WebView2 はキャレットを保持します。
3. Button を使い続けるが、すぐにフォーカスを戻す
class NotSelectableButton : Button
{
protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
var web = FindForm()?.Controls
.OfType<Microsoft.Web.WebView2.WinForms.WebView2>()
.FirstOrDefault();
web?.Focus();
}
}
これにより、Button のアクセシビリティを維持しつつ、タップ後にフォーカスを「保持」しないようにできます。
お役に立てれば幸いです