例えばタブブラウザを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
BrowserEmulation.CreateRenderingModeRegkey(BrowserEmulation.Emulation.IE11Edge)
Me.WebBrowser1.Dock = DockStyle.Fill
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