View Full Version : Dúvida no VB6


WinAce_Boy
27-10-2006, 20:22
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..

Kayvlim
27-10-2006, 20:47
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 http://www.techzonept.com/images/styles/bluebreeze/editor/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

WinAce_Boy
27-10-2006, 21:18
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...

Kayvlim
27-10-2006, 21:36
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:
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

WinAce_Boy
27-10-2006, 21:53
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"

Kayvlim
27-10-2006, 21:59
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

WinAce_Boy
28-10-2006, 00:04
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)?

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

HecKel
28-10-2006, 04:23
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

WinAce_Boy
28-10-2006, 15:53
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... ;)

Kayvlim
28-10-2006, 19:41
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)?

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

WinAce_Boy
28-10-2006, 20:57
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?

Kayvlim
29-10-2006, 20:01
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 (http://www.allapi.net/apilist/SetForegroundWindow.shtml) 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 (http://www.allapi.net/apilist/SetForegroundWindow.shtml)
o SendKeys é interno do VB ;)

Cumps [[[[[[[[]]]]]]]]
angelofwisdom

WinAce_Boy
03-12-2006, 19:47
Ok, obrigadão..

Kayvlim
04-12-2006, 13:43
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...

JomarB
04-12-2006, 19:05
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.

Kayvlim
04-12-2006, 21:02
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 (http://www.allapi.net/apilist/SetActiveWindow.shtml) 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

WinAce_Boy
11-12-2006, 21:51
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.

Kayvlim
11-12-2006, 22:21
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

WinAce_Boy
15-12-2006, 13:13
Parece que ninguém sabe uma forma melhor.. mas ok, eu vou utilizar o sendkeys.
Obrigadão moço. ;)

WinAce_Boy
17-12-2006, 19:52
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.

Kayvlim
17-12-2006, 20:51
Lá em cima trabalhaste com o ShellExecute. Eu apenas pus blablabla porque devia estar com pressa :x peço desculpa.
Portanto,
hWnd = ShellExecute(Me.hwnd, "open", "wmplayer", vbNullString, vbNullString, 0)
Isto abre o programa "wmplayer" - Windows Media Player.

Noutro local (até pode ser dentro dum timer), fazes
SetActiveWindow hWnd '< Isto traz a janela em hWnd (neste caso, o programa que abriste) para o topo (passa a ser a janela actual)
SendKeys "%{F4}" '< Isto faz Alt+F4 e termina o programa.

Não ponhas as três linhas juntas, senão abres e fechas um programa muito rapidamente. Faz, por exemplo, um Form novo, com um botão para abrir um novo programa, e um botão para terminar o programa aberto.
Não te esqueças que tens, neste caso, de declarar hWnd como Private na parte Declarations

Relembro que isto é um workaround. Há formas melhores de fazer. O problema está em eu não ser nenhum profissional.

Se precisares, eu faço-te o código. No entanto, prefiro que o tentes fazer tu mesmo ;)

Cumps [[[[[[[[]]]]]]]]
angelofwisdom

WinAce_Boy
17-12-2006, 21:19
P.F. diz-me onde devo pôr cada uma dessas coisas.
Tx.

WinAce_Boy
24-02-2007, 19:55
Desculpa não ter avisado antes angelofwisdom:

já consegui!!!!! à muito tempo até...
lol sry

WinAce_Boy
02-05-2007, 17:06
oi, podesme fazer o codigo por favor e que perdi o meu.. ;
please.. abraços man

Kayvlim
05-05-2007, 15:30
oi, podesme fazer o codigo por favor e que perdi o meu.. ;
please.. abraços man
Queres que te faça o código exactamente do quê?
E, se já tinhas conseguido fazer uma vez, com certeza consegues fazer de novo. Na programação não há "sorte" ;)

WinAce_Boy
05-05-2007, 16:08
LOL! tu a dizeres isso e eu a acabar de conseguir fazer o código.. hA e desculpa..lol eliminei sem querer o resto do post..o código é o da setactivewindow;)
Obrigadao na mesma