none
Ajuda ClipBoard? RRS feed

  • Pergunta

  • Boa noite pessoal. Estou fazendo um programa em WPF C# onde e monitorado quando o usuário da o Ctrl + C em um link no navegador. O que eu queria fazer seria mais ou menos assim:

    Inicio o programa normalmente com essa imagem no canto da tela, se o usuário copiar um link do Youtube ele muda pra essa imagem seguindo o mesmo esquema pro Vimeo, Facebook e SoundClound monitorando o link que e copiado caso o link não seja nenhum desses sites ele volta pra primeira imagem.

    Teria como fazer?

    Abraços! 

    __________________________________________________________________________________

    A arte de programar consiste na arte de organizar e dominar a complexidade.



    terça-feira, 5 de maio de 2015 01:30

Respostas

  • Opa, tudo bom?

    A duvida é exatamente sobre qual ponto desse processo? Como fazer o aplicativo inteiro? Como acessar as informação que está no clipboard? Como validar uma string? Como fazer para o programa rodar em background deixando o ícone a mostra?

    Para acessar as informações que estão no clipboard, você pode fazer uso da classe Clipboard do .NET Framework. O namespace é System.Windows, pra acrescentar a referencia no projeto. Essa classe tem dois métodos dos quais você pode se utilizar. GetText(), para recuperar o texto e fazer as suas validações de URL, e SetText(), caso seu programa também precise fazer alguma alteração no texto do clipboard. Segue abaixo o link da documentação dessa classe no MSDN.

    Classe System.Windows.Clipboard

    Para você fazer a validação do texto, recomendo a utilização de expressões regulares. A classe regex pode ser encontrada no namespace System.Text.RegularExpressions, e permite a utilização de expressões regulares para validação de padrões em um texto. Por exemplo, você, após carregar o texto do clipboard, pode rodar o texto contra uma expressão regular para validar a presença da palavra youtube, para ver se é um link válido do youtube. É um exemplo simples e carente de detalhes, mas a ideia é essa no geral. Segue abaixo link da documentação da classe Regex no MSDN:

    Classe System.Text.RegularExpressions.Regex

    Espero que essas informações possam te ajudar com seu projeto.

    Att,


    terça-feira, 5 de maio de 2015 14:27
  • Tente remover a String Texto de dentro das iterações. Cria ela fora e só atribui um novo valor a ela a partir do GetText() do Clipboard no inicio de cada iteração. Também o que você pode tentar é alguma ação padrão quando não cai em nenhum dos seus IFs pro teu objeto BBB, uma url padrão ou algo assim.

    Veja se alguma dessas coisas resolvem.

    quarta-feira, 6 de maio de 2015 17:48
  • Brother,

    Estou tentando te ajudar a resolver seu problema por você mesmo, e não resolver o seu problema pra você sem que você aprenda nada com isso além de usar os comandos ctrl+C e ctrl+V.

    Você disse que não entendeu o que eu expliquei. Vou te explicar em detalhes:

    "Tente remover a String Texto de dentro das iterações"

    Uma iteração, no contexto de programação, é a repetição de uma ou mais ações em série. A classe DispatcherTimer que você está utilizando é um temporizador que está associado a fila de Dispatcher, que processa informações em um intervalo determinado, de acordo com uma prioridade também determinada previamente. Quando você atribui uma Task no evento Tick do DispatcherTimer, que ocorre quando um intervalo do Timer é executado, você está iterando pelo código de sua Task. Note que a primeira ação nas suas iterações é instanciar uma string chamada Texto. O simples fato de você instanciar essas strings com mesmo nome em várias Tasks de forma tão consecutiva poderia já estar lhe causando problemas. Minha sugestão para você foi a de criar a instância dessa string fora das suas iterações, e referencia-la somente, atribuindo valor de dentro das iterações. Eu não sei se isso resolverá seu problema, é uma sugestão do que eu tentaria no seu lugar.

    "a ação padrão quando não cai em nenhum dos seus IFs"

    Você utiliza uma série de clausulas condicionais para validar o conteúdo da string que contém o texto do seu Clipboard. De acordo com você mesmo, o erro ocorre quando uma string não possui as características necessárias para ter uma condição verdadeira, e portanto válida, em nenhum dos seus Ifs, de forma que não cai em nenhum deles, e seu objeto "BBB", seja lá o que for, fica sem uma atribuição a sua propriedade Source. Como esta é a única sessão do seu código que você está apresentando, posso deduzir que está é a única diferença do resultado de uma iteração que cai dentro de um dos seus Ifs de uma que não entra em nenhum If. A julgar pela diferença, sugiro que você defina o que deve acontecer com a propriedade Source do seu objeto BBB quando não entra em nenhum outro If. É também outra coisa que eu faria no seu lugar, embora não possa garantir que terá o resultado desejado.

    Eu de bom grado postaria aqui as alterações sugeridas em código, mas acho que a explicação é suficiente para alguém que tem interesse em aprender e compartilhar conhecimento, e não só em fazer com que outros desenvolvam código para ele mesmo.

    quinta-feira, 7 de maio de 2015 13:21

