Vb.net 为文本框实现提示横幅

Vb.net 为文本框实现提示横幅,vb.net,visual-studio-2010,Vb.net,Visual Studio 2010,我在互联网上找到了以下代码: 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 C

我在互联网上找到了以下代码:

 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
有人知道如何实现工作提示横幅,或者如何修复此错误吗?

您有:

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
    ...
    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 Module
您的错误很可能是由于
模块cuebanerText
中的
专用子表单1\u加载…
造成的。由于在
类Form1
中有它,因此模块中不需要它,因此请删除它

编辑:

还有,你有

<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
_
私有函数SendMessage(ByVal hWnd作为IntPtr,ByVal msg作为Integer,ByVal wParam作为Integer,ByVal lParam作为String)作为Int32
端函数

…它不需要
结束函数

我刚刚将您的代码粘贴到VS中,它可以正常工作,但有两件事您应该注意。VB.net不关心变量的大小写,因为它不区分大小写,因此
control
control
相同,另一件事是根据

从链接:

设置编辑控件显示的文本提示或提示,以提示用户输入信息

参数 wParam[in]
如果提示横幅即使在编辑控件具有焦点时也应显示,则为TRUE;否则为FALSE。
FALSE是默认行为,用户单击控件时提示横幅消失

lParam[in]
指向包含要显示为文本提示的文本的Unicode字符串的指针

如果您注意到我用粗体显示的部分,它表示当用户单击控件时,它将消失,即控件具有焦点。如果你的测试程序中只有一个项目可以获得关注,你将永远看不到提示

我的工作代码:

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
导入System.Runtime.InteropServices
公开课表格1
私有子表单1_Load(发送方作为System.Object,e作为System.EventArgs)处理MyBase.Load
SetCueText(TextBox1,“在此处输入名称”)
端接头
末级
公共模块CueBanerText
_
私有函数SendMessage(ByVal hWnd作为IntPtr,ByVal msg作为Integer,ByVal wParam作为Integer,ByVal lParam作为String)作为Int32
端函数
私有声明函数FindWindowEx Lib“user32”别名“FindWindowExA”(ByVal hWnd1作为IntPtr,ByVal hWnd2作为IntPtr,ByVal lpsz1作为String,ByVal lpsz2作为String)作为IntPtr
私有常量EM_SETCUEBANNER为整数=&H1501
公共子SetCueText(cntrl作为控件,文本作为字符串)
如果cntrl的类型为组合框,则
Dim Edit_hWnd As IntPtr=FindWindowEx(cntrl.Handle,IntPtr.Zero,“Edit”,Nothing)
如果不编辑_hWnd=IntPtr.Zero,则
SendMessage(编辑\u hWnd,EM\u SETCUEBANNER,0,文本)
如果结束
如果cntrl的类型为文本框
SendMessage(cntrl.Handle,EM_SETCUEBANNER,0,文本)
如果结束
端接头
端模块

您好,发布问题时出现了错误,我的代码如您所建议的,但是文本框不显示提示横幅。我已经更新了我的原始代码以反映这一点。-这些错误导致删除终端功能。我在internet上找到了以下代码。我已经测试了这些代码,它适合我。看起来您使用的是vb版本的。你应该阅读对这个答案的评论,并看看这篇文章中的其他备选方案。提示横幅、水印、提示文本或占位符文本的可能重复都是相同的。请看这篇文章-
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