none
Remover espaço em branco após colar da área de transferência. RRS feed

  • Pergunta

  • Olá. No programa que estou testando quando o usuário tecla barra de espaço é colado um valor da área de transferência em qualquer app do windows, via  SendKeys.Send("^v");

    Ocorre que após o comando de colar, o texto da área de transferência é colado e depois é adicionado um espaço em branco após o texto (resultado do espaço digitado acima).

    Gostaria que após o colar o cursor ficasse imediatamente após a última letra da palavra. Já tentei usar SendKeys.Send("{BackSpace}"); depois de verificar se a barra de espaço foi pressionada, mas isso faz com que o último caractere da palavra colada seja apagado. Ex: "palavr".

    Não estou entendo o porquê disso já que, a partir da posição original do cursor, eu acrescento um espaço, removo ele com o Backspace e colo da área de transferência. Em tese, o cursor deveria ficar logo após o último caractere colado do clipboard.

    Alguém pode me explicar esse comportamento e mostrar o que estou fazendo de errado? Ou sugerir uma alternativa? Grato.

    domingo, 4 de março de 2018 16:11

Respostas

  • Olá amigo boa tarde,

    Insto de fato não era para estar ocorrendo, mas como WindowsForms não é Thread Safety tudo é possível srsrs, bom mas se quiser resolver o problema de travamento, faça isso:

    SendKeys.Send("^v"); var tarefaAssincrona = new Task(() => { Thread.Sleep(1000); }); tarefaAssincrona.ContinueWith((t) => { t.Wait(); this.Invoke(new Action(() => { SendKeys.Send("{BackSpace}"); }), null); });

    tarefaAssincrona.Start();

    Espero ter ajudado, um abraço!


    • Editado Edson Loris segunda-feira, 5 de março de 2018 21:17
    • Marcado como Resposta Denis Valjean terça-feira, 6 de março de 2018 11:23
    segunda-feira, 5 de março de 2018 21:16

