YAS's VB.NET Tips
 
VB.NET Tips
VB.NET Tips >> 記事詳細

2018/06/11

WebBrowserコントロールのキーボードショートカットをカスタマイズする

| by:YAS
 例えばタブブラウザをWebBrowserコントロールを利用して作成しても,キーボードショートカットCtrl-Nを押すとInternetExplorerが新しいウィンドウで開いてしまいます。これを新しいタブを開くなど別の処理をするように変更したいのですが,WebBrowserコントロールはKeyDown等のキー入力のイベントをサポートしていません。 
 そこでWebBrowser.WebBrowserSiteを継承し,IDocHostUIHandlerインターフェイスを独自に実装しようとしたが,どうしてもうまく機能しません。(MSHTMLからメソッドが呼ばれません。実装方法に問題があるのでしょうが,正しい方法がわかりません。)
 ショートカットキーの入力を検知し,さらにオリジナルの処理をキャンセルできるメソッドを探したところ,PreProcessMessageメソッドが見つかりました。
 下のサンプルはWebBrowserコントロールのショートカットキーCtrl-Nでメッセージボックスを表示し,Ctrl-Pで印刷プレビューを表示します。
 下のコードをフォームのコードにコピー・貼り付けをすれば動作します。
Option Explicit On
Option Strict On

Imports System.ComponentModel
Imports System.IO
Imports Microsoft.Win32

Public Class Form1

    
Dim WithEvents WebBrowser1 As New ExWebBrowser

    
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        
'WebBrowser1
        BrowserEmulation.CreateRenderingModeRegkey(BrowserEmulation.Emulation.IE11Edge)
        
Me.WebBrowser1.Dock = DockStyle.Fill
        
'Form1
        
Me.Controls.Add(Me.WebBrowser1)
        
'
        
Me.WebBrowser1.GoHome()
    
End Sub

    
Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        BrowserEmulation.DeleteRenderingModeRegkey()
    
End Sub

End Class

Public Class BrowserEmulation

    
Public Enum Emulation
        IE11Edge = 11001
        IE11 = 11000
        IE10Std = 10001
        IE10 = 10000
        IE9Std = 9999
        IE9 = 9000
        IE8Std = 8888
        IE8 = 8000
        IE7 = 7000
    
End Enum

    
Private Const FEATURE_BROWSER_EMULATION As String = "Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION"

    
Public Shared Sub CreateRenderingModeRegkey(EmulationMode As Emulation)
        
Using Regkey As RegistryKey = Registry.CurrentUser.CreateSubKey(FEATURE_BROWSER_EMULATION)
            Regkey.SetValue(GetReleaseBuildName, EmulationMode, RegistryValueKind.DWord)
            Regkey.SetValue(GetDebugBuildName, EmulationMode, RegistryValueKind.DWord)
        
End Using
    
End Sub

    
Public Shared Sub DeleteRenderingModeRegkey()
        
Using Regkey As RegistryKey = Registry.CurrentUser.CreateSubKey(FEATURE_BROWSER_EMULATION)
            Regkey.DeleteValue(GetReleaseBuildName)
            Regkey.DeleteValue(GetDebugBuildName)
        
End Using
    
End Sub

    
Private Shared Function GetReleaseBuildName() As String
        
Return Path.GetFileName(Application.ExecutablePath)
    
End Function

    
Private Shared Function GetDebugBuildName() As String
        
Return GetReleaseBuildName.Replace(".exe"".svhost.exe")
    
End Function

End Class

Public Class ExWebBrowser
    
Inherits WebBrowser

    
Sub New()
        
MyBase.New()
    
End Sub

    
'キーボードショートカットの処理を変更
    
Public Overrides Function PreProcessMessage(ByRef msg As System.Windows.Forms.Message) As Boolean
        
Const WM_KEYDOWN As Integer = &H100
        
If msg.Msg = WM_KEYDOWN Then
            
Dim keyCode As Keys = CType(msg.WParam, Keys) And Keys.KeyCode
            
If My.Computer.Keyboard.CtrlKeyDown Then
                
Select Case keyCode
                    
Case Keys.N
                        MessageBox.Show(
"Ctrl-Nが押されました""ショートカットキー", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        
Return True
                    
Case Keys.P
                        
Me.ShowPrintPreviewDialog()
                        
Return True
                
End Select
            
End If
        
End If
        
Return MyBase.PreProcessMessage(msg)
    
End Function

End Class


※このTipsは2005年頃にNiftyの@homepageで公開していたもの一部変更して再掲載しました。
 http://homepage1.nifty.com/yasunari/VB/VB2005/WebBrowserShortcuts.htm
22:05 | コメント(0) | WebBrowser
メニュー