[RESOLVIDO] - Focar um Prompt do DOS

Tenho um problema que preciso resolver urgentão…

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.

Alguém sabe como ?

Grata,
Renata

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

SetForegroundWindow Function

AllowSetForegroundWindow Function

Não faço idéia de como usar isso…

Tem algum exemplo simples? Se bem q vc já disse que não funciona né…

Com o visual basic vc consegue fazer isso.

Me adiciona no msn que vou te mandar um exe para ver se atende sua necessidade.

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

Se o problema teria sido resolvido, talvez fosse bom se você pudesse compartilhar a solução com o pessoal aqui do fórum…

Inté.

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! :wink:

[quote=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! :wink: [/quote]
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:

public interface User32 extends Library 
{
	public int FindWindowA(String lpClassName, String lpWindowName);
	public boolean SendMessageA(int hWnd, int Msg, int wParam, int lParam);
	public boolean SetForegroundWindow(int hWnd);
}

Classe para usar:

public class Win32NativeUtils
{
	//constantes da api Win32
	private static int WM_SYSCOMMAND = 0x0112;
	private static int SC_RESTORE = 0xF120;
	private User32 user32Lib;

	public Win32NativeUtils()
	{
		user32Lib = (User32) Native.loadLibrary("User32", User32.class);
	}

	//Muda o foco para a janela com determinado titulo
	public void changeFocusToWindow(String windowTitle)
	{
		int hWnd = 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é.

[quote=KWill][quote=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! :wink: [/quote]
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:

public interface User32 extends Library 
{
	public int FindWindowA(String lpClassName, String lpWindowName);
	public boolean SendMessageA(int hWnd, int Msg, int wParam, int lParam);
	public boolean SetForegroundWindow(int hWnd);
}

Classe para usar:

public class Win32NativeUtils
{
	//constantes da api Win32
	private static int WM_SYSCOMMAND = 0x0112;
	private static int SC_RESTORE = 0xF120;
	private User32 user32Lib;

	public Win32NativeUtils()
	{
		user32Lib = (User32) Native.loadLibrary("User32", User32.class);
	}

	//Muda o foco para a janela com determinado titulo
	public void changeFocusToWindow(String windowTitle)
	{
		int hWnd = 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é.[/quote]

Olá, parabéns fera!
abs.

E qual foi a solução?

Engraçado, acho que a RenataFA postou o código delphi/pascal no tópico e eu adaptei para Java usando JNA…

Inté.

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 :stuck_out_tongue:

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?

Para saber mais sobre a API do Windows, consulte o pai dos burros, aham, o MSDN:

http://msdn.microsoft.com/en-us/library/aa139672.aspx

É bom saber um pouco de C para poder entender as especificações da API.

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.

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…

[quote=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 :stuck_out_tongue:

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?[/quote]

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…

Inté.