|
■No82772 (ちょんも さん) に返信 > Buttonsの設定ではフォーカスが移動するのみでタブの表示は切り替わらないため、 相手は「ボタン」なので、普通の Button や CheckBox と同様に、 Space キーを入力するなどの追加操作が必要ですね。
> タブページ(ボタン形式)の移動(フォーカス遷移)のイベントを検知して
遷移検知は TCN_FOCUSCHANGE を捕らえればいけました。
しかし肝心の、ボタンを「押されたことにする」方法が SendKeys.SendWait(" ") ぐらいしか思いつきませんでした。
SendKeys 無しで実装するとなると、 力技になりますが、こんな感じでしょうか。
Imports System.Runtime.InteropServices Imports System.Reflection
Public Class TabControlEx Inherits TabControl Private WmSelChange As Func(Of Boolean) Public Sub New() Dim bf = BindingFlags.Instance Or BindingFlags.NonPublic Dim m = GetType(TabControl).GetMethod("WmSelChange", bf) WmSelChange = Function() CBool(m.Invoke(Me, Nothing)) End Sub Protected Overrides Sub WndProc(ByRef m As Message) Const WM_NOTIFY As Integer = &H4E Const WM_REFLECT As Integer = &H2000 Select Case m.Msg Case WM_REFLECT + WM_NOTIFY, WM_NOTIFY Const TCN_FOCUSCHANGE As Integer = -554 If TCN_FOCUSCHANGE = Marshal.ReadInt32(m.LParam, 2 * IntPtr.Size) Then MyBase.WndProc(m) Const TCM_GETCURFOCUS As Integer = &H132F Dim m2 = Message.Create(Handle, TCM_GETCURFOCUS, IntPtr.Zero, IntPtr.Zero) MyBase.WndProc(m2) Dim index = m2.Result Const TCM_SETCURSEL As Integer = &H130C Dim m3 = Message.Create(Handle, TCM_SETCURSEL, index, IntPtr.Zero) MyBase.WndProc(m3) WmSelChange() Return End If End Select MyBase.WndProc(m) End Sub End Class
|