WinForms에서 Chromium 브라우저 구성 요소 (CefSharp)를 사용해보십시오.
소개
이것은 Visual Basic Advent Calendar 2018의 25 일째 기사입니다.
원래 WinForms 에 표준(IE)의 웹 브라우저 컨트롤을 작성한 어플리케이션은, 바코드 리더를 사용해 바코드를 입력하는 타입의 것입니다.
따라서 사이트를 표시한 단계에서 입력 항목에 포커스가 있어 입력할 수 있는 상태여야 합니다.
포커스 세트
초기 표시시에는 포커스가 설정되어 있지 않습니다.
읽기 완료 이벤트에서, _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);
포커스가 설정되어 입력 가능합니다.
키 누름 처리
바코드 리더로 자동으로 Enter 키가 세트되도록 하고 있으므로, 그 때에 이벤트가 동작하도록(듯이) 하고 싶다.
IE의 웹 브라우저 구성 요소에 있던 previewkeydown 이벤트 대신입니다.
이를 위해서는 KeyboardHandle 클래스를 정의해야 합니다.
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(); });
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의 웹 브라우저 구성 요소에 있던 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 키를 누르면 메시지 상자가 표시됩니다.
마지막으로
Visual Basic Advent Calendar 2018의 마지막 기사였습니다.
참가해 주신 여러분 감사합니다.
Reference
이 문제에 관하여(WinForms에서 Chromium 브라우저 구성 요소 (CefSharp)를 사용해보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yaju/items/b2c64f364efd3e347359
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(WinForms에서 Chromium 브라우저 구성 요소 (CefSharp)를 사용해보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yaju/items/b2c64f364efd3e347359텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)