はじめに
これはVisual Basic Advent Calendar 2018の25日目の記事となります。
もともと WinForms に 標準(IE)のWebブラウザーコントロールを作成したアプリケーションは、バーコードリーダーを使用してバーコードを入力するタイプのものです。
よって、サイトを表示した段階で入力項目にフォーカスがあり入力できる状態になっている必要があります。
フォーカスのセット
読込完了イベントにて、_webBrowser.Focus() としてフォーカスがセットするようにします。
UIスレッドなので Invoke メソッドを使用しています。
Private Sub OnLoadingStateChanged(sender As Object, e As LoadingStateChangedEventArgs)
If Not e.IsLoading Then
Invoke(New MethodInvoker(
Sub()
_webBrowser.Focus()
End Sub))
private void OnLoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
if (!e.IsLoading)
{
this.Invoke((MethodInvoker)delegate { _webBrowser.Focus(); });
お仕事で作成したものは、_webBrowser.Focus() では何故かフォーカスがセットされなかったため、Win32 APIのSetFocusを使用しました。
Private Declare Function SetFocus Lib "user32.dll" (ByVal hwnd As IntPtr) As IntPtr
SetFocus(_webBrowser.Handle)
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetFocus(IntPtr hWnd);
SetFocus(_webBrowser.Handle);
キー押下の処理
バーコードリーダーで自動でEnterキーがセットされようにしているので、その際にイベントが動作するようにしたい。
IEのWebブラウザコンポーネントにあった previewkeydown イベントの代わりですね。
それには、KeyboardHandleクラスを定義する必要があります。
- How to implement keyboard handler cefSharp for shortcut keys - stackoverflow
- cefsharp 实现 谷歌 F12 右键Focus 功能
- NativeHost.cs
' キーイベント処理登録
_webBrowser.KeyboardHandler = New KeyboardHandler(Me)
Public Sub OnMyPreviewKeyDown(ByVal windowsKeyCode As Integer, ByVal modifiers As CefEventFlags)
If windowsKeyCode <> CInt(Keys.[Return]) Then Return
' Enterキー押下時の処理を記述する。
MessageBox.Show("KeyDown")
End Sub
' KeyboardHandleクラス
Public Class KeyboardHandler
Implements IKeyboardHandler
Private _frm As frmMain
Public Sub New(ByVal frm As frmMain)
_frm = frm
End Sub
Private Function OnPreKeyEvent(chromiumWebBrowser As IWebBrowser, browser As IBrowser, type As KeyType, windowsKeyCode As Integer, nativeKeyCode As Integer, modifiers As CefEventFlags, isSystemKey As Boolean, ByRef isKeyboardShortcut As Boolean) As Boolean Implements IKeyboardHandler.OnPreKeyEvent
Return False
End Function
Private Function OnKeyEvent(chromiumWebBrowser As IWebBrowser, browser As IBrowser, type As KeyType, windowsKeyCode As Integer, nativeKeyCode As Integer, modifiers As CefEventFlags, isSystemKey As Boolean) As Boolean Implements IKeyboardHandler.OnKeyEvent
_frm.OnMyPreviewKeyDown(windowsKeyCode, modifiers)
Return False
End Function
End Class
// キーイベント処理登録
_webBrowser.KeyboardHandler = new KeyboardHandler(this);
public void OnMyPreviewKeyDown(int windowsKeyCode, CefEventFlags modifiers)
{
if (windowsKeyCode != (int)Keys.Return) return;
// Enterキー押下時の処理を記述する。
MessageBox.Show("KeyDown")
}
// KeyboardHandleクラス
public class KeyboardHandler : IKeyboardHandler
{
private frmMain _frm;
public KeyboardHandler(frmMain frm)
{
_frm = frm;
}
public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
{
return false;
}
public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
{
_frm.OnMyPreviewKeyDown(windowsKeyCode, modifiers);
return false;
}
}
Enterキーを押すとメッセージボックスを表示します。
最後に
Visual Basic Advent Calendar 2018の最後の記事でした。
参加して頂いた皆様ありがとうございます。