Todas as Respostas

  • Opa, tudo bom?

    A duvida é exatamente sobre qual ponto desse processo? Como fazer o aplicativo inteiro? Como acessar as informação que está no clipboard? Como validar uma string? Como fazer para o programa rodar em background deixando o ícone a mostra?

    Para acessar as informações que estão no clipboard, você pode fazer uso da classe Clipboard do .NET Framework. O namespace é System.Windows, pra acrescentar a referencia no projeto. Essa classe tem dois métodos dos quais você pode se utilizar. GetText(), para recuperar o texto e fazer as suas validações de URL, e SetText(), caso seu programa também precise fazer alguma alteração no texto do clipboard. Segue abaixo o link da documentação dessa classe no MSDN.

    Classe System.Windows.Clipboard

    Para você fazer a validação do texto, recomendo a utilização de expressões regulares. A classe regex pode ser encontrada no namespace System.Text.RegularExpressions, e permite a utilização de expressões regulares para validação de padrões em um texto. Por exemplo, você, após carregar o texto do clipboard, pode rodar o texto contra uma expressão regular para validar a presença da palavra youtube, para ver se é um link válido do youtube. É um exemplo simples e carente de detalhes, mas a ideia é essa no geral. Segue abaixo link da documentação da classe Regex no MSDN:

    Classe System.Text.RegularExpressions.Regex

    Espero que essas informações possam te ajudar com seu projeto.

    Att,


    terça-feira, 5 de maio de 2015 14:27
  • Boa noite Samuel Pelaquim.

    Vi o link que você passou para eu utilizar o Regex, mas eu não entendi nada então testei algumas formas e cheguei ao resultado abaixo:

            private void ImagemLink()
            {
                DispatcherTimer DT = new DispatcherTimer();
                DT.Tick += (object source, EventArgs args) =>
                {
                    String Texto = Clipboard.GetText();
    
                    if (Texto.Contains("http://www.dailymotion.com/video"))
                    {
                        BBB.Source = new BitmapImage(new Uri(@"C:\Users\gustavo\Desktop\AlphA Video Downloader\AlphA Video Downloader\bin\Debug\Imagens\BtnColarLinkDailymotion.png"));
                    }
    
                    if (Texto.Contains("https://www.facebook.com/video.php?v="))
                    {
                        BBB.Source = new BitmapImage(new Uri(@"C:\Users\gustavo\Desktop\AlphA Video Downloader\AlphA Video Downloader\bin\Debug\Imagens\BtnColarLinkFacebook.png"));
                    }
    
                    if (Texto.Contains("https://soundcloud.com"))
                    {
                        BBB.Source = new BitmapImage(new Uri(@"C:\Users\gustavo\Desktop\AlphA Video Downloader\AlphA Video Downloader\bin\Debug\Imagens\BtnColarLinkSoundCloud.png"));
                    }
    
                    if (Texto.Contains("https://vimeo.com"))
                    {
                        BBB.Source = new BitmapImage(new Uri(@"C:\Users\gustavo\Desktop\AlphA Video Downloader\AlphA Video Downloader\bin\Debug\Imagens\BtnColarLinkVimeo.png"));
                    }
    
                    if (Texto.Contains("https://www.youtube.com/watch?v="))
                    {
                        BBB.Source = new BitmapImage(new Uri(@"C:\Users\gustavo\Desktop\AlphA Video Downloader\AlphA Video Downloader\bin\Debug\Imagens\BtnColarLinkYoutube.png"));
                    }
    
                };
    
                DT.Start();
            }

    Mas ele da esse seguinte erro se eu copio algum texto qualquer:

    Managed Debugging Assistant 'DisconnectedContext' has detected a problem in 'C:\Users\gustavo\Desktop\AlphA Video Downloader\AlphA Video Downloader\bin\Debug\AlphA Video Downloader.vshost.exe'.

    Additional information: Falha na transição para o contexto COM 0x1089c70 para este RuntimeCallableWrapper com o seguinte erro: Objeto não conectado ao servidor (Exceção de HRESULT: 0x800401FD (CO_E_OBJNOTCONNECTED)). Normalmente isso ocorre porque o contexto COM 0x1089c70 onde esse RuntimeCallableWrapper foi criado está desconectado ou está ocupado fazendo outra coisa e não pode processar a transição de contexto. Nenhum proxy será usado para servir a solicitação no componente COM e serão feitas chamadas diretamente ao componente COM. Isto pode causar corrupção ou perda de dados. Para evitar este problema, verifique se todos os contextos/apartmentos/threads COM se mantêm vivos e se estão disponíveis para a transição de contexto até que o aplicativo encerre totalmente os RuntimeCallableWrappers que representam componentes COM residentes neles.

    Outra coisa e que eu não consigo colocar essa imagem caso ele não for de nenhum dos sites de vídeo.

    Poderia me ajudar a resolver esses problemas?

    Abraços!

    __________________________________________________________________________________

    A arte de programar consiste na arte de organizar e dominar a complexidade.


    quarta-feira, 6 de maio de 2015 01:40
  • GMolivier,

    Esse erro acontece em que momento? Quando você debuga o código, ele chega a entrar em algum dos seus IFs? Ou o erro acontece exatamente no momento em que você copia algum texto para o clipboard?

    Sobre o regex, seria uma forma otimizada para você fazer a validação das urls que você copia para o clipboard, mas acredito com com a forma que você está fazendo talvez atenda sua necessidade.

    Att,

    quarta-feira, 6 de maio de 2015 12:15
  • Boa tarde Samuel Pelaquim.

    O erro acontece quando eu copio algum texto que não e igual aos IFs digamos assim, ai o Visual Studio aponta o erro no:

       String Texto = Clipboard.GetText();
    

    A mensagem:

    Additional information: Falha na transição para o contexto COM 0x1089c70 para este RuntimeCallableWrapper com o seguinte erro: Objeto não conectado ao servidor (Exceção de HRESULT: 0x800401FD (CO_E_OBJNOTCONNECTED)). Normalmente isso ocorre porque o contexto COM 0x1089c70 onde esse RuntimeCallableWrapper foi criado está desconectado ou está ocupado fazendo outra coisa e não pode processar a transição de contexto. Nenhum proxy será usado para servir a solicitação no componente COM e serão feitas chamadas diretamente ao componente COM. Isto pode causar corrupção ou perda de dados. Para evitar este problema, verifique se todos os contextos/apartmentos/threads COM se mantêm vivos e se estão disponíveis para a transição de contexto até que o aplicativo encerre totalmente os RuntimeCallableWrappers que representam componentes COM residentes neles.

    Ai que ta o problema, eu particularmente não entendi nada disso acima, mas se eu copio qualquer link que esteja nos IFs e inicio o programa não da esse erro.

    Poderia me ajudar?

    Abraços!

    __________________________________________________________________________________

    A arte de programar consiste na arte de organizar e dominar a complexidade.

    quarta-feira, 6 de maio de 2015 15:07
  • Tente remover a String Texto de dentro das iterações. Cria ela fora e só atribui um novo valor a ela a partir do GetText() do Clipboard no inicio de cada iteração. Também o que você pode tentar é alguma ação padrão quando não cai em nenhum dos seus IFs pro teu objeto BBB, uma url padrão ou algo assim.

    Veja se alguma dessas coisas resolvem.

    quarta-feira, 6 de maio de 2015 17:48
  • Boa noite Samuel Pelaquim.

    Fiz a leitura da resposta que você me deu, mas não entendi com "Tente remover a String Texto de dentro das iterações" e "a ação padrão quando não cai em nenhum dos seus IFs".

    Como ficaria essas alterações com o código que postei?

    Me da essa forma parceiro, marcar como resposta logo essa pergunta e encerrar de uma vez por toda essa pergunta.

    Abraços!

    __________________________________________________________________________________

    A arte de programar consiste na arte de organizar e dominar a complexidade.

    quinta-feira, 7 de maio de 2015 01:12
  • Brother,

    Estou tentando te ajudar a resolver seu problema por você mesmo, e não resolver o seu problema pra você sem que você aprenda nada com isso além de usar os comandos ctrl+C e ctrl+V.

    Você disse que não entendeu o que eu expliquei. Vou te explicar em detalhes:

    "Tente remover a String Texto de dentro das iterações"

    Uma iteração, no contexto de programação, é a repetição de uma ou mais ações em série. A classe DispatcherTimer que você está utilizando é um temporizador que está associado a fila de Dispatcher, que processa informações em um intervalo determinado, de acordo com uma prioridade também determinada previamente. Quando você atribui uma Task no evento Tick do DispatcherTimer, que ocorre quando um intervalo do Timer é executado, você está iterando pelo código de sua Task. Note que a primeira ação nas suas iterações é instanciar uma string chamada Texto. O simples fato de você instanciar essas strings com mesmo nome em várias Tasks de forma tão consecutiva poderia já estar lhe causando problemas. Minha sugestão para você foi a de criar a instância dessa string fora das suas iterações, e referencia-la somente, atribuindo valor de dentro das iterações. Eu não sei se isso resolverá seu problema, é uma sugestão do que eu tentaria no seu lugar.

    "a ação padrão quando não cai em nenhum dos seus IFs"

    Você utiliza uma série de clausulas condicionais para validar o conteúdo da string que contém o texto do seu Clipboard. De acordo com você mesmo, o erro ocorre quando uma string não possui as características necessárias para ter uma condição verdadeira, e portanto válida, em nenhum dos seus Ifs, de forma que não cai em nenhum deles, e seu objeto "BBB", seja lá o que for, fica sem uma atribuição a sua propriedade Source. Como esta é a única sessão do seu código que você está apresentando, posso deduzir que está é a única diferença do resultado de uma iteração que cai dentro de um dos seus Ifs de uma que não entra em nenhum If. A julgar pela diferença, sugiro que você defina o que deve acontecer com a propriedade Source do seu objeto BBB quando não entra em nenhum outro If. É também outra coisa que eu faria no seu lugar, embora não possa garantir que terá o resultado desejado.

    Eu de bom grado postaria aqui as alterações sugeridas em código, mas acho que a explicação é suficiente para alguém que tem interesse em aprender e compartilhar conhecimento, e não só em fazer com que outros desenvolvam código para ele mesmo.

    quinta-feira, 7 de maio de 2015 13:21
  • Boa noite Samuel Pelaquim.

    Agora eu entendi direito, assim que uma explicação boa. Realmente eu não deveria pedir muito pra vocês, ainda mais o código.

    Depois das alterações esta funcionando como eu queria no começo da pergunta.

    Muito obrigado.  

    Abraços!

    __________________________________________________________________________________

    A arte de programar consiste na arte de organizar e dominar a complexidade.

    quinta-feira, 7 de maio de 2015 22:44