|
Postada em 20/08/2008 21:11 hs
Olá ! Estou desenvolvendo um programa que em determinado momento chama um comando de prompt atraves do procedimento shell, mais ou menos assim... form2.show shell "nome_do_comando.exe", VBHide form2.hide acontece que o form2 fecha antes de terminar a execução do comando chamado pelo shell (o que leva aproximadamente 10 segundos) ele abre e fecha tão rápido que simplesmente o form2 não tem tempo de ser visto, dando a impressão que nem apareceu. gostaria de fazer uma rotina que detectasse o termino do programa chamado pelo shell e só depois fechasse o form2. Se isso não for possivel pelo menos que fechasse somente após 10 segundos aproximadamente, já que é este o tempo que o programa chamado pelo shell demora para ser executado. Por favor, gostaria que fosse postado um exemplo pois tenho pouco conhecimento em vb obrigado
Galera, tenho pouquissímos conhecimentos em VB. Por isso peço que postem as respostas COM EXEMPLOS PRÁTICOS DAS ROTINAS ACONPANHADOS DE COMENTÁRIOS, SEMPRE QUE POSSÍVEL. Por esse motivo tb, peço desculpas por não poder responder muitas mensagens do fórum! Grato a todos!!!
|
|
|
|
Treze
não registrado
|
|
ENUNCIADA !
|
|
|
Postada em 20/08/2008 21:13 hs
Veja esta dica se te ajuda Quando você executa um programa externo ao seu aplicativo VB usando o comando Shell , é interessante que o seu programa VB saiba quando a aplicação executada foi encerrada ou terminou. Vamos mostrar como fazer isto.
1-) Inicie um novo projeto no VB e inclua um módulo no seu projeto. A inclua o seguinte código no módulo:
Public Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Long hStdInput As Long hStdOutput As Long hStdError As Long End Type
Public Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessID As Long dwThreadID As Long End Type
Public Declare Function WaitForSingleObject Lib _ "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds _ As Long) As Long
Declare Function CreateProcessA Lib "kernel32" _ (ByVal lpApplicationName As Long, ByVal lpCommandLine As _ String, ByVal lpProcessAttributes As Long, ByVal _ lpThreadAttributes As Long, ByVal bInheritHandles As Long, _ ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, _ ByVal lpCurrentDirectory As Long, lpStartupInfo As _ STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) _ As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject _ As Long) As Long
Public Const NORMAL_PRIORITY_CLASS = &H20& Public Const INFINITE = -1&
2-) A seguir insira o seguinte código no formulário padrão:
Public Sub ExecCmd(cmdline$) Dim proc As PROCESS_INFORMATION Dim start As STARTUPINFO
'Inicia a strutura STARTUPINFO start.cb = Len(start)
'Inicia a aplicação escolhida para ser executada ret& = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _ NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
'Aguarda a aplicação iniciada terminar ret& = WaitForSingleObject(proc.hProcess, INFINITE) ret& = CloseHandle(proc.hProcess) End Sub
3-) Agora adicione um botão de comando - command1 - ao formulário e no evento click do botão digite o seguinte código:
Private Sub Command1_Click()
MsgBox "Vou iniciar o Notepad"
Call ExecCmd("c:windowsotepad.exe")
MsgBox "O Notepad foi encerrado"
End Sub
O código acima irá executar o programa Bloco de notas ( NotePad.exe ) passando as informações para a sua aplicação quando for encerrado. Você executa o programa através da função ExecCmd informando o nome e local do aplicativo que quer executar...
|
|
|
|
Postada em 20/08/2008 21:25 hs
Puxa ! muito obrigado mesmo ! Valeu !!!
Galera, tenho pouquissímos conhecimentos em VB. Por isso peço que postem as respostas COM EXEMPLOS PRÁTICOS DAS ROTINAS ACONPANHADOS DE COMENTÁRIOS, SEMPRE QUE POSSÍVEL. Por esse motivo tb, peço desculpas por não poder responder muitas mensagens do fórum! Grato a todos!!!
|
|
|
|
Postada em 20/08/2008 22:19 hs
só tem um pequeno probleminha... como no meu caso o programa chamado é um comando de prompt (o wtm32.exe /resync) que sincroniza o relógio do sistema com o servidor da microsoft eu gostaria que ele rodasse "escondidinho", transparente ao usuario... acontece que quando chamo a sub execcmd("C:windowssystem32wtm32.exe /resync") para execurar o programa, abrese uma enorme janela de prompt, e eu gostaria que a janela simplesmente não aparecesse...por isso é que usava o "vbHide" no comando shell. sei que existem outras formas muito mais profissionais de sincronizar o relógio do sistema mas essa é a única que eu testei que NUNCA FALHA MESMO !!! por isso gostaria de uma dica para que o comando de prompt rodasse em "Hide" quando chamada a sub ExecCmd Agradeço se vc puder ajudar mais uma vez amigo !
Galera, tenho pouquissímos conhecimentos em VB. Por isso peço que postem as respostas COM EXEMPLOS PRÁTICOS DAS ROTINAS ACONPANHADOS DE COMENTÁRIOS, SEMPRE QUE POSSÍVEL. Por esse motivo tb, peço desculpas por não poder responder muitas mensagens do fórum! Grato a todos!!!
|
|
|
|
Postada em 21/08/2008 18:12 hs
Acrescente a constante [Public Const SW_HIDE = 0] na sessão General Declarations e adicione uma linha de código abaixo de [start.cb = Len(start)] com o seguinte código:
start.wShowWindow = SW_HIDE
|
|
|
|
Postada em 21/08/2008 18:12 hs
Acrescente a constante [Public Const SW_HIDE = 0] na sessão General Declarations e adicione uma linha de código abaixo de [start.cb = Len(start)] com o seguinte código:
start.wShowWindow = SW_HIDE
|
|
|
|