Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。
Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。
1Imports System.Runtime.InteropServices
2Imports System.Windows.Forms
3Imports System.Text
45Public Class Combobox4KB814362
6 Inherits ComboBox
78 Const GCS_RESULTSTR As Integer = &H800 '最終変換結果文字列を取得
9 Const WM_IME_COMPOSITION As Integer = &H10F '文字列が確定されたとき他
1011 Declare Auto Function ImmGetContext Lib "imm32.dll" (ByVal hWnd As IntPtr) As IntPtr
12 Declare Auto Function ImmReleaseContext Lib "imm32.dll" (ByVal hWnd As IntPtr, ByVal hIMC As IntPtr) As Integer
13 Declare Auto Function ImmGetCompositionString Lib "imm32.dll" (ByVal hIMC As IntPtr,
14 ByVal dwIndex As Integer, ByVal lpBuf As StringBuilder, ByVal dwBufLen As Integer) As Integer
1516 Private Shared Function GetCompositionString(hIMC As IntPtr) As String
17 Dim bufferSB As New StringBuilder(0)
18 Dim length As Integer = ImmGetCompositionString(hIMC, GCS_RESULTSTR, bufferSB, 0)
19 bufferSB.Length = CInt(length / Len(New Char))
20 length = ImmGetCompositionString(hIMC, GCS_RESULTSTR, bufferSB, length)
21 Return bufferSB.ToString(0, CInt(length / Len(New Char)))
22 End Function
2324 Enum CTRL_STATE As Integer
25 IDLING
26 DROPDOWN_CATCH
27 SELECTEDINDEXCHANGED_CATCH
28 End Enum
2930 Private Property mySTATE As CTRL_STATE = CTRL_STATE.IDLING
31 Private Property myBackupIMMString As String = ""
3233 Protected Overrides Sub WndProc(ByRef m As Message)
34 If m.Msg = WM_IME_COMPOSITION AndAlso (CInt(m.LParam) And GCS_RESULTSTR) = GCS_RESULTSTR Then
35 Dim hIMC As IntPtr = ImmGetContext(Me.Handle)
36 myBackupIMMString = GetCompositionString(hIMC)
37 ImmReleaseContext(Me.Handle, hIMC)
38 End If
39 MyBase.WndProc(m)
40 End Sub
41 Protected Sub ComboBox2_DropDown(sender As Object, e As EventArgs) Handles Me.DropDown
42 mySTATE = CTRL_STATE.DROPDOWN_CATCH
43 End Sub
44 Protected Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Me.SelectedIndexChanged
45 mySTATE = CTRL_STATE.SELECTEDINDEXCHANGED_CATCH
46 End Sub
47 Protected Sub ComboBox2_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
48 If mySTATE <> CTRL_STATE.SELECTEDINDEXCHANGED_CATCH Then
49 Me.SelectedIndex = FindString(myBackupIMMString, Me.SelectedIndex)
50 End If
51 mySTATE = CTRL_STATE.IDLING
52 End Sub
53End Class
54
詳細な回答ありがとうございます。
提示いただいたソースのうち、KeyUpイベント部分を一部変更することでうまくいきました。
(1)KeyUp→KeyPressに変更(KeyUpだとCtrl、Alt等の修飾キーも取ってきてしまうため)
(2)FindString()関数で一致する項目が見つかるかどうか事前にチェック実施
(アイテム選択済(SelectedIndex<>-1)の状態でリストに該当しない文字(数字等)入力した際に未選択の状態(SelectedIndex=-1)に戻ってしまうので、標準のComboBoxと同様、SelectedIndexは変えずにリストが出る形となるようにしました)
Protected Sub ComboBox2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress
If mySTATE <> CTRL_STATE.SELECTEDINDEXCHANGED_CATCH Then
If FindString(myBackupIMMString, Me.SelectedIndex) <> -1 Then '(2)
Me.SelectedIndex = FindString(myBackupIMMString, Me.SelectedIndex)
End If
End If
mySTATE = CTRL_STATE.IDLING
End Sub
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/15 15:18 編集
2021/03/15 22:34