Imagine que estou no windows e tenho um prompt de comando do MS-DOS aberto, esse prompt pode estar minimizado na barra, ou aberto msm, só que a questão é que ele não está com o foco, qq outra coisa está focada.
Preciso programaticamente, agir como se o usuário clicasse sobre o prompt na barra de tarefas. Qdo fazemos isso no windows ele abre o prompt e foca. É isso que preciso fazer.
Pode ser algum programa que exista e já faça isso bastando eu passar o nome do que eu quero que ele abra. Pode ser comandos em java por ex, delphi, C++, etc… (ou outra linguagem) ou um comando a ser enviado para o windows, qq coisa assim.
Isso não é tão trivial quanto parece porque a API do Windows que poderia resolver tal problema (SetForegroundWindow), a partir do Windows 98, não funciona sempre. Há um monte de condições que estão descritas na documentação da API
Tem algum exemplo simples? Se bem q vc já disse que não funciona né…
O
Oliveira.caio
Com o visual basic vc consegue fazer isso.
Me adiciona no msn que vou te mandar um exe para ver se atende sua necessidade.
RenataFA
Gente!!!
Brigada por tentarem me ajudar, mas pode deixar. Um amigo meu conseguiu meu ajudar aqui e fizemos. Não foi com java (como eu disse que nem precisava ser).
Agradeço de qq forma.
Grata,
Renata
KWill
Se o problema teria sido resolvido, talvez fosse bom se você pudesse compartilhar a solução com o pessoal aqui do fórum…
Inté.
RenataFA
Aqui está, é que como falei, não é java e o GUJ é um forum de java…
nHwnd := FindWindow(nil,PChar('coloque o nome da janela aqui'));
if nHwnd <> 0 then begin
SendMessage (nHwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
SetForegroundWindow(nHwnd);
end;
OBS: Créditos a João, meu amigo que resolveu o problema!
KWill
RenataFA:
Aqui está, é que como falei, não é java e o GUJ é um forum de java…
nHwnd := FindWindow(nil,PChar('coloque o nome da janela aqui'));
if nHwnd <> 0 then begin
SendMessage (nHwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
SetForegroundWindow(nHwnd);
end;
OBS: Créditos a João, meu amigo que resolveu o problema!
Ainda que esse código acima me pareça delphi/pascal, consegui fazer um porte dele usando JNA:
Interface para a api User32 do Windows:
publicclassWin32NativeUtils{//constantes da api Win32privatestaticintWM_SYSCOMMAND=0x0112;privatestaticintSC_RESTORE=0xF120;privateUser32user32Lib;publicWin32NativeUtils(){user32Lib=(User32)Native.loadLibrary("User32",User32.class);}//Muda o foco para a janela com determinado titulopublicvoidchangeFocusToWindow(StringwindowTitle){inthWnd=user32Lib.FindWindowA(null,windowTitle);if(hWnd!=0){user32Lib.SendMessageA(hWnd,WM_SYSCOMMAND,SC_RESTORE,0);user32Lib.SetForegroundWindow(hWnd);}}}
Omiti os imports da biblioteca JNA nos códigos acima, mas isso não deve ser problema para quem for usar…
Inté.
mauro80
KWill:
RenataFA:
Aqui está, é que como falei, não é java e o GUJ é um forum de java…
nHwnd := FindWindow(nil,PChar('coloque o nome da janela aqui'));
if nHwnd <> 0 then begin
SendMessage (nHwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
SetForegroundWindow(nHwnd);
end;
OBS: Créditos a João, meu amigo que resolveu o problema!
Ainda que esse código acima me pareça delphi/pascal, consegui fazer um porte dele usando JNA:
Interface para a api User32 do Windows:
publicclassWin32NativeUtils{//constantes da api Win32privatestaticintWM_SYSCOMMAND=0x0112;privatestaticintSC_RESTORE=0xF120;privateUser32user32Lib;publicWin32NativeUtils(){user32Lib=(User32)Native.loadLibrary("User32",User32.class);}//Muda o foco para a janela com determinado titulopublicvoidchangeFocusToWindow(StringwindowTitle){inthWnd=user32Lib.FindWindowA(null,windowTitle);if(hWnd!=0){user32Lib.SendMessageA(hWnd,WM_SYSCOMMAND,SC_RESTORE,0);user32Lib.SetForegroundWindow(hWnd);}}}
Omiti os imports da biblioteca JNA nos códigos acima, mas isso não deve ser problema para quem for usar…
Inté.
Olá, parabéns fera!
abs.
bandrade
E qual foi a solução?
KWill
Engraçado, acho que a RenataFA postou o código delphi/pascal no tópico e eu adaptei para Java usando JNA…
Inté.
Leozin
KWill, você testou esse código e tá ok?
eu nem cheguei a testar, mas pelo visto parece que ficou bem animal esse teu código
parabéns
EDIT:
Caralho velho, tu mandou bem demais! Acabei de testar e ficou muito legal!
Tu tem algumas dicas de fontes, livros sei lá, pra lidar com JNA etc? Ou saber mais sobre a API do windows?
T
thingol
Para saber mais sobre a API do Windows, consulte o pai dos burros, aham, o MSDN:
É bom saber um pouco de C para poder entender as especificações da API.
T
thingol
Mas como a Renata deve ter percebido, o código acima nem sempre funciona (muitas vezes ele só faz o botão na taskbar referente à janela ficar piscando). SetForegroundWindow depende de um monte de condições para que funcione do jeito que você quer.
RenataFA
Sim thingol, vc tem razão… só que conseguimos resolver isso, é só mandar o msm comando duas vezes. Na primeira ele seleciona, na segunda ele abre a Janela, ficou perfeito! rs…
KWill
Leozin:
KWill, você testou esse código e tá ok?
eu nem cheguei a testar, mas pelo visto parece que ficou bem animal esse teu código
parabéns
EDIT:
Caralho velho, tu mandou bem demais! Acabei de testar e ficou muito legal!
Tu tem algumas dicas de fontes, livros sei lá, pra lidar com JNA etc? Ou saber mais sobre a API do windows?
Eu testei o código antes de postar, e pelo menos por aqui normalmente funciona, só não testei exaustivamente até achar condições em que o código não funcionasse. Fiquei mesmo dando uma de “code crawler” para achar algumas informações sobre a api do Windows lá no MSDN, conforme indicou o thingol. Eu acabei por adaptar em outra ocasião códigos para abrir/fechar o CDROM, tocar o speaker, tudo usando JNA, mas fazendo com que fosse possível fazer essas coisas também no Linux/Solaris/FreeBSD/OpenBSD/MacOSX, ou seja, as plataformas suportadas pelo JNA. Ainda não consegui testar esses códigos no MacOSX, no Solaris ou no OpenBSD. Para mim foi divertido ir caçando informações sobre como fazer algumas coisas em determinados S.O.s, consultando a documentação de diversos sistemas operacionais. Fiquei até fuçando o código-fonte do OpenSolaris e do FreeBSD…