SoloCodigo

Programación General => C/C++ => C++ Builder => Mensaje iniciado por: alloger en Martes 17 de Octubre de 2006, 23:26

Título: Duda En Aplicacion
Publicado por: alloger en Martes 17 de Octubre de 2006, 23:26
Hola, en la aplicacion que estoy desarrollando con c++ builder ejecuto mediante un boton una aplicacion externa, abro un *.exe con el comando ShellExecute();

Cuando se ejecuta se abre en su ventana independiente a mi aplicacion pero cuando pulso algun boton de la aplicacion de c++ esta se pone como ventana principal y el *.exe se queda oculto detras como es logico. Lo que pretendo es si se puede hacer que la aplicacion externa a la mia de c++ este siempre por encima, indistintamente si estoy trabajando con una ventana o con otra. No se si se puede resolver mediante programacion o simplemente se realiza con alguna opcion desde windows.



Un saludo
Título: Re: Duda En Aplicacion
Publicado por: Eternal Idol en Sábado 21 de Octubre de 2006, 14:35
Podes usar SetWindowsPos y HWND_TOPMOST:

http://search.msdn.microsoft.com/search/Re...etwindowpos.asp (http://search.msdn.microsoft.com/search/Redirect.aspx?title=SetWindowPos+Function&url=http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setwindowpos.asp)
Título: Re: Duda En Aplicacion
Publicado por: alloger en Domingo 22 de Octubre de 2006, 06:11
Gracias por responder. He estado mirando la opcion de TopMost pero solo he encontrado ejemplos para que esten siempre por encima aplicaciones realizadas desde c++, o sea, aplicarlo a los formularios, pero no he encontrado nada para aplicar esta opcion desde c++ builder a una aplicacion externa como puede ser el notepad desde c++.

En estos momentos en un boton tengo esto:

String aux;
ShellExecute(NULL, "open","d:\\PROYECTO FINAL\\notepad.exe", aux.c_str(), NULL, SW_SHOWNORMAL);

Asi que cada vez que hago un 'clic' en ese boton me ejecuta el notepad, es en este notepad el que quiero que este siempre por encima.
Es posible esto? Si sabes seguro que si cercioramelo por favor para seguir buscando informacion. O si tu tienes que me digas mas enlaces.

Un saludo y gracias
Título: Re: Duda En Aplicacion
Publicado por: Eternal Idol en Domingo 22 de Octubre de 2006, 08:59
ESE es el enlace que necesitas, los formularios como tales no existen, en Windows hay ventanas y cada ventana tiene un identificador HWND. Seguramente tendras que usar FindWindow para conseguir el HWND del Notepad y despues podras usar la funcion del enlace que te deje arriba.

http://msdn.microsoft.com/library/default....etwindowpos.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setwindowpos.asp)
Título: Re: Duda En Aplicacion
Publicado por: alloger en Lunes 23 de Octubre de 2006, 01:03
Hola de nuevo. No se si me estoy excediendo pero me gustaria que me ayudases con el codigo. No soy capaz de obtener el HWND de la aplicacion que uso.

Para darle la opcion TopMost uso la funcion:

BOOL SetWindowPos(
        ----------,
        HWND_TOPMOST,
        12,
        12,
        700,
        500,
        SWP_SHOWWINDOW
        );

Pero el primer apartado de la funcion (---------) no soy capaz de obtenerlo.

Con la funcion:

HWND FindWindow(------, ------- );
Tengo problemas ya que siempre me da error de compilacion y no consigo arreglarlo.

Necesito obtener el HWND de la aplicacion notepad y de una aplicacion de captura de imagen llamada AMCAP.exe.

Un saludo y gracias
Título: Re: Duda En Aplicacion
Publicado por: Eternal Idol en Lunes 23 de Octubre de 2006, 09:50
Codigo logico para empezar (MUY SIMPLE):

Código: Text
  1.  
  2. HWND searchClass(LPCTSTR ClassName)
  3. {
  4.   //esto es una sola linea de codigo que usa FindWindow
  5. }
  6.  
  7. void makeTop(HWND Window)
  8. {
  9.   //esto tambien es una sola linea de codigo
  10.   //aprovecha los flags que no necesitan cambiar el tamaño ni la posicion de la ventana
  11. }
  12.  
  13. //uso para el notepad
  14. void main()
  15. {
  16.   HWND Destino = searchClass("Notepad"); //ojo, esto lo obtuve con el Spy++ no es casualidad ni tiene porque llamarse asi
  17.   if (Destino)
  18.   {
  19.     makeTop(Destino);
  20.   }
  21. }
  22.  
  23.  


Todo lo que necesitas esta en estos dos enlaces:

http://msdn.microsoft.com/library/default....etwindowpos.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setwindowpos.asp)

http://msdn.microsoft.com/library/default....etwindowpos.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setwindowpos.asp)
Título: Re: Duda En Aplicacion
Publicado por: alloger en Martes 31 de Octubre de 2006, 15:29
Ya esta solucionado esto tambien. Con este codigo aplico la propiedad TopMost a una ventana desde C++ Builder:

void SetForegroundWindowEx(HWND hWnd)
{
int tThread, sThread;
tThread = ::GetWindowThreadProcessId(::GetForegroundWindow(), NULL);
sThread = ::GetCurrentThreadId();
::AttachThreadInput(sThread, tThread, true);
::SetForegroundWindow(hWnd);
::AttachThreadInput(sThread, tThread, false);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND hWindow;
RECT rect;
hWindow = ::FindWindow("Notepad", NULL);
if(hWindow){
//::ShowWindow(hWindow, SW_RESTORE);
::GetWindowRect(hWindow, &rect);
::SetWindowPos(hWindow,
HWND_TOPMOST,
rect.left,
rect.top,
rect.right - rect.left,
rect.bottom - rect.top,
SWP_SHOWWINDOW);
//SetForegroundWindowEx(hWindow);
}
}


Saludos
Título: Re: Duda En Aplicacion
Publicado por: Eternal Idol en Martes 31 de Octubre de 2006, 15:32
SetForegroundWindowEx no hace falta verlo ya que es para otra cosa y GetWindowRect no lo necesitas. Como te decia en el comentario del codigo: "//aprovecha los flags que no necesitan cambiar el tamaño ni la posicion de la ventana". Podes usar SWP_NOMOVE y SWP_NOSIZE junto a SWP_SHOWWINDOW y obvias los campos x, y, cx y cy.
Título: Re: Duda En Aplicacion
Publicado por: alloger en Martes 31 de Octubre de 2006, 16:33
Vale, entendido. Depuraré el codigo para que no sea tan extenso eliminando todo esto que me comentas.
Título: Re: Duda En Aplicacion
Publicado por: Eternal Idol en Martes 31 de Octubre de 2006, 16:49
Cita de: "alloger"
Vale, entendido. Depuraré el codigo para que no sea tan extenso eliminando todo esto que me comentas.
No, no, decia que no nos hace falta verlo a nosotros (el codigo de SetForegroundWindowEx) ya que no tiene nada que ver con la duda  :P No lo elimines sino queres, lo que si es recomendable es lo otro, no obtener las posiciones y tamaños pudiendo pasarle 0 y los flags necesarios.

Por otro lado me parece que confundis "optimizar" con "depurar" ... depurar significa seguir la ejecucion de un programa mediante una herramienta llamada depurador ... y optimizar si es lo que comentabas.