Dúvida no VB6

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:
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
removeformat.gif
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
 
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...
 
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
 
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:
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.


Muito obrigado pela tua ajuda..Vai-me dar muito jeito para os meus programas..Thanks
Anytime ;)

Cumps [[[[[[]]]]]]
angelofwisdom
 
Última edição:
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...;)
 
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
 
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... ;)
 
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...;)
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!)

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

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. ;)

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... ;)
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
 
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:
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
 
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...
 
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.
 
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
 
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.
 
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
 
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.
 
Back
Topo