1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Dúvida no VB6

Discussão em 'Programação' iniciada por WinAce_Boy, 27 de Outubro de 2006. (Respostas: 25; Visualizações: 2665)

  1. WinAce_Boy

    WinAce_Boy Power Member

    Oi pessoal, acabei de me registar agora mesmo na techzone e não me arrependi (grande fórum!)...Trabalho com o Visual Basic (só na versão 6) por volta de meio ano, penso que sei o básico, e é muito fixe trabalhar nele....Tenho uma dúvida no Visual Basic 6 que é a seguinte:

    Como faço para quando se clica num botão, abre um ficheiro (uma música por exemplo)...

    Agradeço a vossa atenção e se possível, a ajuda.
    Abraços a todos..
     
    Última edição: 27 de Outubro de 2006
  2. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Hey! Bem Vindo ao Techzone :)

    Quanto à pergunta podes utilizar a API ShellExecute.

    Verifica esta thread (que poderias ter encontrado se fizesses Search): http://www.techzonept.com/showthread.php?t=106573&highlight=ShellExecute

    E não escrevas a branco, porque há gente aqui no fórum que tem um fundo branco, e temos de marcar isso para perceber. Não escolhas nenhuma cor (quando editares o teu post, carrega no botão [​IMG] para removeres a formatação) e ele escolhe a cor automaticamente para cada fundo ;) (cor branca para fundo preto e vice-versa)

    edit - a thread em questão fala de abrir páginas web. No entanto, o procedimento é exactamente o mesmo, e em vez de escolheres o URL do site, escreves o programa a abrir e os parâmetros.

    Cumprimentos [[[[[[[[]]]]]]]]
    angelofwisdom
     
  3. WinAce_Boy

    WinAce_Boy Power Member

    Muitíssimo obrigado, ainda não estou muito familiarizado com o API do windows por isso optei por escolher a maneira que não a utiliza... :)
    Peço imensa desculpa mas sem querer modifiquei a cor e depois não sabia como por em automático e por isso pús no mais parecido (branco), obrigado pela dica ;).
    Cumprimentos...
     
  4. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    E agora, um conselho:
    Tudo bem que não estás familiarizado com a API do Windows. Mas enquanto não a usares, não te familiarizas com ela, e provavelmente vais precisar mais tarde ;)

    Basicamente, o que necessitas é de duas coisas: a DECLARAÇÃO:
    Código:
    Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
                                                                         ByVal lpOperation As String, _
                                                                         ByVal lpFile As String, _
                                                                         ByVal lpParameters As String, _
                                                                         ByVal lpDirectory As String, _
                                                                         ByVal nShowCmd As Long) As Long
     
    O que tens no programa? Apenas um form?
    Então declaras como Private (Private Declare .....)

    Tens módulos? Neles, podes declarar como Public (caso uses fora do módulo) ou Private (caso só uses esta função dentro do módulo). Assim como tens o "Form" "Load", tens o "(General)" "(Declarations)". É aí que fica.


    Depois, tendo a função, chama-la sempre que quiseres. Só tens de escrever
    ShellExecute Me.hwnd, "open", "http://www.google.pt", vbNullString, vbNullString, 0

    ou, fazes uma sub:

    Private Sub AbrirPrograma(programa as String)
    ShellExecute Me.hwnd, "open", programa, vbNullString, vbNullString, 0
    End Sub

    E chamas como
    AbrirPrograma "taskmgr.exe"

    Simplifica-te o trabalho. É mais complexo, mas também é mais seguro.

    Ao fazeres o Shell "cmd" estás a abrir a Linha de Comandos para por sua vez abrir o teu programa.
    Qual achas mais rápido?

    Programa A -> cmd -> Programa B

    ou

    Programa A -> Programa B

    ?
    É aí que reside a diferença ;)

    Cumps [[[[[[]]]]]]
    angelofwisdom
     
  5. WinAce_Boy

    WinAce_Boy Power Member

    Muito obrigado pela tua ajuda..Vai-me dar muito jeito para os meus programas..Thanks
    Eu tenho um manual do VB6 mas há sempre aquelas dúvidas em que uma pessoa fica um pouco confusa... :).
    Abraços
    Só uma pequena questão: O que são módulos? Desculpem a minha "Rookiness"
     
    Última edição: 27 de Outubro de 2006
  6. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Estou a ver que só trabalhas com Forms :)

    Estás a fazer perguntas cada vez mais difíceis de responder por um fórum....

    Normalmente, usas Forms. Podes ter vários forms. Cada um com a sua função.

    Agora, imagina a própria sub AbrirPrograma. Não dá jeito estares a copiar a declaração e a sub para cada um dos forms, certo?
    Então, usas um módulo, que contém essa sub. Sendo ela pública, ela pode ser chamada em qualquer ponto do programa - e portanto dentro de qualquer form.

    edit - não podes ter nada declarado como Public num form.

    Normalmente, subs e funções colocam-se em módulos, a menos que não sejam necessárias fora do form onde as pões.


    Anytime ;)

    Cumps [[[[[[]]]]]]
    angelofwisdom
     
    Última edição: 27 de Outubro de 2006
  7. WinAce_Boy

    WinAce_Boy Power Member

    Ok, axo que já percebi... Mas para todas as chamadas da API do windows precisam de ter este código? ou é só esta chamada (ShellExecute)?

    Código:
    Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _
                                                                         ByVal lpOperation As String, _
                                                                         ByVal lpFile As String, _
                                                                         ByVal lpParameters As String, _
                                                                         ByVal lpDirectory As String, _
                                                                         ByVal nShowCmd As Long) As Long
     
    Estou cheio de dúvidas mas tenho medo que se fartem de me ouvir, a falar de coisas muito básicas sobre vb...Obrigado pela tua paciência man...;)
     
  8. HecKel

    HecKel The WORM

    Boas!

    Sobre os módulos..., os módulos na sua essencia acabam por ser o que o angelofwisdom disse, no entanto convem ter em consideração o motivo porque existem. De facto convem organizar as funções auxilares em módulos, agrupando as mesmas consoante um tema/area e evitando misturar alhos com bugalhos. Se usares um único módulo para todas as tuas funções chega a uma altura que nem tu te entendes com tantas funções, agora imagina um outro programador que agarre nesse programa a seguir a ti...

    Outro motivo para a utilização de módulos é a sua portatibilidade. Nunca te aconteceu usares funções iguais em programas distintos? Com um módulo devidamente organizado basta-te incluires esse ficheiro no novo projecto que ficas com umas boas horas de trabalho poupadas :)

    abraços, HecKel
     
  9. WinAce_Boy

    WinAce_Boy Power Member

    Ok, empenhei-me mais na maneira que incluia a API e consegui..É muito fixe.
    Eu programei um botão para ele me abrir uma música...mas depois não consigo arranjar maneira de parar a música..Help please...
    Obrigado pela atenção... ;)
     
  10. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    1) Esse código serve exclusivamente para a função ShellExecute. É a API do ShellExecute. Para outras funções, acrescentas as respectivas declarações ;)
    2) Tens dúvidas? Coloca-as :) é para isso que estamos aqui :-D por mais básicas (ou não) que sejam ;) (pelo menos a mim não incomodas nada ;) e duvido que incomodes mais alguém por aqui, portanto feel free to speak!)

    E o HecKel disse practicamente tudo o que eu acabei por não dizer com medo de ficar confuso :D

    Quando crias funções que acedem ao registry duma forma mais básica do que pela API, não precisas de estar a escrever sempre estas funções. Ligas ao programa um módulo que já as tem a todas. O mesmo módulo pode ser partilhado entre projectos sem problemas. Assim, como o HecKel disse, tens tudo o que precisas no mesmo módulo.
    Agora, para quê ter vários módulos... podes ter um para chamadas ao registry; um para as declarações e funções próprias para o teu programa... um para o CSocketMaster (no meu caso é quase sempre :-D) e etc... (= agrupar por temas)
    assim o source fica com uma organização melhor e poupas tempo e espaço a re-escrever ou copiar-colar funções. ;)

    Hmmm abres a música num programa como o Media Player, correcto? Se sim, a única forma de parares a música seria... 1) se for o WMP, terias de fazer um plugin que controlaria isso.... 2) se não for, terias de mandar o programa abaixo (End Task), algo que eu desaconselho...
    Como (e onde) está a música a tocar?

    Cumprimentos [[[[[[[[[[]]]]]]]]]]
    angelofwisdom
     
  11. WinAce_Boy

    WinAce_Boy Power Member

    Exactamente no WMP...E não me aparece o windows media player, não aparece nada...Só o consigo parar abrindo o gestor de tarefas e terminar o processo (wmp.exe)
    Como o faço e o que é um plugin?
     
    Última edição: 28 de Outubro de 2006
  12. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Um plugin = plug+in = "Ligar em" ;) é um programa que se junta ao WMP e "controla"-o à vontade. Um exemplo é o plugin do MSN no WMP - com ele, consegues saber qual a música que o utilizador está a tocar no momento.
    Não te aconselho a fazeres um plugin. Até porque nem sei se será possível fazer um em VB.

    Acho que o melhor que podes fazer é pegar no Handle que te é devolvido com o ShellExecute e usá-lo para mandar abaixo a aplicação :( mas é um workaround muito perigoso.
    Algo do género:

    - hWnd = ShellExecute(blablabla) -> isto chama o ShellExecute com os parâmetros passados, como normalmente, e retorna o handle do processo para a variável hWnd, declarada como uma Long.

    e quando quiseres desligar o programa:

    - SetForegroundWindow hWnd
    - SendKeys "%{F4}"

    desta forma, chamas a janela em hWnd (portanto, a tua) e envias os caracteres Alt+F4. É um workaround, porque eu melhor não te consigo fazer :(

    API: SetForegroundWindow
    o SendKeys é interno do VB ;)

    Cumps [[[[[[[[]]]]]]]]
    angelofwisdom
     
  13. WinAce_Boy

    WinAce_Boy Power Member

    Ok, obrigadão..
     
  14. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Mas conseguiste fazer tudo o que eu te disse no post anterior, ou precisas de ajuda em mais alguma coisa?... é que tenho a sensação de que está demasiado confuso...
     
  15. JomarB

    JomarB Power Member

    Inacreditavel

    Caro Angelofwisdom eu gostaria d saber que fizeste para aprender a trabalhar com as API sebe, e que eu nao consigo :'( .
    Se tiver algum truque diga por favor.
     
  16. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Eu aprendi com a experiência ... nunca tive uma única aula que seja de programação. Não há um truque próprio (penso eu)....

    É o seguinte: a API, muito basicamente, é um conjunto de funções disponibilizadas pelo Windows. Tu limitas-te a declarar as funções (dizes que elas existem), e depois apenas usas....

    Em lugar da SetForegroundWindow, usa a SetActiveWindow que trabalha da mesma forma, mas tem uma função diferente (não deixa a janela à frente, mas "activa"-a)

    Por passos:

    Precisas da declaração. Encontra-la no link que te dei acima (sobre o SetActiveWindow).
    Tendo a declaração, sabes como se usa. SetActiveWindow hWnd. O que é o hWnd? É a identificação da janela que queres "activar".
    Como apanhas essa identificação?
    Ora ... queres fechar uma janela que tu abriste, certo?
    Como a abriste? Com o ShellExecute.
    Ora, o ShellExecute retorna a identificação da janela (hWnd = ShellExecute(.....) )
    Essa é a identificação que precisas para activá-la.

    Portanto

    hWnd = ShellExecute(blablabla)
    SetActiveWindow hWnd
    SendKeys "%{F4}"

    É só isso.

    Não consigo arranjar uma forma mais simples de explicar as coisas. Mas acho que está já bastante explícito a forma como a(lguma) API trabalha.

    Cumprimentos [[[[[[[[[[]]]]]]]]]]]
    angelofwisdom
     
  17. WinAce_Boy

    WinAce_Boy Power Member

    lol, não se trata de confusidade..
    Eu consegui fazer tudo o que disseste até agora, mas não sei qual delas a melhor opção: uma é perigosa, outra não me aconselhas... Lmao.
     
  18. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Pois foi ... mas não aconselho a fazer um plugin porque em VB nem sei se é possível.
    O perigoso é desligar o WMP com o sendkeys. Perigoso .... ok, desaconselhado, já que não causa problemas.

    No entanto, sê razoável. Se o plugin é quase impossível, e o outro método não causa grandes problemas, bem ... para o que queres, penso que só o sendkeys do Alt+F4 é que te irá dar jeito ;)
    Usa-o enquanto ninguém aparecer por aqui com uma forma melhor de fazer as coisas.

    Cumps [[[[[[[[]]]]]]]]
    angelofwisdom
     
  19. WinAce_Boy

    WinAce_Boy Power Member

    Parece que ninguém sabe uma forma melhor.. mas ok, eu vou utilizar o sendkeys.
    Obrigadão moço. ;)
     
  20. WinAce_Boy

    WinAce_Boy Power Member

    Encontrei certas dificuldades..
    1- o que é o "blablabla"(lol)
    2- onde ponho isto:

    hWnd = ShellExecute(blablabla)
    SetActiveWindow hWnd
    SendKeys "%{F4}"

    Deixa-me ver se estou a perceber:

    Então, declaro a ShellExecute e depois uso-a e abro um outro programa, depois declaro exactamente como está aqui: "Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long" e depois uso isto:

    hWnd = ShellExecute(blablabla)
    SetActiveWindow hWnd
    SendKeys "%{F4}"

    Certo?
    Aguardo resposta.
    Obrigado pela atenção.
     

Partilhar esta Página