Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

pedro_kispert

Problema... VB 06 VS VB 08

Mensagens Recomendadas

pedro_kispert

Boas!

Eu frequento um curso de Informatica de gestão e a nossa querida professora lançou-nos um desafio, para construir duas aplicacoes, uma que guarda-se os movimentos do rato (as cordenadas) e outra as teclas do teclado que pressionamos.

Ora o meu problema esta nas teclas do teclado...

Sei que em VB 6.0 para usar-mos uma funçao de gravar teclas se fazia desta forma:

Sub gravar_teclas()
Open ("C:\Teclas.txt") for binary as #1
put #1 , 1 , Mid (sSalvar , 1 , Len (sSalvar) -1 )
End
End Sub

Mas no VB 2008 (que é o que usamos nas aulas agora, a function é outra, e estamos quase todos encravados aqui

Help? :cheesygrin:

Para terem uma ideia o que acontece é isto:

19622043.jpg

O comando

Open

Nem aparece, aparecendo apenas outros que de nada servem :x

Alguem me sabe explicar como dar a volta a isto?

(PS - tenho ate julho dia 22 para conseguir fazer este projecto, agradeço toda a ajuda que puderem dar)

Abraço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Antes de mais, bem-vindo!

(PS - tenho ate julho dia 22 para conseguir fazer este projecto, agradeço toda a ajuda que puderem dar)

Isto não interessa rigorosamente nada, vamos evitar isto e os "urgentes".

Basicamente procuras uma forma de escrever em ficheiros, correcto?

Recomendo-te a leitura deste artigo que deve resolver o teu problema.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

Obrigado pela resposta, eu sei escrever para ficheiros, o problema é mesmo a instruçao "Open"

Ele nao a reconhece e eu nao sei fazer de outra forma :x

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

E para que queres o Open senão para ler ou escrever?

StreamReader e Writers, como descritos no artigo, resolvem-te o problema.

Ou isso ou não estou a perceber exactamente o que pretendes.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

Imports System.IO
Public Class Form1
    Private Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer
    Dim sSalvar As String 'guarda a tecla
    Dim sAnterior As String 'mostra a tecla anterior
    Dim Cnt As Long 'para o loop
    Dim Ret As String 'para a tecla actual
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


    End Sub
    Function ObterTeclasPressionada() As String
        'enquanto cnt for de 32 a 128 (ANSI)
        For Me.Cnt = 32 To 128
            'Obter tecla pressionada caso a funçao de chamada nao der erro
            If GetAsyncKeyState(Cnt) <> 0 Then
                ObterTeclasPressionada = Cnt
                Exit For
            End If
        Next Cnt
    End Function

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Ret = ObterTeclasPressionada() 'chama a funçao
        If Ret <> sAnterior Then ' se for diferente da anterior obtida
            sAnterior = Ret
            sSalvar = sAnterior + Ret

        End If
        gravar_teclas() 'chama a funcao q grava no ficheiro
    End Sub

    Sub gravar_teclas()
        'abre o ficheiro no disco para gravar
        Dim SW As New StreamWriter("C:\O_meu_ficheiro.txt")
        For i As Integer = 0 To 10
            SW.Write(i)
        Next
        SW.Close()
    End Sub
End Class

O meu codigo agora esta assim, mas nao grava as teclas q preciono :S

Começo a desesperar q nervos, adoro programar com o que sei, aprender coisas novas sob pressao nao faz o meu estilo xD

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Tira o cifrão ($)

E já agora acrescenta .ToString ao final para passar o Char para String:

Chr(Cnt).ToString


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Tem de existir uma devolução da função em todas as hipóteses do fluxo.

Se a devolução nesse ramo do fluxo não interessa, depois do Next Cnt acrescenta um Return Nothing.

Quanto ao post anterior, não faças Edits assim tão radicais. Tiram o sentido às respostas posteriores.

Para já o teu problema é teres copiado o código do artigo, "ipsis verbis", sem tentar perceber o que deves ou não mudar. Estás a escrever os números de 0 a 10 no ficheiro, nem mais nem menos.

Volta ao artigo e procura descobrir para que serve o APPEND no streamwriter.

Basta depois enviares cada novo caractere para lá, ou guardar um pequeno buffer, como entenderes.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

Ai esta o meu stress, o facto de enviar e gravar o caracter... ele nao esta a assumir isso :S

        Dim SW As New IO.StreamWriter("C:\O_meu_ficheiro.txt")
        For i As Integer = 0 To 10000
            SW.Write(i)
        Next
        SW.Close()

imaginemos q quero guardar 10.000 caracteres, a variavel SW, seria o meu Ret (tecla Actual) correcto?

assim como o SW.Close serviria para fechar o streamwriter, mantendo os dados seguros, e escritos no ficheiro de texto, certo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

Para servir de exemplo:

Public Class Form1
    Dim localizacao, nome, contacto(499) As String
    Dim i As Integer
    Dim idade, hWnd, titulo, mensagem, erro, fim, local, erro_vazio, trabalho, localidade, numero, newline(499) As String


    Private Sub Btn_importar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_importar.Click
        localizacao = InputBox("Qual a localização exacta do ficheiro?")
        Dim ItemArray(Me.ListBox1.Items.Count - 1) As Object
        Me.ListBox1.Items.CopyTo(ItemArray, 0)
        Dim Data As String = Join(ItemArray, Environment.NewLine)
        My.Computer.FileSystem.WriteAllText(localizacao, Data, True)
    End Sub

    Private Sub Btn_exportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_exportar.Click
        erro_vazio = ("   O local não pode ser deixado em branco! Vá nas opcções salvar!   ")
        If local = "" Then
            MsgBox(erro_vazio)
        Else

            Dim ItemArray(Me.ListBox1.Items.Count - 1) As Object
            Me.ListBox1.Items.CopyTo(ItemArray, 0)
            Dim Data As String = Join(ItemArray, Environment.NewLine)
            My.Computer.FileSystem.WriteAllText("c:\" & local & ".txt", Data, False)
            MsgBox("Ficheiro Exportado com Sucesso! Pode agora encontra-lo em: C:\" & local & ".txt")
        End If
    End Sub

    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Btn_introduzir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        newline(i) = "-----------------------------------------------------------------------------------------"
        titulo = ("   Bem vindo! Organizer V0.2   ")
        mensagem = ("   Adicione um novo Contacto   ")
        erro = ("   Erro, tem de escrever alguma coisa!")
        contacto(i) = InputBox(mensagem, , titulo)
        If contacto(i) = "" Then
            MsgBox(erro, , "Erro!")
        End If
        ListBox1.Items.Add(contacto(i))
        ListBox1.Items.Add(newline)
    End Sub

    Private Sub Btn_apagar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_apagar.Click
        If ListBox1.SelectedItem = "" Then
            MsgBox("   Nenhum Contacto Selecionado...   ", , "Erro!!")
        Else
            ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
        End If

    End Sub


    Private Sub Btn_ver_todos_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_ver_todos.Click
        MsgBox("   Existe um total de:" & ListBox1.Items.Count - newline(i) & " Items   ", , "Items")
    End Sub

    Private Sub SalvarComoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalvarComoToolStripMenuItem.Click
        local = InputBox("   Digite o nome com que ficará o ficheiro esportado para o Disco C:/   ", "Salvar como...")
    End Sub

    Private Sub CréditosToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CréditosToolStripMenuItem.Click
        MsgBox("   Programa desenvolvido por: Pedro Kispert - ESCT 2009/2010   ", , "Créditos")
    End Sub

    Private Sub SairToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SairToolStripMenuItem.Click
        If local = "" Then
            If InputBox("Deseja sair sem Salvar os dados Exportando-os? SIM/NAO") = "NAO" Then
                local = InputBox("   Qual o local a guardar o ficheiro no disco C: ?   ")
                Dim ItemArray(Me.ListBox1.Items.Count - 1) As Object
                Me.ListBox1.Items.CopyTo(ItemArray, 0)
                Dim Data As String = Join(ItemArray, Environment.NewLine)
                My.Computer.FileSystem.WriteAllText("c:\" & local & ".txt", Data, False)
                MsgBox("   Ficheiro Exportado com Sucesso! Pode agora encontra-lo em: C:\" & local & ".txt   ")
            Else
                MsgBox("   Vai sair Sem Guardar! Obrigado (:   ")
                End
            End If
        End If
        End
    End Sub

    Private Sub ParaQueServerOOrganizerV02ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ParaQueServerOOrganizerV02ToolStripMenuItem.Click
        MsgBox("      O Organizer, é um programa desenvolvido para a organização de contactos. Os contactos são constituidos por dois campos, o nome e numero de telemovel. Lembreve-se no fim de introduzir os contactos deve exporta-los para o seu disco C:   ", , "Para que serve este Software?")
    End Sub

    Private Sub Btn_introduzir_completo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_introduzir_completo.Click
        titulo = "Informação de Contacto"
        nome = InputBox("Qual o nome do contacto?", titulo)
        idade = InputBox("Qual a idade do contacto?", titulo)
        newline(i) = "----------------------------------------------------"
        localidade = InputBox("Qual a localidade de residencia de: " & nome, titulo)
        trabalho = InputBox("Qual a profissão?", titulo)
        numero = InputBox("Qual o contacto de: " & nome)
        ListBox1.Items.Add("nome: " & nome & " - numero: " & numero & " - idade: " & idade & " - profissão: " & trabalho & " - localidade: " & localidade)
        ListBox1.Items.Add(newline(i))
    End Sub

    Private Sub Btn_see_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_see.Click
        MsgBox(ListBox1.SelectedItem)
    End Sub
End Class

Este programa guarda os contactos do meu telemovel :)

Adiante...

Eu ai consigo defenir bem o que quero q ele faça nestas linhas:

Dim ItemArray(Me.ListBox1.Items.Count - 1) As Object

                Me.ListBox1.Items.CopyTo(ItemArray, 0)

                Dim Data As String = Join(ItemArray, Environment.NewLine)

                My.Computer.FileSystem.WriteAllText("c:\" & local & ".txt", Data, False)

                MsgBox("  Ficheiro Exportado com Sucesso! Pode agora encontra-lo em: C:\" & local & ".txt  ")

mas de facto, como nos foi ensinado hoje ás 8h da matina, este novo metodo:

StreamWriter

e

StreamReader

É muito mais simples, mas nao estou a saber implementar nesta interface :S

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Não. Estás a baralhar tudo.

Está aí uma confusão grande.

Toma lá uma solução, tenta entender:

O teu gravar_teclas:

    Sub gravar_teclas(tecla As String)
        'abre o ficheiro no disco para gravar
        Dim SW As New StreamWriter("C:\O_meu_ficheiro.txt",True)
            SW.Write(tecla)
        SW.Close()
    End Sub

A chamada do gravar teclas:

gravar_teclas(Ret) 

Dessa forma, transportas a tecla pressionada, que apanhas para a variável Ret na função de obter teclas para dentro do sub de gravação, que a grava com append no ficheiro, o que significa que vai escrever a string no final do ficheiro


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

Bem depois de feito o que disses-te, nao achei nenhum erro!

Mas continua sem escrever nada o magana do programa!

Eu ate abri outro para ver se ao escrever num bloco de notas e salvar o bloco de novas, ele associava e criava o ficheiro das teclas precionadas, mas nem assim

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Se não escreve nada é porque o gravar_teclas nunca é chamado.

Clica em cima do SW.Write(tecla) e carrega no F9.

Isso vai adicionar um breakpoint, uma pequena bola vermelha do lado esquerdo, que faz com que o programa seja interrompido sempre que o fluxo por lá passe.

Experimenta correr a aplicação, com o breakpoint, e verifica se alguma vez a aplicação é interrompida por lá chegar.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

não é interrompida, ou seja, abro um bloco de notas e meto-me a escrever asneiras e o projecto nao se quiexa e so fecha quando clico na cruzinha

(ok na cruz, cruzinha é um bocado.... bah sei la)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Aí tens.

Se não é interrompido, nem sequer lá chega.

Tens de rever a lógica de detecção de teclas.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

Tens um livro chamado: Técnicas avançadas em Visual Basic 6?

Trabalhando com API de A a Z

o livro é do: João Ferreira

Editora: FCA

Eu estou a copiar linha a linha pelo livro! e mesmo assim nao dá, est tudo igual menos o Streamer.writer, de resto ta 100% igual, eu estou a guiar-me por este exemplo para depois criar um projecto mais avançado, com botoes a dizer inicio gravacao, fim de gravacao, ver gravado, apagar gravado e algumas animaçoes, mas isso so farei se conseguir fazer este exemplo e nao tou a conseguir :x

___________

já revi e esta tudo bem declarado :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

Declara um timer e testa por favor, se tiveres VB

Imports System.IO
Public Class Form1
    Private Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer
    Dim sSalvar As String 'guarda a tecla
    Dim sAnterior As String 'mostra a tecla anterior
    Dim Cnt As Long 'para o loop
    Dim Ret As String 'para a tecla actual
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


    End Sub
    Function ObterTeclasPressionada() As String
        'enquanto cnt for de 32 a 128 (ANSI)
        For Me.Cnt = 32 To 128
            'Obter tecla pressionada caso a funçao de chamada nao der erro
            If GetAsyncKeyState(Cnt) <> 0 Then
                ObterTeclasPressionada = Chr(Cnt).ToString
                Exit For
            End If
        Next Cnt
        Return Nothing
    End Function

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Ret = ObterTeclasPressionada() 'chama a funçao
        If Ret <> sAnterior Then ' se for diferente da anterior obtida
            sAnterior = Ret
            sSalvar = sAnterior + Ret

        End If
        gravar_teclas(Ret) 'chama a funcao q grava no ficheiro
    End Sub

    Sub gravar_teclas(ByVal tecla As String)
        'abre o ficheiro no disco para gravar
        Dim SW As New StreamWriter("C:\O_meu_ficheiro.txt", True)
        SW.Write(tecla)
        SW.Close()
    End Sub
End Class

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jpaulino

Tens um livro chamado: Técnicas avançadas em Visual Basic 6?

Trabalhando com API de A a Z

o livro é do: João Ferreira

Editora: FCA

Eu estou a copiar linha a linha pelo livro! e mesmo assim nao dá, est tudo igual menos o Streamer.writer, de resto ta 100% igual, eu estou a guiar-me por este exemplo para depois criar um projecto mais avançado, com botoes a dizer inicio gravacao, fim de gravacao, ver gravado, apagar gravado e algumas animaçoes, mas isso so farei se conseguir fazer este exemplo e nao tou a conseguir :x

___________

já revi e esta tudo bem declarado :)

VB6 é VB6, VB.NET é VB.NET.

Se estás a programar em VB.NET porque estás a ver num livro de VB6?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

Porque é o unico livro de VB que existe na minha escola  👎

Alguem me arranja uma function para o VB2008 que guarde por exemplo em 3horas todas as teclas precionadas por exemplo no internet explorer e no oficce e derivados, qualquer tecla que seja precionada numa aplicaçao tem de ser guardada num  ficheiro de texto... Ajuda??  :bored: 🤔 :bored:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

Precisava mesmo que alguem me facultasse o codigo que necessito para gravar as teclas precionadas no computador enquanto o meu Fomr1 se encontra aberto :S

help plese

:wallbash: tou a dar em loucoo! xD

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Se forem as teclas pressionadas tens o evento KeyDown/KeyPress no Form... k tem um parametro e, que podes utilizar para gravar para o ficheiro...

Agora se é para obteres os dados sobre qualquer tecla pressionada no windows, tens de fazer de outro modo, mas depende qual é o teu objectivo final, não me parece muito correcto teres uma aplicação a detectar tudo o que é teclado num pc.  🤔

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedro_kispert

Keylloger? xD é um projecto meu caro, para keyloger, se é o q estou a pensar, é usado para msn e derivados e nao é isso que eu quero, eu quero um q guarde tudo mesmo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.