Предотвратить мерцание курсора в текстовом поле - PullRequest
6 голосов
/ 02 марта 2009

В текстовом поле, как вы можете предотвратить отображение мигающего курсора при нажатии на него?

Я читал на некоторых форумах, что есть вызов определенного API, но когда я попробовал это в своем коде, была показана ошибка. Пожалуйста, предоставьте полный код для этой цели, если это возможно, и дайте мне знать, если есть конкретное событие, когда код должен быть выполнен.

Это текстовое поле является частью окна формы, которое создается для симуляции мессенджера локальной сети. Я использую C #. Форма имеет два текстовых поля, чтобы напоминать Google Talk. Было бы желательно предотвратить отображение мигающего курсора в верхнем текстовом поле.

Я пытался:

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

Я получаю сообщение об ошибке: «DllImport не найден».

Ответы [ 6 ]

6 голосов
/ 02 марта 2009

Если вы хотите запретить редактирование текстового поля, установите для его свойства ReadOnly значение true.

Если вы хотите разрешить редактирование, но при этом скрыть каретку, вызовите Win32 API точно , как указано :

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

...

HideCaret(myTextBox.Handle);
3 голосов
/ 26 февраля 2013

Привет, Попробуйте этот код

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 голосов
/ 04 апреля 2013

если вы поместите функцию hideCaret в событие Textchange, это решит проблему.

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

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        HideCaret(textBox1.Handle);
    }
1 голос
/ 15 февраля 2014

Я исследовал, чтобы выяснить, как эмулировать веб-адресную строку Chrome (частично) для TextBox и собрал код здесь и в этом одном .

Работает нормально, сначала Clic, выделяет весь текст без отображения мигающей каретки, хитрость заключается в том, чтобы заставить каретку отображаться, когда вы кликаете второй раз по выделенному тексту, как ведет себя панель веб-адресов 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();              
        });          
    }
0 голосов
/ 25 апреля 2012

код 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
0 голосов
/ 02 марта 2009

Установите для свойства ReadOnly в TextBox значение true.

Больше ответов на этот вопрос: Текстовое поле только для чтения в C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...