Todas as Respostas

  • Ninguém? Eu consegui remover o espaço depois de colar colocando um Thread.Sleep(1000) após o SendKeys.Send("^v"); e depois usei SendKeys.Send("{BackSpace}");, só que a aplicação fica travada durante esse um segundo e não consigo diminuir o sleep pra menos desse tempo sem que a última letra da palavra colada seja engolida. Tenho certeza que há uma solução mais elegante do que essa gambiarra que fiz.
    segunda-feira, 5 de março de 2018 13:11
  • Se o espaço em branco é causado pelo pressionar da barra de espaço, você pode resolver tratando o evento onKeyPress e definindo a propriedade e.Handled como true:

    private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
        e.Handled = true;
    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    segunda-feira, 5 de março de 2018 16:42
  • Olá amigo boa tarde,

    Insto de fato não era para estar ocorrendo, mas como WindowsForms não é Thread Safety tudo é possível srsrs, bom mas se quiser resolver o problema de travamento, faça isso:

    SendKeys.Send("^v"); var tarefaAssincrona = new Task(() => { Thread.Sleep(1000); }); tarefaAssincrona.ContinueWith((t) => { t.Wait(); this.Invoke(new Action(() => { SendKeys.Send("{BackSpace}"); }), null); });

    tarefaAssincrona.Start();

    Espero ter ajudado, um abraço!


    • Editado Edson Loris segunda-feira, 5 de março de 2018 21:17
    • Marcado como Resposta Denis Valjean terça-feira, 6 de março de 2018 11:23
    segunda-feira, 5 de março de 2018 21:16
  • Olá amigo boa tarde,

    Insto de fato não era para estar ocorrendo, mas como WindowsForms não é Thread Safety tudo é possível srsrs, bom mas se quiser resolver o problema de travamento, faça isso:

    SendKeys.Send("^v"); var tarefaAssincrona = new Task(() => { Thread.Sleep(1000); }); tarefaAssincrona.ContinueWith((t) => { t.Wait(); this.Invoke(new Action(() => { SendKeys.Send("{BackSpace}"); }), null); });

    tarefaAssincrona.Start();

    Espero ter ajudado, um abraço!


    Perfeito! Muito Obrigado!!
    terça-feira, 6 de março de 2018 11:24
  • Olá amigo boa tarde,

    Insto de fato não era para estar ocorrendo, mas como WindowsForms não é Thread Safety tudo é possível srsrs, bom mas se quiser resolver o problema de travamento, faça isso:

    SendKeys.Send("^v"); var tarefaAssincrona = new Task(() => { Thread.Sleep(1000); }); tarefaAssincrona.ContinueWith((t) => { t.Wait(); this.Invoke(new Action(() => { SendKeys.Send("{BackSpace}"); }), null); });

    tarefaAssincrona.Start();

    Espero ter ajudado, um abraço!


    Perfeito! Muito Obrigado!!

    Édson, só mais uma coisa. Vi que você usou expressões lambda e tarefas assíncronas pra resolver o problema. São coisas que ainda não cheguei a estudar. Estava estudando aqui o multithread e, como exercício, estava tentando retirar o espaço em branco agora antes de colar o texto da área de transferência, para ficar algo mais organizado.

    Então eu tenho um método que checa se o usuário apertou a barra de espaço, procura um valor num banco de dados e cola uma valor via SendKeys.SendWait("^v"). Aí estava tentando fazer o seguinte:

    Se barra de espaço apertada e valor existe no banco de dados:

     Thread t1 = new Thread(() => 
     {
            SendKeys.SendWait("{BackSpace}");
    
     });
    
    t1.Start();
    t1.Join(); //suspende main thread até a execução de t1.
    

    Ou seja, pararia a execução do Main Thread até que o bloco de código da thread 1 fosse executado e depois colaria o texto. Entretanto, ao executar o código continua existindo uma espaço em branco após SendKeys.SendWait("^v").

    Onde estou errando? O que pensei pelo menos tem lógica?


    quarta-feira, 7 de março de 2018 13:59
  • Bom dia,

    Trabalhar com Threads no Winforms é complicado, por não ser Thread Safety, por isso a necessidade de usar o ".Invoke", neste caso, sugiro que vc ao encontrar a informação no banco de dados não usar o ctrl+v, e sim fazer o bind no componente, ou usar, por exemplo, o método .Paste(). Inclusive acho que isso resolva até o seu problema anterior ex:

    1. Vamos  criar uma variável e dois eventos "KeyDown e KeyPress":
       private bool isBackSpace = false;
    
            private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyData == Keys.Space)
                {
                    e.Handled = true;
                    isBackSpace = true;
                    (sender as TextBox).Paste();// colo o valor
                }
    
            }
    
            private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (isBackSpace)
                {
                    e.Handled = true;
                    isBackSpace = false;
                }
            }

    Acredito que assim seus problemas serão resolvidos!

    Um abraço!

    quinta-feira, 8 de março de 2018 13:24
  • Bom dia,

    Trabalhar com Threads no Winforms é complicado, por não ser Thread Safety, por isso a necessidade de usar o ".Invoke", neste caso, sugiro que vc ao encontrar a informação no banco de dados não usar o ctrl+v, e sim fazer o bind no componente, ou usar, por exemplo, o método .Paste(). Inclusive acho que isso resolva até o seu problema anterior ex:

    1. Vamos  criar uma variável e dois eventos "KeyDown e KeyPress":
       private bool isBackSpace = false;
    
            private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyData == Keys.Space)
                {
                    e.Handled = true;
                    isBackSpace = true;
                    (sender as TextBox).Paste();// colo o valor
                }
    
            }
    
            private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (isBackSpace)
                {
                    e.Handled = true;
                    isBackSpace = false;
                }
            }

    Acredito que assim seus problemas serão resolvidos!

    Um abraço!

    Entendi. Obrigado. Só que eu não colo no programa, eu colo o texto em qualquer app do windows, principalmente no Word, por isso uso SendKeys pois não conheço outro método.
    quinta-feira, 8 de março de 2018 14:01