Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MeCraniDOS en 26 Julio 2013, 21:07 pm



Título: [?] HWND a String (Otra Cosita)
Publicado por: MeCraniDOS en 26 Julio 2013, 21:07 pm
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 (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
  1.  
  2. #include <stdio.h>
  3. #include <windows.h>
  4.  
  5. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
  6. {
  7.      HWND activa;
  8.      HWND nonactive = NULL;
  9.  
  10.      activa=GetForegroundWindow();
  11.  
  12.      while(1)
  13.      {
  14.         if(activa != nonactive)
  15.           {
  16.                SetWindowText(activa," - Adios\0");
  17.                nonactive=activa;
  18.           }
  19.         activa=GetForegroundWindow();
  20.         Sleep(1000);
  21.      }
  22.      return 0;
  23. }
  24.  

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

Código
  1. string Cadena_String;
  2.  
  3. Cadena_String = activa;
  4.  
  5. SetWindowText(activa, Cadena_String + " - Adios\0");

pero me manda a...  ;D

Alguien sabría como podría hacerlo?

Saludos y gracias  ;-)


Título: Re: [?] HWND a String
Publicado por: Eternal Idol en 26 Julio 2013, 22:49 pm
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 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633520(v=vs.85).aspx).


Título: Re: [?] HWND a String
Publicado por: MeCraniDOS en 26 Julio 2013, 23:43 pm
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
  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
  5. {
  6.    HWND activa; //Ventana Activa
  7.    HWND nonactive = NULL; //Ventana a modificar
  8.  
  9.    string Nombre_Ventana;
  10.  
  11.    activa = GetForegroundWindow(); //Obtenemos el nombre de la ventana activa
  12.  
  13.    int nCharacters = GetWindowTextLength(activa); //Calculamos el numero de caracteres del nombre de la ventana activa
  14.  
  15.    wchar_t Nombre_Array[nCharacters]; //Creamos un Array con el numero de caracteres calculado anteriormente
  16.  
  17.    GetWindowText(HWND, Nombre_Array, nCharacters); //Obtenemos el nombre de la ventana activa y lo almacenamos en el array anterior
  18.  
  19.    while(1) //Bucle Infinito
  20.        {
  21.            if(activa != nonactive) //Bucle: Si la ventana activa es diferente de la ventana a modificar seguimos
  22.            {
  23.                SetWindowText(activa, Nombre_Array + "- Adios\0"); //Cambiamos el nombre de la ventana activa
  24.  
  25.                nonactive = activa; //La ventana a modificar es ahora la ventana activa
  26.            }
  27.  
  28.            activa = GetForegroundWindow(); //Vovemos a obtener el nombre de la ventana activa
  29.  
  30.            Sleep(1000); //Esperamos...
  31.  
  32.        }
  33.  
  34. }

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+'|

 :-\ :-\


