Página 1 de 1
Focar no primeiro EXE aberto
Enviado: 18 Mar 2011 19:58
por MarcosV
Oi Pessoal,
Alguem sabe como focar no primeiro exe aberto ?
Exemplo: Abro um exe com o nome de Teste.exe, ele abre normalmente, mas na segunda vez que for abrir o mesmo exe (com o primeiro ja aberto), o programa fecha e foca no primeiro exe aberto.
Tentei o codigo abaixo, mas não rolou.
Código: Selecionar todos
FUNCTION TRAVAJANELA()
LOCAL lRet:=(.T.)
IF ( Empty(handle:=CreateMutex(,.T.,StrTran(GetModuleFileName(),"\","_"))) .Or. (GetLastError() > 0 ) )
lRet:=(.F.)
&&ALERT( "SISTEMA EM EXECUÇÃO!")
SetActiveWindow( handle ) && Assim Não Deu Certo
QUIT
ENDIF
RETURN(lRet)
Obrigado
Nota de Moderação:por
Maligno: Mensagem editada para colocar a tag [ code ]
Veja como utilizar esta tag: faq.php?mode=bbcode#f2r1
Re: FOCAR NO PRIMEIRO EXE ABERTO
Enviado: 18 Mar 2011 20:08
por Maligno
O
handle em questão é do Mutex e não da janela. Mesmo porque, se adentrar o bloco do
IF esse
handle pode estar vazio. Se bem que se
GetLastError() retornar um valor, este
handle deverá estar vazio mesmo. Você pode descobrir o
handle da janela alvo de várias formas; a mais fácil pelo seu título.
Não sei se ajuda, mas em C++ eu faço o seguinte num aplicativo de internet: se o título já existir, barro a execução de uma nova instância. Mas antes, verifico se está minimizado. Se estiver, restauro e por fim, mudo o foco para ele. O código:
Código: Selecionar todos
HWND hWnd = FindWindow(NULL,Title.c_str());
if (hWnd) {
if (IsIconic(hWnd)) {
SendMessage(hWnd,WM_SYSCOMMAND,SC_RESTORE,0L);
}
SetForegroundWindow(hWnd);
return 0;
}
Pelo menos dá pra ter uma idéia.

Se o título da sua aplicação é um texto (simples e fixo) que seguramente não se repetirá em nenhum outro programa, não precisa usar Mutex.
Em tempo: faço esta verificação
ANTES da minha aplicação atribuir o título ao formulário. Se fizesse depois, o Windows poderia me retornar o
handle da própria aplicação, o que tornaria esse esquema inútil.
Re: FOCAR NO PRIMEIRO EXE ABERTO
Enviado: 18 Mar 2011 21:05
por MarcosV
Oi Maligno,
É exatamente isso que quero fazer!!!
Pena que não sei como adaptar seu codigo em xHarbour, mas deu pra ter uma ideia.
to fazendo uns testes aqui.
Uma pergunta, nessa função que coloquei de exemplo:
IF ( Empty(handle:=CreateMutex(,.T.,StrTran(GetModuleFileName(),"\","_"))) .Or. (GetLastError() > 0 ) )
&& AQUI NAO DARIA PARA COLOCAR EM FOCO A PRIMEIRA EXECUÇÃO DO EXE EM BASE NO handle do mutex
&&SetActiveWindow( handle ) && Assim Não Deu Certo
QUIT
ENDIF
Valew
Re: FOCAR NO PRIMEIRO EXE ABERTO
Enviado: 18 Mar 2011 21:59
por Maligno
Não. É como eu disse: criar o Mutex tem como retorno o handle do Mutex. Não tem a ver com a janela. Você precisa ter o handle da janela para pô-la à frente. Aliás, uma informação adicional: após a criação bem sucedida do Mutex e após seu uso, você precisa fechar seu handle por meio da função CloseHandle(), da API do Windows.
Re: Focar no primeiro EXE aberto
Enviado: 20 Mar 2011 04:12
por MarcosV
Oi Maligno,
Obrigado pelas informações, mesmo não entendendo quase nada da api do windows, fui pesquisando muito, e pelas suas dicas consegui fazer funcionar do jeito que estava querendo, se você ou alguém tiver alguma dica ou correção pra melhorar, fiquem a vontade.
Esta ai o código pra quem se interessar.
Código: Selecionar todos
#include "windows.ch"
FUNCTION HB_TRAVAJANELA()
LOCAL hWnd, cNomeSistema:="sistema"
IF ( Empty(handle:=CreateMutex(,.T.,StrTran(GetModuleFileName(),"\","_"))) .Or. (GetLastError() > 0 ) )
CloseHandle(handle)
hWnd := dllcall("USER32.DLL",32,"FindWindow", ,cNomeSistema) &&FindWindow( , cNomeSistema )
IF IsIconic(hWnd) ; SendMessage(hWnd,WM_SYSCOMMAND,SC_RESTORE,0L) ; ENDIF
SetForegroundWindow(hWnd)
__Quit()
ENDIF
RETURN(NIL)
Re: Focar no primeiro EXE aberto
Enviado: 20 Mar 2011 08:50
por Maligno
Apenas atente para o fato de que se Mutex não foi criado, você não precisa fechá-lo. Se foi criado, significa que é a primeira instância do programa. Então, feche-o depois, colocando o CloseHandle() imediatamente antes do return da última linha.
Re: Focar no primeiro EXE aberto
Enviado: 22 Mar 2011 19:53
por MarcosV
Obrigado Maligno, ficou do jeito que eu queria.
Aproveitando a oportunidade, tenho mais uma duvida que teoricamente seria simples de resolver, mas estou esgotando as tentativas e nada.
Tenho uma função que atualiza o exe via http, até ai funciona legal, o que não consigo é fechar o exe aberto e abrir o novo, tem alguma função que abre o exe (novo) depois de um certo tempo (para dar um tempo do exe antigo fechar) ?
Obrigado
Re: Focar no primeiro EXE aberto
Enviado: 24 Mar 2011 07:15
por janio
MarcosV,
Aqui pra mim esse seu codigo num funcionou nao!
Janio