C/Visual C - Aplicar la propiedad TopMost

 
Vista:
sin imagen de perfil

Aplicar la propiedad TopMost

Publicado por anonymous (8 intervenciones) el 29/10/2006 11:23:43
Hola, la verdad es que he colgado ya esta duda pero no la he visto publicada, no se si hay que esperar un tiempo o si directamente tendria que aparecer. Por lo tanto la voy a colgar tambien en el foro.

Estoy realizando una aplicacion con c++ Builder y necesito que el notepad este
siempre en la ventana primaria, o sea, que no se superponga otra ventana a el.
He conseguido informacion y se puede aplicar con la funcion SetWindowPos, pero no lo
consigo ya que al compilar siempre me da error. Sabe alguien como se aplica esta funcion,
o si hay otra forma de aplicar la propiedad TopMost a una aplicacion?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Aplicar la propiedad TopMost

Publicado por JuanC (57 intervenciones) el 29/10/2006 22:28:48
Creo que este fragmento de código te va a ayudar...

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 desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Aplicar la propiedad TopMost

Publicado por anonymous (8 intervenciones) el 30/10/2006 00:18:00
Muchas gracias, esto es exactamente lo que necesitaba. He copiado el codigo y funciona correctamente. Aunque ahora me ha salido otro problema y es que necesito aplicar lo mismo a otra aplicacion llamada AMCAP y no se que identificador usa y como se puede encontrar.
En lugar de "Notepad" que es lo que debo de colocar?

Un saludo y gracias de nuevo


HWND hWindow;
RECT rect;
hWindow = ::FindWindow("------------------", NULL);
if(hWindow){
::ShowWindow(hWindow, SW_RESTORE);
::GetWindowRect(hWindow, &rect);
::SetWindowPos(hWindow,
HWND_TOPMOST,
70,
105,
638,
470,
SWP_SHOWWINDOW);
SetForegroundWindowEx(hWindow);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Aplicar la propiedad TopMost

Publicado por JuanC (57 intervenciones) el 30/10/2006 00:48:55
Para saber la clase podés usar GetClassName de la API
y si no FindWindow(NULL, "Titulo de la ventana");

Podés buscar todas las ventanas y ver la clase de cada una
Acá va un ejemplo que te puede servir...

bool __stdcall EnumProc(HWND hWnd,/*LPARAM*/long/*lp*/)
{
if(hWnd==NULL) return false;
char Clase[255];
char buffer[255];
char handle[20];
itoa((unsigned int)hWnd, handle, 10);
GetClassName(hWnd, Clase, 255);
int r = GetWindowText(hWnd, buffer, 30);
if(r > 0) strcat(Clase, ": ");
strcat(Clase, buffer);
strcat(Clase, "%");
strcat(Clase, handle);
Form1->Memo1->Lines->Add(Clase);
// SearchWindow(hWnd); //Busca ventanas hijas (opcional)
return true;
}

int level;

HWND SearchWindow(HWND hParent)
{
HWND hChild = ::FindWindowEx(hParent, NULL, NULL, NULL);
char Clase[255], Clase2[255];
char buffer[255];
char handle[20];
while(hChild){
strcpy(Clase, "\t");
for(int i=0; i<level; i++){
strcat(Clase, "\t");
}
GetClassName(hChild, Clase2, 255);
strcat(Clase, Clase2);
itoa((unsigned int)hChild, handle, 10);
int r = GetWindowText(hChild, buffer, 30);
if(r > 0) strcat(Clase, ": ");
strcat(Clase, buffer);
strcat(Clase, "%");
strcat(Clase, handle);
Form1->Memo1->Lines->Add(Clase);
level++;
::SearchWindow(hChild);
hChild = ::FindWindowEx(hParent, hChild, NULL, NULL);
level--;
}
return NULL;
}

void BuscarTodas()
{
long lp = 0;
::EnumWindows((WNDENUMPROC)EnumProc, lp); //Busca todas las ventanas
}

Saludos desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Aplicar la propiedad TopMost

Publicado por anonymous (8 intervenciones) el 30/10/2006 12:53:01
Hola y gracias de nuevo. Me has salvado, tengo que entragar un proyecto electronico en el cual incluyo una aplicacion informatica en 15 dias y solo me faltaba esto.
Funciona genial.

Un saludo desde Zaragoza

Alberto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar