Focar no primeiro EXE aberto

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

MarcosV
Usuário Nível 3
Usuário Nível 3
Mensagens: 106
Registrado em: 15 Jun 2005 20:37
Localização: Sorocaba/SP

Focar no primeiro EXE aberto

Mensagem 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
Editado pela última vez por Toledo em 18 Mar 2011 21:59, em um total de 2 vezes.
Marcos Villela
x[H]arbour.org (CVS) | GtWvW+HwGui (CVS) | HbMake | Dbf | Rdd DbfCdx | LeToDb (CVS) (Implantando)
===============================================================
“Quem nunca dormiu à noite e acordou de repente, suando frio e chorando, chorando e
chorando? Se isso lhe aconteceu, então você foi apanhado pelo blues.” (Robert Johnson)
Sweet Home Chicago (Versão Blind Bulldog Blues): www.youtube.com/watch?v=J-V61vQTSZs
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: FOCAR NO PRIMEIRO EXE ABERTO

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
MarcosV
Usuário Nível 3
Usuário Nível 3
Mensagens: 106
Registrado em: 15 Jun 2005 20:37
Localização: Sorocaba/SP

Re: FOCAR NO PRIMEIRO EXE ABERTO

Mensagem 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
Marcos Villela
x[H]arbour.org (CVS) | GtWvW+HwGui (CVS) | HbMake | Dbf | Rdd DbfCdx | LeToDb (CVS) (Implantando)
===============================================================
“Quem nunca dormiu à noite e acordou de repente, suando frio e chorando, chorando e
chorando? Se isso lhe aconteceu, então você foi apanhado pelo blues.” (Robert Johnson)
Sweet Home Chicago (Versão Blind Bulldog Blues): www.youtube.com/watch?v=J-V61vQTSZs
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: FOCAR NO PRIMEIRO EXE ABERTO

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
MarcosV
Usuário Nível 3
Usuário Nível 3
Mensagens: 106
Registrado em: 15 Jun 2005 20:37
Localização: Sorocaba/SP

Re: Focar no primeiro EXE aberto

Mensagem 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)
Marcos Villela
x[H]arbour.org (CVS) | GtWvW+HwGui (CVS) | HbMake | Dbf | Rdd DbfCdx | LeToDb (CVS) (Implantando)
===============================================================
“Quem nunca dormiu à noite e acordou de repente, suando frio e chorando, chorando e
chorando? Se isso lhe aconteceu, então você foi apanhado pelo blues.” (Robert Johnson)
Sweet Home Chicago (Versão Blind Bulldog Blues): www.youtube.com/watch?v=J-V61vQTSZs
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Focar no primeiro EXE aberto

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
MarcosV
Usuário Nível 3
Usuário Nível 3
Mensagens: 106
Registrado em: 15 Jun 2005 20:37
Localização: Sorocaba/SP

Re: Focar no primeiro EXE aberto

Mensagem 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
Marcos Villela
x[H]arbour.org (CVS) | GtWvW+HwGui (CVS) | HbMake | Dbf | Rdd DbfCdx | LeToDb (CVS) (Implantando)
===============================================================
“Quem nunca dormiu à noite e acordou de repente, suando frio e chorando, chorando e
chorando? Se isso lhe aconteceu, então você foi apanhado pelo blues.” (Robert Johnson)
Sweet Home Chicago (Versão Blind Bulldog Blues): www.youtube.com/watch?v=J-V61vQTSZs
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Re: Focar no primeiro EXE aberto

Mensagem por janio »

MarcosV,

Aqui pra mim esse seu codigo num funcionou nao!

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Responder