2009-03-02 16 views
6

W polu tekstowym, w jaki sposób można zapobiec wyświetlaniu migającego kursora po kliknięciu?Zapobieganie migotaniu kursora w polu tekstowym

Czytałem na niektórych forach, że jest połączenie z konkretnym API, ale gdy próbowałem go w moim kodzie, pojawił się błąd. Jeśli to możliwe, podaj pełny kod do tego celu i daj mi znać, jeśli istnieje określone zdarzenie, w którym kod powinien zostać wykonany.

To pole tekstowe jest częścią okna formularza, które tworzy dla symulacji komunikatora sieci LAN. Używam C#. Formularz ma dwa pola tekstowe, aby przypominały google talk. Pożądane byłoby uniemożliwienie wyświetlania migającego kursora w górnym polu tekstowym.

Próbowałem:

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

pojawia się błąd: "DllImport nie można odnaleźć"

+0

Proszę podać więcej informacji na temat tego pola tekstowego i języka, w jakim został utworzony. Własny tekst pola kakao na OS X? Pole tekstowe w formularzu na stronie HTML? Pole tekstowe w aplikacji win32? Pole tekstowe gtk2? Pole tekstowe BeOS? itd. – Nathan

+0

Cóż, ten tekst jest częścią okna formularza, które tworzę dla symulacji lan messenger.I używam C#. Formularz ma dwa pola tekstowe, aby przypominały google talk i byłoby pożądane, aby zapobiec wyświetlaniu migającego kursora w górnym polu tekstowym. – Avik

+0

Edytuj pytanie, podając nowe informacje - ludzie go nie zobaczą, jeśli są w komentarzach. –

Odpowiedz

6

Jeśli chcesz zabronić edycji na pole tekstowe, ustaw jego właściwość ReadOnly na true.

Jeśli chcesz zezwolić na edycję ale nadal ukryć daszka, zadzwoń API Win32 dokładnie as specified:

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

... 

HideCaret(myTextBox.Handle); 
+0

To jest kod Problemem jest to, że pojawia się błąd mówiąc: "Błąd Nie można znaleźć nazwy typu lub przestrzeni nazw" DllImport "(czy brakuje instrukcji użycia lub odniesienia do zespołu?) " Czy są jakieś konkretne odniesienia do wykonania? – Avik

+0

to działa idealnie, dzięki! – Mike

+0

Dodaj instrukcję użycia u góry. using System.Runtime.InteropServices; shahkalpesh

0

VB.NET Code

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 
+1

Powinieneś prawdopodobnie wyjaśnić nieco dalej. Dostarczenie rozwiązania jest tylko jedną częścią odpowiedzi. – albertjan

3

Cześć, spróbuj tego kodu

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

jeśli umieścisz funkcję hideCaret wewnątrz Textc hange, to rozwiąże problem.

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

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

badałem, aby dowiedzieć się, jak naśladować Chrome Web adres poprzeczkę (częściowo) na TextBox i zebrane kod zarówno tutaj i to one.

Działa dobrze, pierwszy Clic, zaznacza cały tekst bez pokazywania migającego znaku, trickiem jest sprawić, żeby karetka pokazała się, gdy Clic po raz drugi na zaznaczonym tekście, tak zachowuje się pasek adresu przeglądarki Chrome . Oto kod:

[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

To jest całkiem interesujące i użyteczne! +1 – Kaitlyn

Powiązane problemy