• Sábado 14 de Diciembre de 2024, 23:49

Autor Tema:  Duda En Aplicacion  (Leído 3806 veces)

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Duda En Aplicacion
« en: Martes 17 de Octubre de 2006, 23:26 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda En Aplicacion
« Respuesta #1 en: Sábado 21 de Octubre de 2006, 14:35 »
0
Podes usar SetWindowsPos y HWND_TOPMOST:

http://search.msdn.microsoft.com/search/Re...etwindowpos.asp

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Duda En Aplicacion
« Respuesta #2 en: Domingo 22 de Octubre de 2006, 06:11 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda En Aplicacion
« Respuesta #3 en: Domingo 22 de Octubre de 2006, 08:59 »
0
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

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Duda En Aplicacion
« Respuesta #4 en: Lunes 23 de Octubre de 2006, 01:03 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda En Aplicacion
« Respuesta #5 en: Lunes 23 de Octubre de 2006, 09:50 »
0
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....etwindowpos.asp

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Duda En Aplicacion
« Respuesta #6 en: Martes 31 de Octubre de 2006, 15:29 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda En Aplicacion
« Respuesta #7 en: Martes 31 de Octubre de 2006, 15:32 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

alloger

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Duda En Aplicacion
« Respuesta #8 en: Martes 31 de Octubre de 2006, 16:33 »
0
Vale, entendido. Depuraré el codigo para que no sea tan extenso eliminando todo esto que me comentas.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Duda En Aplicacion
« Respuesta #9 en: Martes 31 de Octubre de 2006, 16:49 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.