Simulace tlačítka BackSpace v C#   zodpovězená otázka

C#, WinForms

Zdravím,

vytvářím v C# aplikaci, která má mít vestavěnou klávesnici (počítač má pouze dotykový displej a klávesnice je uzpůsobená aplikaci).

Klávesnice se skládá z textboxu a tlačítek pro jednotlivé znaky. Text vkládám pomocí kódu:

private void btnBtn_Click(object sender, EventArgs e) {
     //vloží znak (text buttonu) do textboxu (na místo kurzoru)
     Button btn = sender as Button;
     txtText.Paste(btn.Text);
}

Takže se znak vloží tam, kde je kurzor (kam jsem předtím v textu klikl). Problém ovšem mám s mazáním tlačítkem BackSpace. Jak lze udělat, abych se mi při stisknutí tlačítka umazal znak za/před kurzorem? Teď tam mám pouze umazávání posledního znaku a problém je, když chci upravit nějaký znak "uprostřed".

Díky za případné nasměrování.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vlastnosti SelectionStart, SelectionLength a SelectedText se týkají pozice kursoru a vybraného text a jeho délky. Je-li vybraný text, tak ho nahradíš a celé to poskládat je-li kus zpředu a je-li kus vzadu dle pozice kursoru ... Dost možná simulovat vložení znaku přímo do textboxu, třeba SendKeys má-li textbox focus ...

Nemám s vestavěnou dotykovou klávesnicí žádnou zkušenost, ale třeba to pomůže.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Virtuální klávesnice :

    <DllImport("kernel32.dll")>
    Public Shared Function Wow64DisableWow64FsRedirection(ByRef OldValue As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

    <DllImport("kernel32.dll")>
    Public Shared Function Wow64RevertWow64FsRedirection(ByRef OldValue As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

    Private Sub TextBox1_Enter(sender As Object, e As System.EventArgs) Handles TextBox1.Enter
        Dim old As IntPtr
        Dim osk As String = "C:\Windows\System32\osk.exe"
        If Environment.Is64BitOperatingSystem Then
            If Wow64DisableWow64FsRedirection(old) Then
                Process.Start(osk)
                Wow64RevertWow64FsRedirection(old)
            End If
        Else
            Process.Start(osk)
        End If
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

http://www.vbforums.com/showthread.php?6...

Přidávám pokus zobrazit i skrýt klávesnici :

Imports System.Runtime.InteropServices
Public Class Form1

    <DllImport("kernel32.dll")>
    Public Shared Function Wow64DisableWow64FsRedirection(ByRef OldValue As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

    <DllImport("kernel32.dll")>
    Public Shared Function Wow64RevertWow64FsRedirection(ByRef OldValue As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

    Dim p_osk As Process = Nothing
    Private Sub TextBox1_Enter(sender As Object, e As System.EventArgs) Handles TextBox1.Enter
        Dim old As IntPtr
        Dim osk As String = "C:\Windows\System32\osk.exe"

        If Not p_osk Is Nothing AndAlso p_osk.HasExited Then
            p_osk.Close()
            p_osk = Nothing
        End If

        If Environment.Is64BitOperatingSystem Then
            If Wow64DisableWow64FsRedirection(old) Then
                p_osk = Process.Start(osk)
                Wow64RevertWow64FsRedirection(old)
            End If
        Else
            p_osk = Process.Start(osk)
        End If
    End Sub

    Private Sub TextBox1_Leave(sender As Object, e As System.EventArgs) Handles TextBox1.Leave
        If Not p_osk Is Nothing Then
            If Not p_osk.HasExited Then
                p_osk.Kill()
            End If
            p_osk.Close()
            p_osk = Nothing
        End If
    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        TextBox1_Leave(TextBox1, System.EventArgs.Empty)
    End Sub

End Class
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky, zkusím to s tím SelectionStart a SelectionLenght. Už mě napadlo, jak bych to mohl udělat...až se dostanu k počítači, tak to zkusím.

Windows klávesnici použít nechci. Tato je uzpůsobená pro aplikaci - má speciální tlačítka s konkrétními funkcemi.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přehlédnuto, že má být vestavěná vlastní klávesnice. Omluva za příspěvky ne zcela k tématu.

S panelem nebo usercontrolem budou asi potíže držet v popředí, třebas bude vše v jednom okně,

nebo plánujete klávesnici jako samostatný form...

Pokud se má klávesnice zjevovat spolu s textboxem, mohl byste podědit toolstripdropdown, který naplněn speciálními tlačítky zobrazíte jako context menu, nastavíte autoclose na false, aby se toolstripdropdown neskryl při přepínání focusu na textbox při nastavování pozice kursoru či výběru textu, jeho zobrazení a skrytí pomocí událostí textboxu.

Pro posílání znaků krom zmíněném SendKeys případně možná zkusit poslat znak funkcí PostMessage (WM_CHAR).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem si to zkusil jen tak narychlo spíchnout a funguje to. Označený text to vymaže, pokud není nic označeno (pouze kurzor), maže to nalevo od kurzoru a pokud už není co, tak to skočí na konec textu.

if (txtText.Text.Length > 0) {
                int oldSelectionStart = txtText.SelectionStart;

                if (txtText.SelectionLength == 0) {
                    //vybrán text nulové délky
                    if (oldSelectionStart != 0) {
                        txtText.Text = txtText.Text.Substring(0, oldSelectionStart - 1) + txtText.Text.Substring(oldSelectionStart);
                        txtText.SelectionStart = oldSelectionStart - 1;
                        txtText.Focus();
                    }
                    else {
                        txtText.SelectionStart = txtText.Text.Length;
                        txtText.Focus();
                    }
                }
                else {
                    //vybrán text
                    txtText.Text = txtText.Text.Substring(0, oldSelectionStart) + txtText.Text.Substring(oldSelectionStart + txtText.SelectionLength);
                }
            }
nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback