• Domingo 22 de Diciembre de 2024, 21:07

Autor Tema:  Problema Apis  (Leído 6492 veces)

robokop

  • Miembro activo
  • **
  • Mensajes: 70
    • Ver Perfil
Problema Apis
« en: Jueves 10 de Agosto de 2006, 18:49 »
0
Buenas  :hola:

Estaba haciendo un proyecto para esconder el boton de inicio con apis
el codigo es estE:
Código: Text
  1.  #include <windows.h>
  2. HWND ventana,ventana2;
  3. int main()
  4. {
  5. ventana = FindWindow("Shell_traywnd", NULL);
  6. ventana2 = GetWindow(ventana,GW_CHILD);
  7. ShowWindow(ventana2, SW_HIDE);
  8. system("PAUSE");  
  9.   return 0;
  10. }
  11.  

Bueno pues resulta que no me funciona y en Dev-C++ si que funciona bien pero yo prefiero vc++.net 2005 que es la version que tengo , pero na no me funciona , estoy creando un proyecto de consola standar sin que ocupe la libreria stdafx.h y aunque la incluya no me funciona me marca error C2664 'FindWindowW':canot convert parameter  1 from const char[14] to LPCWSTR.
Pense que podia ser el proyecto porque es c++, asi que como vc++ no tiene posibilidad de elejir el C normal intente cambiarle el CPP por C y si me corre pero no esconde el boton.

Gracias Y salu2  :kicking:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Apis
« Respuesta #1 en: Jueves 10 de Agosto de 2006, 20:41 »
0
No es un problema de C o C++ sino de ANSI y Unicode. Proba con FindWindoA en vez para forzar ANSI (tenes definido UNICODE) o usa L"Shell_traywnd". Sino busca en las opciones de proyecto y cambia UNICODE por ANSI.

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.

robokop

  • Miembro activo
  • **
  • Mensajes: 70
    • Ver Perfil
Re: Problema Apis
« Respuesta #2 en: Jueves 10 de Agosto de 2006, 21:05 »
0
intente eso y nada.
Cambie findwindow por findwindowA y si corrio pero no ocultaba nada , en la imagen adjunta fue donde puse unicode en no .
Alguna otra idea mas ?
gracias por tu ayuda
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

robokop

  • Miembro activo
  • **
  • Mensajes: 70
    • Ver Perfil
Re: Problema Apis
« Respuesta #3 en: Jueves 10 de Agosto de 2006, 21:58 »
0
Ya esta  :D  ...No se porque cuando lo probe no me funciono pero ya me funciona bien con FindWindowA muchas gracias Eternal  :hola:

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema Apis
« Respuesta #4 en: Viernes 11 de Agosto de 2006, 04:58 »
0
Cita de: "Eternal Idol"
No es un problema de C o C++ sino de ANSI y Unicode. Proba con FindWindoA en vez para forzar ANSI (tenes definido UNICODE) o usa L"Shell_traywnd". Sino busca en las opciones de proyecto y cambia UNICODE por ANSI.
Por funciona al compilarlo con UNICODE =NO, y porque no funciona al compilarlo con UNICODE=SI???


No me acabo de aclarar con eso :huh:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Apis
« Respuesta #5 en: Sábado 12 de Agosto de 2006, 21:21 »
0
Eso que cambiaste no tiene nada que ver, lo solucionaste usando el A que fuerza al programa a llamar a la funcion de tipo ANSI. En realidad para casi todas las funciones de Windows que reciban una cadena como parametro existen dos funciones una terminada en A (ANSI) y otra terminada en W (WIDE que es Unicode en este caso). El FindWindow es un define que cuando esta definido UNICODE "apunta" a FindWindowW como en este caso, lo que hacemos para solucionarlo es obviar el define y llamar a la funcion directamente.

En las propiedades del proyecto tenes que cambiar donde dice Character Set, Use Unicode Character Set por Use multibyte-character set. Eso esta en las propiedades generales y no en las de C/C++.

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.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Apis
« Respuesta #6 en: Sábado 12 de Agosto de 2006, 21:23 »
0
Cita de: "JuanK"
Por funciona al compilarlo con UNICODE =NO, y porque no funciona al compilarlo con UNICODE=SI???


No me acabo de aclarar con eso :huh:
En este caso lo compilo siempre con UNICODE definido. Las cadenas ocupan 2 bytes por caracter en Unicode en vez de 1 como en ANSI. Y cuando llamas a las funciones de Unicode tenes que pasarles una cadena de Unicode y cuando llamas a las de ANSI una de ANSI ... El problema aca es que tiene definido UNICODE entonces por defecto, como explique antes, llama a FindWindowW que pide una cadena necesita una cadena Unicode y no una ANSI ("CADENA" es ANSI mientras que L"CADENA" es Unicode).

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.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema Apis
« Respuesta #7 en: Sábado 12 de Agosto de 2006, 21:28 »
0
eso lo explica todo, ahora si me quedo claro, no sabia de eso en unicode  :wacko:


