【问题标题】:Prevent Blinking Cursor in Textbox防止文本框中的光标闪烁
【发布时间】:2010-10-10 17:13:28
【问题描述】:

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

我确实在一些论坛中读到过调用了一个特定的 api,但是当我在我的代码中尝试它时,显示了一个错误。如果可能,请为此目的提供完整的代码,并让我知道是否存在应该执行代码的特定事件。

此文本框是为模拟局域网信使而创建的表单窗口的一部分。我正在使用 C#。该表单有两个文本框,以类似于 google talk。最好防止在上部文本框上显示闪烁的光标。

我试过了:

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

我收到错误消息:“找不到 DllImport。”

【问题讨论】:

  • 请提供有关此文本框及其创建语言的更多信息。OS X 上的本机可可文本框? html网页上表单中的文本框? win32 应用程序中的文本框? gtk2 文本框? BeOS 文本框?等
  • 这个文本框是为模拟局域网信使而创建的表单窗口的一部分。我使用的是 c#。该表单有两个文本框,以便类似于 google talk,最好防止在上部文本框上显示闪烁的光标。
  • 用您的新信息编辑问题 - 如果它在 cmets 中,人们也不会看到它。
  • 您尝试了哪个“特定的 api”?当您尝试时,显示了哪个“错误”?除非您告诉他们,否则 Stack Overflow 的读者无法看到您在做什么。
  • 我想他只是忘了写using System.Runtime.InteropServices; 或者在使用 DllImport 时使用完整规范:[System.Runtime.InteropServices.DllImport("user32")] ...

标签: c# winforms textbox


【解决方案1】:

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

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

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

...

HideCaret(myTextBox.Handle);

【讨论】:

  • 这也是我之前遇到的代码。这里的问题是显示一个错误说:“错误1找不到类型或命名空间名称'DllImport'(是您缺少 using 指令或程序集引用?)” 是否有任何具体的参考??
  • 在顶部添加 using 语句。 使用 System.Runtime.InteropServices;
  • 遗憾的是,我不得不同意 helrich 的观点。单击文本框后闪烁的插入符号仍然存在,即使它没有设置为只读。
【解决方案2】:

嗨,试试这个代码

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);
    }
}

【讨论】:

    【解决方案3】:

    将 hideCaret 函数放在 TextChanged 事件中即可解决问题:

    [DllImport("user32.dll")]
    static extern bool HideCaret(IntPtr hWnd);
    
    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        HideCaret(textBox1.Handle);
    }
    

    【讨论】:

    • 请不要在multiple questions上写完全相同的答案。相反,标记或投票以关闭新问题作为另一个问题的重复。
    【解决方案4】:

    我可以使用此处和this answer 中的代码在TextBox 上(部分)模拟Chrome 的网址栏。

    在第一次单击时,它会选择所有文本而不显示闪烁的插入符号,诀窍是当您第二次单击所选文本时使插入符号显示出来,这就是 Chrome 的网址栏的行为方式。

    代码如下:

    [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();              
        });          
    }
    

    【讨论】:

    • 这不能回答所提出的问题。 OP 希望在 load 上隐藏光标,而不是在 click选择所有文本
    【解决方案5】:

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

    它涉及创建一个新类(MyTextBox),并添加以下属性 “NoCaret”默认为“False”(即默认显示插入符号)。 将以下代码添加到新类模块中的项目中,重建项目,然后将新文本框(然后在工具箱顶部找到)拖到表单上。要停止插入符号显示在属性面板中为您添加到表单的每个 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
    

    【讨论】:

      【解决方案6】:

      我遇到了无法在文本框中隐藏插入符号的问题。诀窍是将其隐藏在 Designer 中无法访问的 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);
              }
          }
      }
      

      【讨论】:

        【解决方案7】:

        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
        

        【讨论】:

        • 您可能应该进一步解释一下。提供解决方案只是答案的一部分。
        【解决方案8】:

        TextBox 上的ReadOnly 属性设置为true

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

        【讨论】:

          猜你喜欢
          • 2011-12-22
          • 2014-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多