防止文本框中的闪烁光标

时间:2009-03-02 04:16:22

标签: c# winforms textbox

在文本框中,如何在单击时阻止显示闪烁的光标?

我在一些论坛中读到过调用特定的api,但是当我在我的代码中尝试它时,显示错误。如果可能,请提供完整的代码,如果有特定事件需要执行代码,请告诉我。

此文本框是为LAN信使模拟创建的表单窗口的一部分。我正在使用C#。该表单有两个文本框,以便类似于谷歌谈话。希望防止在上部文本框上显示闪烁的光标。

我试过了:

[DllImport("user32")] 
private static extern bool HideCaret(IntPtr hWnd); 
public void HideCaret() { HideCaret(TextBox1.Handle); } 

我收到错误:“无法找到DllImport。”

8 个答案:

答案 0 :(得分:6)

如果您想禁止在文本框上进行编辑,请将其ReadOnly属性设置为true。

如果您想允许编辑但仍隐藏插入符,请完全调用Win32 API as specified

[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern bool HideCaret(IntPtr hWnd);

...

HideCaret(myTextBox.Handle);

答案 1 :(得分:3)

您好,请尝试使用此代码

public class CustomTextBox:System.Windows.Forms.TextBox
{
    [System.Runtime.InteropServices.DllImport("user32")]
    private static extern bool HideCaret(IntPtr hWnd);

    public CustomTextBox()
    {
        TabStop = false;

        MouseDown += new System.Windows.Forms.MouseEventHandler(CustomTextBox_MouseDown);
    }

    void CustomTextBox_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        HideCaret(this.Handle);
    }
}

答案 2 :(得分:2)

如果你将hideCaret函数放在Textchange事件中,这将解决问题。

    [DllImport("user32.dll")]
    static extern bool HideCaret(IntPtr hWnd);

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        HideCaret(textBox1.Handle);
    }

答案 3 :(得分:1)

我研究了如何在TextBox上模拟 Chrome的网址栏(部分),并从此处和one收集代码。

它工作正常,首先是Clic,选择所有文本而不显示闪烁的插入符号,诀窍是当你在所选文本上第二次Clic时使插入符号显示,这就是Chrome的Web地址栏的行为方式。 这是代码:

    [DllImport("user32.dll")]
    static extern bool HideCaret(IntPtr hWnd);

    private void textBox2_Enter(object sender, EventArgs e)
    {
        // Kick off SelectAll asyncronously so that it occurs after Click
        BeginInvoke((Action)delegate
        {
            HideCaret(textBox2.Handle); 
            textBox2.SelectAll();              
        });          
    }

答案 4 :(得分:0)

ReadOnly上的TextBox属性设置为true

此问题的更多答案:Read-only textbox in C#

答案 5 :(得分:0)

VB.NET代码

Imports System.Runtime.InteropServices

Public Class xxxxxxxxxxxxxxxxxxxxxx

<DllImport("user32.dll")>
    Private Shared Function HideCaret(ByVal hwnd As IntPtr) As Boolean
    End Function

...............

Private Sub txtNotePreview_MouseMove(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtNotePreview.MouseMove, txtNotePreview.KeyPress
        HideCaret(txtNotePreview.Handle)
    End Sub

答案 6 :(得分:0)

其他人表示将“ ReadOnly”设置为“ True”将避免插入符号 当您单击文本框时。他们在那里弄错了。 我正在使用VB.Net,但也许下面的示例代码可能会更简单 回答。

它涉及使用以下属性创建一个新类(MyTextBox): 默认为“ False”的“ NoCaret”(即默认情况下显示插入符号)。 在一个新的类模块中,将以下代码添加到您的项目中,重新生成该项目,然后将新的文本框(位于工具箱顶部)拖到窗体上。若要停止插入标记,请在属性面板中为添加到表单的每个MyTextbox控件显示打勾“ NoCaret”。

因此,您首先按如下方式创建一个新的类模块(不必在设计器中绘制文本框。实际上最好不要绘制该文本框,因为那样会创建不必要的“ InitializeComponent”代码,这只会使情况更加混乱。子“ New()”中的“ MyBase.New()”行负责所有操作)

Imports System.Runtime.InteropServices

Public Class MyTextBox
    Inherits TextBox
    Private Declare Function HideCaret Lib "user32.dll" (ByVal hwnd As Int32) As Int32
    Private Declare Function ShowCaret Lib "user32.dll" (ByVal hwnd As Int32) As Int32

    Private _HideCaret As Boolean

    Public Sub New()
        MyBase.New()
    End Sub

    Public Property NoCaret As Boolean
        Get
            Return _HideCaret
        End Get
        Set(ByVal value As Boolean)
            _HideCaret = value
        End Set
    End Property

    Private Sub TextBox_MouseMove(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.MouseMove
        If Me.NoCaret = True Then
            HideCaret(Handle.ToInt32)
        Else
            ShowCaret(Handle.ToInt32)
        End If
    End Sub
End Class

不过,请确保对表单上任何现有文本框进行“ TypeOf”测试的任何现有代码,例如:

For each tb as control in MyForm.Controls
   if TypeOf tb Is TextBox then
   .....{do something}
   endif
Next

更改为:

For each tb as control in MyForm.Controls
   if TypeOf tb.Parent Is TextBox then
   .....{do something}
   endif
Next

答案 7 :(得分:0)

我遇到了无法在文本框中隐藏插入符号的问题。诀窍是将它隐藏在设计器中无法访问的 GotFocus 事件中,因此必须手动订阅它。完整代码如下:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApp
{
    public partial class Form1 : Form
    {
        [DllImport("user32")]
        private static extern bool HideCaret(IntPtr hWnd);

        public Form1()
        {
            InitializeComponent();
            textBox1.GotFocus += textBox1_GotFocus;
        }

        private void textBox1_GotFocus(object sender, EventArgs e)
        {
            HideCaret(textBox1.Handle);
        }
    }
}