gracias.!!
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Apis
« Respuesta #8 en: Sábado 12 de Agosto de 2006, 21:31 »
0
Cita de: "JuanK"
eso lo explica todo, ahora si me quedo claro, no sabia de eso en unicode  :wacko:


gracias.!!
Basicamente eso es Unicode  B) Windows NT esta desarrollado para trabajar internamente con Unicode y cada vez que se hace una llamada de tipo ANSI esa cadena es transformada en Unicode mucho antes de llegar al Kernel (de hacerlo claro).

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.

robokop

  • Miembro activo
  • **
  • Mensajes: 70
    • Ver Perfil
Re: Problema Apis
« Respuesta #9 en: Sábado 12 de Agosto de 2006, 22:00 »
0
Bien  :D  ahora ya me funciona bien y tambien funciona perfecto otros codigos que antes no me servian .
Pero otra duda cuando lo compilo en modo debug no da errores ,pero asi no me gusta ya que deja el programa algo pesado y si lo compilo en modo release me da errores que podria hacer hay ?
gracias por todo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Apis
« Respuesta #10 en: Sábado 12 de Agosto de 2006, 22:06 »
0
Cita de: "robokop"
Bien  :D  ahora ya me funciona bien y tambien funciona perfecto otros codigos que antes no me servian .
Pero otra duda cuando lo compilo en modo debug no da errores ,pero asi no me gusta ya que deja el programa algo pesado y si lo compilo en modo release me da errores que podria hacer hay ?
gracias por todo.
Lo ideal seria que cambiar el character set a Multibyte tambien en la configuracion de Release  B) De nadas.

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.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema Apis
« Respuesta #11 en: Domingo 13 de Agosto de 2006, 19:33 »
0
Version C#, ignoro si se puede hacer la referencia a la api de otra manera pero asi la he hecho siempre.

Código: Text
  1. using System;
  2. using System.Runtime.InteropServices;
  3.  
  4. namespace BarraTareas
  5. {
  6.     class Program
  7.     {
  8.         [DllImport("user32.dll")]
  9.         public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  10.         [DllImport("user32.dll")]
  11.         public static extern IntPtr GetWindow(IntPtr hnWindow, int uCmd);
  12.         [DllImport("user32.dll")]
  13.         public static extern int ShowWindow(IntPtr hnWindow, int uCmd);
  14.  
  15.         const int GW_CHILD = 5;
  16.         const int SW_HIDE = 0;
  17.         const int SW_SHOW = 5;
  18.  
  19.         static void Main()
  20.         {
  21.             ShowWindow(GetWindow(FindWindow("Shell_traywnd", null), GW_CHILD), SW_HIDE);
  22.         }
  23.     }
  24. }
  25.  
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Apis
« Respuesta #12 en: Domingo 13 de Agosto de 2006, 22:27 »
0
Cita de: "JuanK"
Version C#, ignoro si se puede hacer la referencia a la api de otra manera pero asi la he hecho siempre.
¿Con un tipo de dato string? Jeje, supongo que si pones (¿wstring?) te lo declara como FindWindowW ... podes probar a ponerlo a mano tanto con A y con W a ver que pasa pero C# ............ Estamos en el foro de VC++ y probablemente Unicode sea una de las cosa que C# no haga muy evidente ...

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.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema Apis
« Respuesta #13 en: Domingo 13 de Agosto de 2006, 23:21 »
0
Pero FindWindow se supone que resuelve por dentro si es UNICODE o ASCII no?

Citar
¿Con un tipo de dato string? Jeje, supongo que si pones (¿wstring?) te lo declara como FindWindowW ...

No en C# no existe el tipo wstring, la unica forma que habria de usarlo seria importando el tpo desde la API y configurando el compilador para usar tipos unsafe ( por lo de los punteros)

Sin embargo .NET define algunas maneras de acceder o de forzar el acceso a trave de algunas funciones de la API asi:

Código: Text
  1.  
  2. [DllImport(USER32_DLL, EntryPoint="FindWindow")]
  3. public static extern IntPtr FindWindowA(string lpClassName, string lpWindowName);
  4.  

o viceversa

Código: Text
  1.  [DllImport("user32", EntryPoint = "FindWindowA")]
  2. private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  3.  

