1

インターネットで次のコードを見つけました。

 Imports System.Runtime.InteropServices

Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    SetCueText(TextBox1, "Enter Name here")
End Sub

End Class

Module CueBannerText
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer,       <MarshalAs(UnmanagedType.LPWStr)> ByVal lParam As String) As Int32
End Function
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
Private Const EM_SETCUEBANNER As Integer = &H1501

Public Sub SetCueText(ByVal control As Control, ByVal text As String)
    If TypeOf control Is ComboBox Then
        Dim Edit_hWnd As IntPtr = FindWindowEx(control.Handle, IntPtr.Zero, "Edit", Nothing)
        If Not Edit_hWnd = IntPtr.Zero Then
            SendMessage(Edit_hWnd, EM_SETCUEBANNER, 0, text)
        End If
    ElseIf TypeOf control Is TextBox Then
        SendMessage(control.Handle, EM_SETCUEBANNER, 0, text)
    End If
End Sub
End Module

ただし、次のエラーが表示されます。

'Handles' in modules must specify a 'WithEvents' variable qualified with a single identifier.

機能するキュー バナーを実装する方法、またはこのエラーを修正する方法を知っている人はいますか?

4

2 に答える 2

2

コードを VS に貼り付けたところ、動作しましたが、注意すべき点が 2 つあります。VB.net は、変数の大文字と小文字を区別しないため、変数の大文字と小文字を気にしません。したがってcontrol、と同じでControlあり、その他のことは、MSDN ページの EM_SETCUEBANNERによるものです。

リンクから:

ユーザーに情報を求めるために編集コントロールによって表示されるテキスト キューまたはヒントを設定します。

パラメータ wParam [in]
エディット コントロールにフォーカスがある場合でもキュー バナーを表示する場合は TRUE。それ以外の場合は FALSE。
デフォルトの動作は FALSE です。ユーザーがコントロールをクリックすると、キュー バナーが消えます

lParam [in]
テキスト キューとして表示するテキストを含む Unicode 文字列へのポインター。

太字で示した部分に注目すると、ユーザーがコントロールをクリックすると消えます。つまり、コントロールにフォーカスがあることを示しています。テスト プログラムにフォーカスを受け取ることができるアイテムが 1 つしかない場合、キューは表示されません。

私の作業コード:

Imports System.Runtime.InteropServices

Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       SetCueText(TextBox1, "Enter Name here")
    End Sub
End Class

Public Module CueBannerText
    <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
    Private Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, <MarshalAs(UnmanagedType.LPWStr)> ByVal lParam As String) As Int32
    End Function
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
    Private Const EM_SETCUEBANNER As Integer = &H1501


    Public Sub SetCueText(cntrl As Control, text As String)
       If TypeOf cntrl Is ComboBox Then
            Dim Edit_hWnd As IntPtr = FindWindowEx(cntrl.Handle, IntPtr.Zero, "Edit", Nothing)
            If Not Edit_hWnd = IntPtr.Zero Then
                SendMessage(Edit_hWnd, EM_SETCUEBANNER, 0, text)
            End If
        ElseIf TypeOf cntrl Is TextBox Then
            SendMessage(cntrl.Handle, EM_SETCUEBANNER, 0, text)
        End If
    End Sub
End Module
于 2013-09-01T23:56:42.517 に答える