Usuário com melhor resposta
Remover espaço em branco após colar da área de transferência.

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.
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:
Espero ter ajudado, um abraço!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();
- 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
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.
-
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.
-
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:
Espero ter ajudado, um abraço!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();
- 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
-
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:
Espero ter ajudado, um abraço!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();
-
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:
Espero ter ajudado, um abraço!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();
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?
-
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:
- 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!
-
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:
- 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!