Citar
Estamos en el foro de VC++ y probablemente Unicode sea una de las cosa que C# no haga muy evidente ...

Puntualmente para el asunto de unicode el charset se peude definir en la invocacon asi:

Código: Text
  1.  
  2. [DllImport(USER32_DLL, CharSet=CharSet.Unicode)]
  3. public static extern IntPtr FindWindowA(string lpClassName, string lpWindowName);
  4.  
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Apis
« Respuesta #14 en: Domingo 13 de Agosto de 2006, 23:43 »
0
Cita de: "JuanK"
Pero FindWindow se supone que resuelve por dentro si es UNICODE o ASCII no?
No, parece que hasta ahora no entendiste nada  :P

En Windows se suele seguir una metodologia como esta:

Código: Text
  1.  
  2. void FuncionEjemploW(wchar_t *mensaje)
  3. {
  4.   //hacer algo ...
  5. }
  6.  
  7. void FuncionEjemploA(char *mensaje)
  8. {
  9.   wchar_t *wideMensaje;
  10.   //convertir cadena a unicode
  11.   FuncionEjemploW(wideMensaje);
  12. }
  13.  
  14.  

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.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problema Apis
« Respuesta #15 en: Lunes 14 de Agosto de 2006, 02:30 »
0
Cita de: "Eternal Idol"
Cita de: "JuanK"
Pero FindWindow se supone que resuelve por dentro si es UNICODE o ASCII no?
No, parece que hasta ahora no entendiste nada  :P

En Windows se suele seguir una metodologia como esta:

Código: Text
  1.  
  2. void FuncionEjemploW(wchar_t *mensaje)
  3. {
  4.   //hacer algo ...
  5. }
  6.  
  7. void FuncionEjemploA(char *mensaje)
  8. {
  9.   wchar_t *wideMensaje;
  10.   //convertir cadena a unicode
  11.   FuncionEjemploW(wideMensaje);
  12. }
  13.  
  14.  
Pues eso mismo era a lo que me referia pero decia era que en tiempo de compilacion se define si FindWindow invoca o bien a FindWindowA o bien a FindWindowW?
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

robokop

  • Miembro activo
  • **
  • Mensajes: 70
    • Ver Perfil
