none
Bug no Visual Studio e/ou em suas dependencias? RRS feed

  • Pergunta

  • Buenas pessoal! Estou aqui pra sanar um problema em que está assombrando profundamente meu novo projeto!
    É o seguinte,tenho uma aplicação no qual registra as atividades do cursor do mouse em certas aplicações
    no qual o usuario da maquina clica,grava-se um print,desenha-se na foto indicando pela coordenada onde foi
    clicado e tal,um winservice que envia para um whats ou na nuvem...entre outras funções que nao vem ao caso...A questão é a seguinte,estou usando WinAPI para registrar essas informações,estou obtendo
    diretamente os eventos do sistema operacional através da biblioteca user32.dll e a classe MouseEventArgs,segundo às documentações da API,desenvolvi uma classe no qual consome os recursos e tal,aí é que vem o problema! Minha aplicação funciona perfeitamente no Windows XP com o Net Framework 3.5 instalado,mais nada!! Mas em maquinas com w7,w8/8.1 w10 (todas em 32 bits) meu sistema funciona normalmente dentro de um certo intervalo de clicks,e misteriosamente o evento para de funcionar,a aplicação fica obsoleta,eu instalei o visual studio nas maquinas em que estavam 'cruas' para fazer o teste e assim funcinou corretamente.Aí fica a minha pergunta,por acaso existe algum patch no visual studio que resolva algum bug desse tipo? em relação as aplicações compilada na versao 2010,desinstalei TUDO pra ir testando um a um(achei inclusive que fosse problemas com driver de video),com o Visual Studio instalado,funciona,sem ele,o programa morre,nao exibe erro,nem eventos no windows.Por acaso alguem sabe o nome desse tal 'hotfix' que tem no visual studio em que conserta essa falha?

    (O handler é criado em runtime)
    Andei reparando que quando eu chamo essa function,o programa para de funcionar:

      ''' <summary>
        ''' Captura a tela na hora do click
        ''' </summary>
        ''' <returns>Retorna a classe Bitmap</returns>
        ''' <remarks></remarks>
        Public Shared Function GetTela() As Bitmap
            'cria uma imagem do tamanho da tela X e Y e logo passo o enum PixelFormat
            Dim retorno As New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Imaging.PixelFormat.Format32bppArgb)
            Try
                'obtenho a imagem
                Dim grafico As Graphics = Graphics.FromImage(retorno)
                'jogo na imagem criada a foto da tela
                grafico.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy)
    
            Catch ex As Exception
                MsgBox("Erro : " & ex.Message)
            End Try
    
            'retorno
            Return retorno
        End Function

    Por acaso existe algum bug nessas classes consumidas nessa função? Depois de chamar ela algumas vezes,tudo para de funcionar,como mensionei la em cima,obviamente que isso acontece esporadicamente,nao tem quantidades certas de cliques.

    Estou usando Visual Studio 2010 

    Irei colocar apenas o nome da DLL e a função,no qual estou usando para trabalhar com a API:

    MODULO:
    User32.dll

    FUNÇOES:

    Private Shared Function CallNextHookEx(ByVal idHook As Integer,ByVal nCode As Integer,ByVal wParam As IntPtr,ByVal lParam As IntPtr) As Integer
    Private Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal HookProc As MouseHookCallback,ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer
    Private Shared Function UnhookWindowsHookEx(ByVal idHook As Integer) As Integer



    Se alguem ja presenciou algo do tipo,por favor,me ajuddeeem ahahha...
    Obrigado,pessoal! Grato


    Microsoft Technology Associate (MTA)


    • Editado Eduardo xUni segunda-feira, 24 de agosto de 2015 19:47
    segunda-feira, 24 de agosto de 2015 19:44

Respostas

  • tire o try..catch e faça um teste.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Marcado como Resposta Eduardo xUni terça-feira, 25 de agosto de 2015 20:05
    terça-feira, 25 de agosto de 2015 19:24
    Moderador
  • eu faria outro teste antes de partir para isso.

    Eu criaria um aplicativo separado, sem threads, comente com um botao que chama o seu catura tela e o bitmap salvo diretamente em arquivo.. ainda acho que é a thread que nao esta conseguindo interagir com o desktop.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Marcado como Resposta Eduardo xUni terça-feira, 25 de agosto de 2015 22:04
    terça-feira, 25 de agosto de 2015 20:08
    Moderador
  • William,consegui descobrir o problema...

    É o seguinte:

    Estou usando o modulo do windows User32,o problema estava no uso da função:

    Private Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal HookProc As MouseHookCallback,ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer

    No parametro hInstance ele espera um inteiro que corresponde ao meu aplicativo,ou seja ao meu server,consegui resolver isso de duas maneiras:

    1 - Uso a função GetModuleHandle da biblioteca Kernel32 que retorna o inteiro correspondente,no caso essa função espera uma string,entao eu passo Process.GetCurrentProcess().MainModule.ModuleName que corresponde ao nome do meu exe.

    2 - Como eu quero o proprio handler,coloco IntPtr.Zero.

    Antes usava: Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()(0))

    Quando atualizava o visual studio o problema parava.Acredito que seja algum problema com esse metodo,ou classe(Assembly do Reflections e/ou na Marshal do InteropServices) no qual estava usando,agora funciona em todos os windows e framework do 2.0 ao 4.5

    Obrigado William!

    Topico encerrado! :)


    Microsoft Technology Associate (MTA)


    quinta-feira, 27 de agosto de 2015 19:05

Todas as Respostas

  • Print screen de clicks e enviar para a nuvem??? Antes de fornecer a reposta preciso saber se sua aplicaçao é legal.

    Pela descriçao que voce deu isso mais parece um software para roubar senhas de banco.

    Se nao for o caso, por favor, nos de mais detalhes sobre seu projeto. Pois se for o caso esse tipo de questao esta fora do escopo do forum e pode ser considerado como crime pela legislaçao brasileira e todos os envolvidos processados.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 24 de agosto de 2015 20:09
    Moderador
  • É o seguinte,esse software desenvolvi para ajudar empresas a monitorar os terminais e detectar mal uso de sites,de sistemas e afins,quando me refiro à nuvem,me refiro à um servidor FTP LOCAL ou REMOTO,isso fica a gosto,é um prototipo,nao está em uso ainda,se fosse algum tipo de sistema que violasse a lei,amigo,logicamente uma pessoa JAMAIS colocaria aqui no forum da Microsoft,sou profissional.

    Meu sistema trabalha com acesso á banco que contem as palavras chaves em que o usuario escolhe monitorar,tais como titulo de janelas,as informações obtidas são guardadas em um Blob e em seguida compilado para sua extensão original e enviado para o usuario que o criou,mais informaçoes de fonte e essas coisas gostaria de trocar emails,pois nao gostaria de divulgar meu codigo publicamente.

    Obrigado


    Microsoft Technology Associate (MTA)



    • Editado Eduardo xUni segunda-feira, 24 de agosto de 2015 20:21
    • Marcado como Resposta Eduardo xUni segunda-feira, 24 de agosto de 2015 20:45
    • Não Marcado como Resposta Eduardo xUni terça-feira, 25 de agosto de 2015 13:35
    segunda-feira, 24 de agosto de 2015 20:17
  • A ideia do software é o seguinte:

    meu projeto tem dois tipos de funcionamento

    1 - Domestico - Cliente baixa o programa,configura atraves de um client e instala localmente,mais tarde pode utilizar a ferramenta para poder fazer um select e ver os registros do banco de dados (access) local,utilizando o mesmo metodo que a do corporativo,cria a imagem,converte em bytes,salva no banco de dados e depois resgata e faz o procedimento contrario,de bytes para aqruivos (util pra descobrir traições e etc)

    2 - Corporativo - Instala um sgbd Sql sever em um servidor e por la é configurada as palavras chaves que devem ser assistidas,com o IP ou nome do computador identificar o usuario,sistema online,inserir a palavra chave e ja atualizar os servers nos computadores,e assim enviar as informações coletadas para algum servidor configurado pelo administrador,todas as informações salvas no banco de dados usando criptografia MD5,vem junto com um aplicativo do tipo Windows Service,no que é encarregado de enviar as informações quando obtidas e notificar o administrador.

    Pensei nesse projeto para poder descobrir,por exemplo,usuarios mal intencionados usando um software para calcular valores quando clicam nos botoes,identificar possiveis fraudes ou 'acessos' indevidos a sites,links,diretorios...etc.

    Minha intenção NUNCA foi desenvolver uma ferramenta desse nivel para prejudicar terceiros.

    Eu só queria entender o porque acontece isso! Grato


    Microsoft Technology Associate (MTA)



    • Editado Eduardo xUni segunda-feira, 24 de agosto de 2015 21:35
    segunda-feira, 24 de agosto de 2015 21:10
  • Duas coisas:

    1 - Qual é a mensagem que voce recebe.

    2- Isso ocorre em ambientes win64 tambem?

    Veja esse artigo:

    https://sebsincanada.wordpress.com/2014/08/25/win32-exception-the-handle-is-invalid-when-using-system-graphics-copyfromscreen-aka-capturing-screenshots-from-a-service/

    Ele fala extamente de um problema de captura de tele dentro de serviços.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 25 de agosto de 2015 12:19
    Moderador
  • A ideia do software é o seguinte:

    meu projeto tem dois tipos de funcionamento

    1 - Domestico - Cliente baixa o programa,configura atraves de um client e instala localmente,mais tarde pode utilizar a ferramenta para poder fazer um select e ver os registros do banco de dados (access) local,utilizando o mesmo metodo que a do corporativo,cria a imagem,converte em bytes,salva no banco de dados e depois resgata e faz o procedimento contrario,de bytes para aqruivos (util pra descobrir traições e etc)

    2 - Corporativo - Instala um sgbd Sql sever em um servidor e por la é configurada as palavras chaves que devem ser assistidas,com o IP ou nome do computador identificar o usuario,sistema online,inserir a palavra chave e ja atualizar os servers nos computadores,e assim enviar as informações coletadas para algum servidor configurado pelo administrador,todas as informações salvas no banco de dados usando criptografia MD5,vem junto com um aplicativo do tipo Windows Service,no que é encarregado de enviar as informações quando obtidas e notificar o administrador.

    Pensei nesse projeto para poder descobrir,por exemplo,usuarios mal intencionados usando um software para calcular valores quando clicam nos botoes,identificar possiveis fraudes ou 'acessos' indevidos a sites,links,diretorios...etc.

    Minha intenção NUNCA foi desenvolver uma ferramenta desse nivel para prejudicar terceiros.

    Eu só queria entender o porque acontece isso! Grato


    Microsoft Technology Associate (MTA)



    Bom, isso é ilegal. Seu software favorece a quebra de sigilo, o que é crime federal, mesmo que seja usado nas melhores das intençoes:

    http://www.ambito-juridico.com.br/site/index.php?n_link=revista_artigos_leitura&artigo_id=11037

    e no meio empresarial:

    http://meiobit.com/316965/funcionaria-demitida-desinstalar-app-monitoramento-empresa-24-horas/

    Eu nao sei como esta no Brasil agora, mas aqui esse tipo de software é ilegal mesmo para monitorar seus filhos:

    http://www.espionner-un-portable.fr/espionner-un-portable-legal-illegal.html

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------



    terça-feira, 25 de agosto de 2015 17:18
    Moderador
  • Aí que tá o problema,nao exibe erro,nenhuma exception,simplesmente o evento para de funcionar,montei um robo em que envia clicks pra fazer os testes,coloquei o tempo minimo de 0,01 segundo,ou seja 1 ms no Windows XP funcionou normalmente,tirou print,alterou,guardou no banco e enviou,mas tem vezes que quando iniciava o server,ja nao funcionava o evento click(esporádico,NAO no Windows XP)...nao cheguei a testar na plataforma 64 bits.

    O sistema desenvolvi em 2 partes.

    O server que se encarrega de fazer essa tarefa,de capturar a tela,guardar em bytes no banco de dados,criado em Windows Forms,em services é meio complicado porque o serviço sobe antes da seção de usuario,ou seja na seção 0,e API's nao funcionam,a maioria desse server escrevi em baixo nivel,utilizei pouco os recursos do framework,devido as funções especificas de capturar mouse,titulo de janela e etc.

    O Windows Service que funciona junto com o server é encarregado apenas de pingar o servidor,ler o banco de dados,converter os bytes do blob em imagem e enviar para o administrador,caso ocorra algum erro no transporte da informação,ele da rollback,exclui a imagem temporaria e nao faz delete do registro do banco de dados,caso contrario ele exclui o registro assim que a imagem é enviada,apenas.

    os testes que fiz sem chamar a função de tirar print,TODOS os clicks foram numerados perfeitamente,MAS quando invoco ela,o server fica obsoleto,o evento nao funciona mais. Estou achando que tem algum problema nesse enum CopyPixelOperation,ou senao na classe Screen,ja mexi com os drivers de video,e tal mas mesmo assim nada! Somente com o visual studio instalado que funciona...Observe a imagem:

    O handler inicio da seguinte forma:

       

    Private WithEvents Atividade As AtividadeMouse

    Sub New() InitializeComponent() Atividade = New AtividadeMouse Atividade.Start() AddHandler Atividade.GetAtividade, AddressOf Me.ClasseMouse System.Threading.Thread(AddressOf AlimentaPalavras) ThreadAlimentaPalavras.Start() End Sub

    Obrigado amigo!


    Microsoft Technology Associate (MTA)



    • Editado Eduardo xUni terça-feira, 25 de agosto de 2015 17:37
    terça-feira, 25 de agosto de 2015 17:21
  • a funçao que tira o print (CapturaTela) está dentro do Serviço?

    Existe um msgbox lá, o que nao é permitido. Troque por algo que crie um arquivo de log, pois serviços nao podem interagir diretamente com a interface.

    Att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 25 de agosto de 2015 17:44
    Moderador
  • Nao..o Windows Service gera eventos de erros,capturar tela somente no windows forms..

    o Windows service só le o banco de dados e envia as imagens

    o problema está somente no server (Windows Forms) o Windows Services funciona perfeitamente


    Microsoft Technology Associate (MTA)


    • Editado Eduardo xUni terça-feira, 25 de agosto de 2015 17:54
    terça-feira, 25 de agosto de 2015 17:53
  • Mesmo assim: Tire o msgbox e substitua por uma funçao que gere um log fisico, como descrito neste artigo:

    http://cybarlab.com/save-error-log-in-text-file-in-c-sharp

    Eu creio que uma excessao esta sendo gerada mas como o metodo esta rodando em uma thread à parte ele nao esta conseguindo exibir o erro e nesse caso a thread fica presa lá, porque mesmo que nao seja exibido, existe um messagebox prendendo o fluxo. 

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 25 de agosto de 2015 18:00
    Moderador
  • Verdade!!! Nao pensei nisso,vou testar e logo lhe dou um retorno! Obrigado William

    Microsoft Technology Associate (MTA)

    terça-feira, 25 de agosto de 2015 18:12
  • Testei toda rotina,coloquei try/catch em tudo gerando log,e mesmo assim nenhum foi gerado,e ainda o defeito continua! 

    Microsoft Technology Associate (MTA)

    terça-feira, 25 de agosto de 2015 19:09
  • O unico metodo de resolver esse problema é instalando o visual studio na maquina do cliente,ou seja,algum hotfix,algum patch soluciona alguma falha nessas classes que trabalham com o monitor,é inviavel isso,eu preciso descobrir exatamente qual pacote incluso no VS 2010 que é instalado e sana o problema

    Microsoft Technology Associate (MTA)


    • Editado Eduardo xUni terça-feira, 25 de agosto de 2015 19:19
    terça-feira, 25 de agosto de 2015 19:18
  • Tenho alguns conhecidos que precisam saber oque é feito nos computadores,andei pesquisando na internet e encontrei zilhoes de ferramentas que fazem isso,testei uma a uma,nao consegui encontrar links que falam exatamente disso,entao deicidi criar essa ferramente mais enxuta e que funcione bem!...Mas em todo caso,nem irei mais lança-la,li os links que voce me enviou,acontece que agora to na curiosidade e quero saber o porque acontece isso! rs,entende? Agora a questão nem é mais de desenvolver para usa-la,e sim uma questão de curiosidade,gosto de testar softwares e descobrir vulnerabilidades,tanto que gosto de desenvolver em baixo nivel.

    Obrigado William


    Microsoft Technology Associate (MTA)

    terça-feira, 25 de agosto de 2015 19:24
  • tire o try..catch e faça um teste.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Marcado como Resposta Eduardo xUni terça-feira, 25 de agosto de 2015 20:05
    terça-feira, 25 de agosto de 2015 19:24
    Moderador
  • Sem try/catch ... o erro continua e o programa continua sem exibir qualquer tipo de erro!!!!! e o evento para de funcionar ... Voce mora na França William? Aqui no Br quando o funcionario é contratado,ele assina um termo no qual ele fica ciente de que o computador e a sala existem dispositivos de monitoramento,entende? Esse tipo de software que estamos tratando ele é ilegal só quando é usado de má fé dando prejuizo à terceiros igual spyware e afins.Se voce der uma pesquisada na internet,existe uma vasta opção de programas espiões,ou seja,eles estão lá,voce até pode usar ele em sua casa,mas se usar de má fé aí ja é considerado crime de estelionato.Aqui no Br carece de leis virtuais.

    Microsoft Technology Associate (MTA)





    • Editado Eduardo xUni terça-feira, 25 de agosto de 2015 19:44
    terça-feira, 25 de agosto de 2015 19:29
  • Moro no Canadá... E aqui ja deu tanto rolo com essa historia de privacidade e funcionarios que as empresas estao preferindo nao instalar esse tipo de software.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    terça-feira, 25 de agosto de 2015 19:43
    Moderador
  • Eu acompanho alguns noticiários internacionais,e vejo direto esse tipo de notícia! Aí a lei funciona,rs!

    O pessoal usa muito pra monitorar a namorada,89% do uso desses programas servem para pegar traições.


    Microsoft Technology Associate (MTA)

    terça-feira, 25 de agosto de 2015 19:46
  • William,muito obrigado! Irei encerrar o tópico,vou testar os pacotes do VS um a um e ver qual dele é responsavel pela correção de algum problema ou incompatibilidade que possa existir.

    Abraçoss!


    Microsoft Technology Associate (MTA)

    terça-feira, 25 de agosto de 2015 20:05
  • eu faria outro teste antes de partir para isso.

    Eu criaria um aplicativo separado, sem threads, comente com um botao que chama o seu catura tela e o bitmap salvo diretamente em arquivo.. ainda acho que é a thread que nao esta conseguindo interagir com o desktop.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    • Marcado como Resposta Eduardo xUni terça-feira, 25 de agosto de 2015 22:04
    terça-feira, 25 de agosto de 2015 20:08
    Moderador
  • ja fiz tudo isso,sem threads e apenas salvar o temp,constatei que o problema está na função que retorna o bitmap com o print da tela!!! =\ essa curiosidade está me matando,qualquer novidade postarei aqui!!

    William obrigado amigo

    Microsoft Technology Associate (MTA)

    terça-feira, 25 de agosto de 2015 22:04
  • William,consegui descobrir o problema...

    É o seguinte:

    Estou usando o modulo do windows User32,o problema estava no uso da função:

    Private Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal HookProc As MouseHookCallback,ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer

    No parametro hInstance ele espera um inteiro que corresponde ao meu aplicativo,ou seja ao meu server,consegui resolver isso de duas maneiras:

    1 - Uso a função GetModuleHandle da biblioteca Kernel32 que retorna o inteiro correspondente,no caso essa função espera uma string,entao eu passo Process.GetCurrentProcess().MainModule.ModuleName que corresponde ao nome do meu exe.

    2 - Como eu quero o proprio handler,coloco IntPtr.Zero.

    Antes usava: Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()(0))

    Quando atualizava o visual studio o problema parava.Acredito que seja algum problema com esse metodo,ou classe(Assembly do Reflections e/ou na Marshal do InteropServices) no qual estava usando,agora funciona em todos os windows e framework do 2.0 ao 4.5

    Obrigado William!

    Topico encerrado! :)


    Microsoft Technology Associate (MTA)


    quinta-feira, 27 de agosto de 2015 19:05