Título: Re: [?] HWND a String
Publicado por: Eternal Idol en 27 Julio 2013, 00:00 am
GetWindowText(HWND deberia ser activa.

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

Las cadenas (entre "") implican un 0 terminador.


Título: Re: [?] HWND a String
Publicado por: MeCraniDOS en 27 Julio 2013, 00:11 am
GetWindowText(HWND deberia ser activa.

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

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
  5. {
  6.    HWND activa; //Ventana Activa
  7.    HWND nonactive = NULL; //Ventana a modificar
  8.  
  9.    string Nombre_Ventana;
  10.  
  11.    activa = GetForegroundWindow(); //Obtenemos el nombre de la ventana activa
  12.  
  13.    int nCharacters = GetWindowTextLength(activa); //Calculamos el numero de caracteres del nombre de la ventana activa
  14.  
  15.    char Nombre_Array[nCharacters]; //Creamos un Array con el numero de caracteres calculado anteriormente
  16.  
  17.    Nombre_Ventana = Nombre_Array; // Nombre_Ventana pasa a tener lo que tenia Nombre_Array
  18.  
  19.    Nombre_Ventana += " - Adios";
  20.  
  21.    GetWindowText(HWND, activa, nCharacters); //Obtenemos el nombre de la ventana activa y lo almacenamos en el array anterior
  22.  
  23.    while(Infinito) //Bucle Infinito
  24.        {
  25.            if(activa != nonactive) //Bucle: Si la ventana activa es diferente de la ventana a modificar...
  26.            {
  27.                SetWindowText(activa, Nombre_Ventana.c_str()); //Cambiamos el nombre de la ventana activa
  28.  
  29.                nonactive = activa; //La ventana a modificar es ahora la ventana activa
  30.            }
  31.  
  32.            activa = GetForegroundWindow(); //Vovemos a obtener el nombre de la ventana activa
  33.  
  34.            Sleep(1000); //Esperamos...
  35.  
  36.        }
  37.  
  38. }

Y me tira este error...

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


Título: Re: [?] HWND a String
Publicado por: 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:

Código
  1. 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.


Título: Re: [?] HWND a String
Publicado por: MeCraniDOS en 27 Julio 2013, 00:19 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


Título: Re: [?] HWND a String
Publicado por: Eternal Idol en 27 Julio 2013, 00:20 am
De nadas  ::)


Título: Re: [?] HWND a String
Publicado por: aguml en 27 Julio 2013, 19:01 pm
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.


Título: Re: [?] HWND a String
Publicado por: Eternal Idol en 27 Julio 2013, 19:40 pm
En si ese codigo no es standard seguro, yo para compilarlo con VC++ use new (HeapAlloc "seria" el malloc de Windows).


Título: Re: [?] HWND a String
Publicado por: MeCraniDOS en 28 Julio 2013, 13:37 pm
al ejecutarse no sabe cuanto ocupará el array y sqbrá dios que te está reservando.

Yo tampoco lo veo tan claro, pero supongo que al poner esto:

Código
  1. int nCharacters = GetWindowTextLength(activa); //Calculamos el numero de caracteres del nombre de la ventana activa
  2.  
  3. char Nombre_Array[nCharacters]; //Creamos un Array con el numero de caracteres calculado anteriormente

Lo que hace es calcular la longitud del nombre de la ventana activa, y si vale 5, el array se crea reservando 5  :-\ :-\

Lo compilo con CodeBlocks y MinGW, como lo puedo hacer standard?  :-\


Título: Re: [?] HWND a String
Publicado por: Eternal Idol en 28 Julio 2013, 13:40 pm
Código
  1. wchar_t *Nombre_Array = new wchar_t[nCharacters + 1];
  2. //usar
  3. delete[] Nombre_Array;


Título: Re: [?] HWND a String
Publicado por: MeCraniDOS en 28 Julio 2013, 13:59 pm
Quedaría así?

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
  8. {
  9.    HWND activa; //Ventana Activa
  10.    HWND nonactive = NULL; //Ventana a modificar
  11.  
  12.    string Nombre_Ventana;
  13.  
  14.    activa = GetForegroundWindow(); //Obtenemos el nombre de la ventana activa
  15.  
  16.    int nCharacters = GetWindowTextLength(activa); //Calculamos el numero de caracteres del nombre de la ventana activa
  17.  
  18.    while(1) //Bucle Infinito
  19.        {
  20.  
  21.            nCharacters = GetWindowTextLength(activa); //Calculamos el numero de caracteres del nombre de la ventana activa
  22.  
  23.            wchar_t *Nombre_Array = new wchar_t[nCharacters + 1]; //Creamos un Array con el numero de caracteres calculado anteriormente
  24.  
  25.  
  26.            GetWindowText(activa, Nombre_Array, nCharacters + 1); //Obtenemos el nombre de la ventana activa y lo almacenamos en el array anterior
  27.  
  28.            Nombre_Ventana = "";
  29.  
  30.            Nombre_Ventana = Nombre_Array; // Nombre_Ventana pasa a tener lo que tenia Nombre_Array
  31.  
  32.            Nombre_Ventana += " - Adios"; //Añadimos una cadena a la ventana activa
  33.  
  34.            if(activa != nonactive) //Bucle: Si la ventana activa es diferente de la ventana a modificar...
  35.            {
  36.                SetWindowText(activa, Nombre_Ventana.c_str()); //Cambiamos el nombre de la ventana activa
  37.  
  38.                nonactive = activa; //La ventana a modificar es ahora la ventana activa
  39.            }
  40.  
  41.            activa = GetForegroundWindow(); //Vovemos a obtener el nombre de la ventana activa
  42.  
  43.            delete[] Nombre_Array;
  44.  
  45.            Sleep(1000); //Esperamos...
  46.  
  47.        }
  48.  
  49.        return 0;
  50. }

ERRORES

|24|error: cannot convert 'wchar_t*' to 'LPSTR {aka char*}' for argument '2' to 'int GetWindowTextA(HWND, LPSTR, int)'|

|28|error: invalid conversion from 'wchar_t*' to 'char' [-fpermissive]|

*codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_string.h|562|error:   initializing argument 1 of 'std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]' [-fpermissive]|


Título: Re: [?] HWND a String
Publicado por: Eternal Idol en 28 Julio 2013, 15:09 pm
Usa char en lugar de wchar_t ya que no estas en Unicode.


Título: Re: [?] HWND a String (Otra Cosita)
Publicado por: MeCraniDOS en 28 Julio 2013, 15:51 pm
Usa char en lugar de wchar_t ya que no estas en Unicode.
Solucionado, si no hay ningún otro fallo donde la haya cagado..  :silbar: :silbar:

Saludos


EDITO

Lo que quiero implementar ahora es una comprobacion de la ventana activa, es decir, si la ventana no es, por ejemplo, "Hola", que no añada el "- Adios" al final...

Tengo esto:


Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <iostream>
  6.  
  7. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
  8. {
  9.    HWND activa; //Ventana Activa
  10.    HWND nonactive = NULL; //Ventana a modificar
  11.  
  12.    string Nombre_Ventana;
  13.  
  14.    activa = GetForegroundWindow(); //Obtenemos el nombre de la ventana activa
  15.  
  16.    int nCharacters = GetWindowTextLength(activa); //Calculamos el numero de caracteres del nombre de la ventana activa
  17.  
  18.    while(1) //Bucle Infinito
  19.        {
  20.  
  21.            nCharacters = GetWindowTextLength(activa); //Calculamos el numero de caracteres del nombre de la ventana activa
  22.  
  23.            char *Nombre_Array = new char[nCharacters + 1]; //Creamos un Array con el numero de caracteres calculado anteriormente
  24.  
  25.  
  26.            GetWindowText(activa, Nombre_Array, nCharacters + 1); //Obtenemos el nombre de la ventana activa y lo almacenamos en el array anterior
  27.  
  28.            Nombre_Ventana = "";
  29.  
  30.            if (Nombre_Array = "Hola")
  31.            {
  32.  
  33.                Nombre_Ventana = Nombre_Array; // Nombre_Ventana pasa a tener lo que tenia Nombre_Array
  34.  
  35.                printf("Cambiado Correctamente!");
  36.  
  37.                Nombre_Ventana += " - Adios!"; //Añadimos una cadena a la ventana activa
  38.  
  39.                if(activa != nonactive) //Bucle: Si la ventana activa es diferente de la ventana a modificar...
  40.                {
  41.                    SetWindowText(activa, Nombre_Ventana.c_str()); //Cambiamos el nombre de la ventana activa
  42.  
  43.                    nonactive = activa; //La ventana a modificar es ahora la ventana activa
  44.                }
  45.  
  46.                activa = GetForegroundWindow(); //Vovemos a obtener el nombre de la ventana activa
  47.  
  48.                delete[] Nombre_Array;
  49.  
  50.                Sleep(1000); //Esperamos...
  51.  
  52.            }
  53.  
  54.            else
  55.            {
  56.                printf("Fallo al Cambiar!");
  57.  
  58. return -1;
  59.            }
  60.  
  61.        }
  62.  
  63.    return 0;
  64. }


Título: Re: [?] HWND a String (Otra Cosita)
Publicado por: Eternal Idol en 29 Julio 2013, 17:05 pm
Esto es incorrecto:
Código
  1. if (Nombre_Array = "Hola")

Es una asignacion y no la comparacion que vos queres en realidad, tenes que depurar tus programas para ver que hacen linea por linea.


Título: Re: [?] HWND a String (Otra Cosita)
Publicado por: MeCraniDOS en 29 Julio 2013, 18:37 pm
Esto es incorrecto:
Código
  1. if (Nombre_Array = "Hola")

Es una asignacion y no la comparacion que vos queres en realidad, tenes que depurar tus programas para ver que hacen linea por linea.

Ya... cuando lo ejecuto me cambia el nombre completo de la ventana a "Hola - Adiós", pero es que no se como compararlo con la que cojo... ya me estoy liando  :huh: :huh:


Título: Re: [?] HWND a String (Otra Cosita)
Publicado por: Eternal Idol en 29 Julio 2013, 18:49 pm
Una comparacion en C/C++ se hace con ==.

Busca informacion como esta para ir practicando por tu propia cuenta:
http://www.cplusplus.com/reference/string/string/compare/


Título: Re: [?] HWND a String (Otra Cosita)
Publicado por: MeCraniDOS en 29 Julio 2013, 21:19 pm
Una comparacion en C/C++ se hace con ==.

Vale... Otra de mis cagadas tontas por ir rápido...  :¬¬ :¬¬

Gracias  :silbar: