在文本框中,如何在单击时阻止显示闪烁的光标?
我在一些论坛中读到过调用特定的api,但是当我在我的代码中尝试它时,显示错误。如果可能,请提供完整的代码,如果有特定事件需要执行代码,请告诉我。
此文本框是为LAN信使模拟创建的表单窗口的一部分。我正在使用C#。该表单有两个文本框,以便类似于谷歌谈话。希望防止在上部文本框上显示闪烁的光标。
我试过了:
[DllImport("user32")]
private static extern bool HideCaret(IntPtr hWnd);
public void HideCaret() { HideCaret(TextBox1.Handle); }
我收到错误:“无法找到DllImport。”
答案 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);
}
}
}