Posted at

WinFormsでChromiumブラウザコンポーネント(CefSharp)を使ってみる その3


はじめに

これはVisual Basic Advent Calendar 2018の25日目の記事となります。

もともと WinForms に 標準(IE)のWebブラウザーコントロールを作成したアプリケーションは、バーコードリーダーを使用してバーコードを入力するタイプのものです。

よって、サイトを表示した段階で入力項目にフォーカスがあり入力できる状態になっている必要があります。


フォーカスのセット

初期表示時にはフォーカスがセットされていない。

cefsharpFocusOff.png

読込完了イベントにて、_webBrowser.Focus() としてフォーカスがセットするようにします。

UIスレッドなので Invoke メソッドを使用しています。


VB版

Private Sub OnLoadingStateChanged(sender As Object, e As LoadingStateChangedEventArgs)

If Not e.IsLoading Then
Invoke(New MethodInvoker(
Sub()
_webBrowser.Focus()
End Sub))



C#版

private void OnLoadingStateChanged(object sender, LoadingStateChangedEventArgs e)

{
if (!e.IsLoading)
{
this.Invoke((MethodInvoker)delegate { _webBrowser.Focus(); });


お仕事で作成したものは、_webBrowser.Focus() では何故かフォーカスがセットされなかったため、Win32 APIのSetFocusを使用しました。


VB版

Private Declare Function SetFocus Lib "user32.dll" (ByVal hwnd As IntPtr) As IntPtr

SetFocus(_webBrowser.Handle)



C#版

[DllImport("user32.dll", SetLastError = true)]

static extern IntPtr SetFocus(IntPtr hWnd);

SetFocus(_webBrowser.Handle);


フォーカスがセットされて入力可能になります。

cefsharpFocusOn.png


キー押下の処理

バーコードリーダーで自動でEnterキーがセットされようにしているので、その際にイベントが動作するようにしたい。

IEのWebブラウザコンポーネントにあった previewkeydown イベントの代わりですね。

それには、KeyboardHandleクラスを定義する必要があります。


VB版

' キーイベント処理登録

_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



C#版

// キーイベント処理登録

_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キーを押すとメッセージボックスを表示します。

cefsharpKeyDown.png


最後に

Visual Basic Advent Calendar 2018の最後の記事でした。

参加して頂いた皆様ありがとうございます。