Re: Problema Apis
« Respuesta #16 en: Lunes 14 de Agosto de 2006, 05:19 »
0
Yo ya ni se de que hablan pero buee.
aqui dejo un pequeño code que hice de practica para esconder taskbar,boton de inicio,tray ,reloj etc...
Es muy simple pero por si a alguien le hace falta.
Gracias Eternla por la ayuda  :smartass:
Código: Text
  1. #include "windows.h"
  2. #include "stdio.h"
  3.  
  4. /*Variables globales*/
  5. HWND  ventana,ventana2;
  6.  char resp;
  7.  
  8. /*definciones*/
  9. void taskbar(char on);
  10. void tray(char on);
  11. void windo(char on);
  12. void launch(char on);
  13. void inicio(char on);
  14. void opciones(void);
  15. int main()
  16. {
  17.   for(;;)
  18.   {
  19.    opciones();
  20.   }
  21. return 0;
  22. }
  23. /*Opciones a elejir*/
  24. void opciones()
  25. {
  26.     printf("\t\t\tEsconder botones de windows\n\n\n");
  27.   printf("Elija una opcion:\n\n");
  28.   printf("A)Esconder taskbar\na)Mostrar taskbar\n");
  29.   printf("B)Esconder tray y reloj\nb)Mostrar tray\n");
  30.   printf("C)Esconder Ventanas minizadas\nc)Mostrar ventanas minimizadas\n");
  31.   printf("D)Esconder QuickLaunch\nd)Mostrar QuickLaunch\n");
  32.   printf("E)Esconder boton de Inicio\ne)Mostrar boton de inicio\n");
  33.   printf("Elija una opcion y pulse enter :");
  34.   resp = getchar();
  35.  switch (resp)
  36.  {
  37.  case 'A':
  38.      taskbar('s');   break;
  39.  case 'a':
  40.        taskbar('n');   break;
  41.  case 'B':
  42.        tray('s');      break;
  43.  case 'b':
  44.        tray('n');      break;
  45.  case 'C':
  46.        windo('s');     break;
  47.  case 'c':
  48.        windo('n');   break;
  49.  case 'D':
  50.        launch('s');   break;
  51.  case 'd':
  52.         launch('n');   break;
  53.  case 'E':
  54.         inicio('s');   break;
  55.  case 'e':
  56.         inicio('n');   break;
  57.  }
  58.  system("cls");
  59. }
  60.  
  61. /*Funcion para esconder taskbar*/
  62. void taskbar(char on)
  63. {
  64.   if (on=='s')
  65.   {
  66.       ventana = FindWindowA("Shell_traywnd",NULL);/*Encontramos el Handle */
  67.     ShowWindow(ventana,SW_HIDE);/*Se oculta con SW_HIDE*/
  68.   }
  69.   else
  70.   {
  71.       ventana = FindWindowA("Shell_traywnd",NULL);
  72.     ShowWindow(ventana,SW_SHOW);
  73.   }
  74. }
  75.  
  76. //Funcion para Iconos minizados y reloj  en el taskbar
  77. void tray(char on)
  78. {
  79.     if (on=='s')
  80.   {
  81.       ventana = FindWindowA("Shell_traywnd",NULL);
  82.     ventana2 = FindWindowExA (ventana,NULL,"TrayNotifywnd",NULL);/*Entre las ventanas
  83.                                    hijas buscamos El tray*/
  84.         ShowWindow(ventana2,SW_HIDE);
  85.   }
  86.   else
  87.   {
  88.       ventana = FindWindowA("Shell_traywnd",NULL);
  89.     ventana2 = FindWindowExA (ventana,NULL,"TrayNotifywnd",NULL);
  90.     ShowWindow(ventana2,SW_SHOW);
  91.   }
  92. }
  93. //Ventanas en taskbar
  94. void windo(char on)
  95.  
  96. {
  97.     if (on=='s')
  98.   {
  99.       ventana = FindWindowA("Shell_traywnd",NULL);
  100.     ventana2 = FindWindowExA (ventana,NULL,"ReBarWindow32",NULL);
  101.         ShowWindow(ventana2,SW_HIDE);
  102.   }
  103.   else
  104.   {
  105.     ventana = FindWindowA("Shell_traywnd",NULL);
  106.     ventana2 = FindWindowExA (ventana,NULL,"ReBarWindow32",NULL);
  107.     ShowWindow(ventana2,SW_SHOW);
  108.   }
  109. }
  110.  
  111. //Quick launch
  112. void launch(char on)
  113.  
  114. {
  115.     if (on=='s')
  116.   {
  117.       ventana = FindWindowA("Shell_traywnd",NULL);
  118.     ventana2 = FindWindowExA (FindWindowExA(ventana,NULL,"ReBarWindow32",NULL),NULL,"ToolBarWindow32",NULL);
  119.         ShowWindow(ventana2,SW_HIDE);
  120.   }
  121.   else
  122.   {
  123.     ventana = FindWindowA("Shell_traywnd",NULL);
  124.     ventana2 = FindWindowExA (FindWindowExA(ventana,NULL,"ReBarWindow32",NULL),NULL,"ToolBarWindow32",NULL);
  125.     ShowWindow(ventana2,SW_SHOW);
  126.   }
  127. }
  128.  
  129. //Boton de inicio
  130. void inicio(char on)
  131.  
  132. {
  133.     if (on=='s')
  134.   {
  135.       ventana = FindWindowA("Shell_traywnd",NULL);
  136.     ventana2 = GetWindow(ventana,GW_CHILD);
  137.     ShowWindow(ventana2,SW_HIDE);
  138.   }
  139.   else
  140.   {
  141.     ventana = FindWindowA("Shell_traywnd",NULL);
  142.     ventana2 = GetWindow(ventana,GW_CHILD);
  143.     ShowWindow(ventana2,SW_SHOW);
  144.   }
  145. }
  146.  
salu2
pd: El code se puede optimizar muchisimo pero lo deje asi porque es solo un ejercicio e hice copy&paste del primer ejemplo solo cambiando parametros

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema Apis
« Respuesta #17 en: Lunes 14 de Agosto de 2006, 08:39 »
0
Cita de: "JuanK"
Cita de: "JuanK"
Pero FindWindow se supone que resuelve por dentro si es UNICODE o ASCII no?

Pues eso mismo era a lo que me referia pero decia era que en tiempo de compilacion se define si FindWindow invoca o bien a FindWindowA o bien a FindWindowW?
Bueno, sinceramente leyendo tu frase no veo que digas eso ... pero mas bien da lo mismo. La respuesta a la primera frase es clara: no, por dentro FindWindowA espera que por favor le pasen cadenas de tipo ANSI y FindWindowW espera que por favor le pasen cadenas de tipo Unicode. De no ser asi interpretaran mal las cadenas y/o daran una excepcion, por dentro no distinguen nada.
La respuesta a la segunda es: podriamos decir que si, es el preprocesador el que se encargara de establecer a que funcion de la API de Windows se llamara.

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.