URLのオートコンプリート機能を付ける

注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。

SHAutoCompleteを使うと、テキスト入力部を持つコントロールにURLのオートコンプリート機能を付けることができる。 SHAutoCompleteにオートコンプリート機能を持たせたいコントロールのハンドルと動作を決めるフラグを渡すだけでオートコンプリート機能が有効になる。 ただし、ComboBoxの場合はこの方法ではうまく動作しないので、ここではComboBoxコントロールにURLのオートコンプリート機能を付ける方法を紹介する。

ソースコード
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
''' <summary>
''' オートコンプリート機能を持ったコンボボックス
''' </summary>
Public Class AutoCompleteComboBox

    Inherits System.Windows.Forms.ComboBox

    <DllImport("user32.dll")> _
    Private Shared Function FindWindowEx( _
        ByVal hWndParent As IntPtr, _
        ByVal hwndChildAfter As IntPtr, _
        ByVal lpszClass As String, _
        ByVal lpszWindow As String) _
        As IntPtr
    End Function

    <DllImport("shlwapi.dll")> _
    Private Shared Function SHAutoComplete( _
        ByVal hwndEdit As IntPtr, _
        ByVal dwFlags As SHAutoCompleteFlags) _
        As Integer
    End Function

    <Flags()> _
    Private Enum SHAutoCompleteFlags As Integer

        SHACF_DEFAULT = &H0
        SHACF_FILESYSTEM = &H1
        SHACF_URLALL = SHACF_URLHISTORY Or SHACF_URLMRU
        SHACF_URLHISTORY = &H2
        SHACF_URLMRU = &H4
        SHACF_USETAB = &H8
        SHACF_FILESYS_ONLY = &H10
        SHACF_AUTOSUGGEST_FORCE_ON = &H10000000
        SHACF_AUTOSUGGEST_FORCE_OFF = &H20000000
        SHACF_AUTOAPPEND_FORCE_ON = &H40000000
        SHACF_AUTOAPPEND_FORCE_OFF = &H80000000

    End Enum

    Protected Overrides Sub OnHandleCreated(ByVal e As EventArgs)

        Dim hWndEdit As IntPtr = FindWindowEx(Me.Handle, IntPtr.Zero, "EDIT", Nothing)

        ' オートコンプリートを有効にする
        If Not IntPtr.Zero.Equals(hWndEdit) Then SHAutoComplete(hWndEdit, SHAutoCompleteFlags.SHACF_URLALL)

        MyBase.OnHandleCreated(e)

    End Sub

End Class

このコードでは、OnHandleCreated()メソッドをオーバーライドし、ハンドルが作成された時点でSHAutoCompleteを呼び出している。 ここで、オートコンプリート機能を適用するためのウィンドウハンドルは直接ComboBox.Handleを使うのではなく、ComboBoxの中にある「EDIT」というクラス名を持つウィンドウハンドルを用いる。