[?] HWND a String (Otra Cosita)

Iniciado por MeCraniDOS, 26 Julio 2013, 21:07 PM

0 Miembros y 1 Visitante están viendo este tema.

MeCraniDOS

Buenas, como el titulo dice, solo quiero saber como convertir de HWND a String, me explico, yo tengo este source sacado de aquí: https://foro.elhacker.net/programacion_cc/source_cambiar_el_titulo_de_todas_las_ventanas_por_el_titulo_que_queramos_xd-t202613.0.html

Ahora lo que quiero, es que al cambiar el titulo de la ventana activa, que se añada lo que yo quiero al final, es decir, si la ventana activa pone Hola, y yo quiero añadir Adiós, quede Hola - Adiós, es decir, Añadir - Adios, el codigo es este:

Código (cpp) [Seleccionar]


#include <stdio.h>
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
     HWND activa;
     HWND nonactive = NULL;

     activa=GetForegroundWindow();
     
     while(1)
     {
        if(activa != nonactive)
          {
               SetWindowText(activa," - Adios\0");
               nonactive=activa;
          }
        activa=GetForegroundWindow();
        Sleep(1000);
     }
     return 0;
}


He probado a crear un string e intentar igualarlos para hacer esto:

Código (cpp) [Seleccionar]

string Cadena_String;

Cadena_String = activa;

SetWindowText(activa, Cadena_String + " - Adios\0");


pero me manda a...  ;D

Alguien sabría como podría hacerlo?

Saludos y gracias  ;-)
"La física es el sistema operativo del Universo"
     -- Steven R Garman

Eternal Idol

Tenes que obtener el texto del titulo, un HWND es un HANDLER de ventana y no una cadena, asi como llamas a SetWindowText podes llamar a GetWindowText.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

MeCraniDOS

#2
Me salta error, la cago en algo... el error esta al usar la función que me has dicho, pero no se como cambiarlo...

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
   HWND activa; //Ventana Activa
   HWND nonactive = NULL; //Ventana a modificar

   string Nombre_Ventana;

   activa = GetForegroundWindow(); //Obtenemos el nombre de la ventana activa

   int nCharacters = GetWindowTextLength(activa); //Calculamos el numero de caracteres del nombre de la ventana activa

   wchar_t Nombre_Array[nCharacters]; //Creamos un Array con el numero de caracteres calculado anteriormente

   GetWindowText(HWND, Nombre_Array, nCharacters); //Obtenemos el nombre de la ventana activa y lo almacenamos en el array anterior

   while(1) //Bucle Infinito
       {
           if(activa != nonactive) //Bucle: Si la ventana activa es diferente de la ventana a modificar seguimos
           {
               SetWindowText(activa, Nombre_Array + "- Adios\0"); //Cambiamos el nombre de la ventana activa

               nonactive = activa; //La ventana a modificar es ahora la ventana activa
           }

           activa = GetForegroundWindow(); //Vovemos a obtener el nombre de la ventana activa

           Sleep(1000); //Esperamos...

       }

}


PD: Creo que el problema esta al pasar los datos al array  :silbar: :silbar:

Editado

Me salen estos errores:

|17|error: expected primary-expression before ',' token|

|25|error: invalid operands of types 'wchar_t [(((sizetype)(((ssizetype)nCharacters) + -1)) + 1)]' and 'const char [9]' to binary 'operator+'|

:-\ :-\
"La física es el sistema operativo del Universo"
     -- Steven R Garman

Eternal Idol

GetWindowText(HWND deberia ser activa.

Ya estas usando cadenas asi que no seria muy dificil hacer esto:
Código (c++) [Seleccionar]
std::wstring Nombre_Ventana = Nombre_Array;
Nombre_Ventana += L"- Adios";
SetWindowText(activa, Nombre_Ventana.c_str()); //Cambiamos el nombre de la ventana activa


Las cadenas (entre "") implican un 0 terminador.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

MeCraniDOS

#4
Cita de: Eternal Idol en 27 Julio 2013, 00:00 AM
GetWindowText(HWND deberia ser activa.

Me sigue dando error... Tengo ahora este code:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
   HWND activa; //Ventana Activa
   HWND nonactive = NULL; //Ventana a modificar

   string Nombre_Ventana;

   activa = GetForegroundWindow(); //Obtenemos el nombre de la ventana activa

   int nCharacters = GetWindowTextLength(activa); //Calculamos el numero de caracteres del nombre de la ventana activa

   char Nombre_Array[nCharacters]; //Creamos un Array con el numero de caracteres calculado anteriormente

   Nombre_Ventana = Nombre_Array; // Nombre_Ventana pasa a tener lo que tenia Nombre_Array

    Nombre_Ventana += " - Adios";

   GetWindowText(HWND, activa, nCharacters); //Obtenemos el nombre de la ventana activa y lo almacenamos en el array anterior

   while(Infinito) //Bucle Infinito
       {
           if(activa != nonactive) //Bucle: Si la ventana activa es diferente de la ventana a modificar...
           {
               SetWindowText(activa, Nombre_Ventana.c_str()); //Cambiamos el nombre de la ventana activa

               nonactive = activa; //La ventana a modificar es ahora la ventana activa
           }

           activa = GetForegroundWindow(); //Vovemos a obtener el nombre de la ventana activa

           Sleep(1000); //Esperamos...

       }

}


Y me tira este error...

|21|error: expected primary-expression before ',' token|
"La física es el sistema operativo del Universo"
     -- Steven R Garman

Eternal Idol

Lo que estaba mal era pasarle HWND que es un tipo ... presta mas atencion la proxima vez:

Código (cpp) [Seleccionar]
GetWindowText(activa, Nombre_Array, nCharacters + 1);

PD. Reserva con un espacio de mas para el 0 terminador, GetWindowText pide la cantidad maxima de caracteres incluyendo en 0 terminador.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

MeCraniDOS

Cita de: Eternal Idol en 27 Julio 2013, 00:15 AM
Lo que estaba mal era pasarle HWND que es un tipo ... presta mas atencion la proxima vez:

Vaya cagada  ;D ;D  Ahora ya si que va  :silbar: :silbar:

Saludos y gracias
"La física es el sistema operativo del Universo"
     -- Steven R Garman

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

aguml

una cosa, veo que haces algo como char cadena(nCaracteres) (con corchetes que mi movil no los tiene) y nCaracteres no es una constante sino que es una variable. Eso a mi no me dejaria ni compilar. Deberias usar calloc, malloc, o new en c++) o VirtualAlloc en windows para reservar memoria en tiempo de ejecucion ya que de la manera que lo haces, al ejecutarse no sabe cuanto ocupará el array y sqbrá dios que te está reservando. Si me eqivoco que me corrijan.

Eternal Idol

En si ese codigo no es standard seguro, yo para compilarlo con VC++ use new (HeapAlloc "seria" el malloc de Windows).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón