3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Visual BasicAdvent Calendar 2018

Day 25

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

Posted at

はじめに

これは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の最後の記事でした。
参加して頂いた皆様ありがとうございます。

3
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?