Page 1 of 1

IsAppThemed()

Posted: Wed Sep 15, 2010 9:52 am
by Juan Gálvez
Hola Antonio,

Estoy probando FWH 10.08 y observo que IsAppThemed() sigue devolviendo .T. aún sin temas activos.

¿ Recuerdas nuestra última conversación ?

¿ Cómo quedará finalmente ?

Gracias y saludos
Juan

Re: IsAppThemed()

Posted: Wed Sep 15, 2010 10:13 am
by Antonio Linares
Juan,

Este es el código fuente de la función IsAppThemed() de FWH. Si encontramos la manera de mejorarla, bienvenida sea :-)

Code: Select all

BOOL _IsAppThemed( void )
{
   static BOOL bInit = FALSE;
   static BOOL bIsThemed = FALSE;

   InitThemes();

   if( pIsAppThemed && ! bInit )
   {
      WIN32_FIND_DATA fd;
    
      bInit = TRUE;
      bIsThemed = ( ( ( BOOL ) FindResource( GetResources(), MAKEINTRESOURCE( 1 ),
                  MAKEINTRESOURCE( 24 ) ) ) ||
                  ( ( BOOL ) FindResource( GetInstance(), MAKEINTRESOURCE( 1 ),
                  MAKEINTRESOURCE( 24 ) ) ) || pIsAppThemed() );
                  
      if( ! bIsThemed )
      {
         char AppName[ 256 ];
         HANDLE hFind;
        
         GetModuleFileName( NULL, AppName, 255 );
         lstrcat( AppName, ".Manifest" );
         
         if( ( hFind = FindFirstFile( AppName, &fd ) ) != INVALID_HANDLE_VALUE )
         {
            bIsThemed = TRUE;
            FindClose( hFind );
         }
      }      
   }

   if( pIsAppThemed != NULL )
      return bIsThemed;
   else
      return FALSE;
}
 
la función InitThemes() se encarga de cargar la DLL y de inicializar el valor de pIsAppThemed, que es un puntero a función.

Re: IsAppThemed()

Posted: Wed Sep 15, 2010 10:16 am
by Antonio Linares

Code: Select all

typedef BOOL ( __stdcall * PFNISAPPTHEMED ) ( void );

static PFNISAPPTHEMED pIsAppThemed = NULL;
static HMODULE hDLL = NULL;

static void InitThemes( void )
{
   static BOOL bInit = FALSE;

   if( bInit )
      return;
   else
      bInit = TRUE;

   if( hDLL == NULL )
   {
      if( hDLL = LoadLibrary( "UXTHEME.DLL" ) )
      {
         pIsAppThemed = ( PFNISAPPTHEMED ) GetProcAddress( hDLL, "IsAppThemed" );
      }
   }
}
 

Re: IsAppThemed()

Posted: Sat Sep 25, 2010 7:45 am
by Antonio Linares
Juan,

Has modificado la función ?

Le has encontrado algún fallo ?

gracias,

Re: IsAppThemed()

Posted: Tue Oct 19, 2010 4:58 am
by carlos vargas
Antonio, una consulta, viendo el codigo puesto por ti,

static PFNISAPPTHEMED pIsAppThemed = NULL;

lo defines como una variable estatica, pero luego mas adelante lo usas como una funcion, es correcto, esto? o es una funcion realmente y no puedes postear el codigo?

bIsThemed = ( ( ( BOOL ) FindResource( GetResources(), MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) ||
( ( BOOL ) FindResource( GetInstance(), MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) || pIsAppThemed() ) /*funcion o var?*/



otra cosa, pudieras postear el codigo de estas funciones para "poder compilar y hacer pruebas", please, no sueltas como lo has hecho.
se que son func restringidas, pero talvez ayude alguien a encontrar la solucion.
por ejemplo si es posible un archivo theme_test.c conteniendo lo necesario para compilar y probar.

salu2
carlos vargas

Code: Select all

BOOL _IsAppThemed( void )
{
   static BOOL bInit = FALSE;
   static BOOL bIsThemed = FALSE;

   InitThemes();

   if( pIsAppThemed && ! bInit )
   {
      WIN32_FIND_DATA fd;
    
      bInit     = TRUE;
      bIsThemed = ( ( ( BOOL ) FindResource( GetResources(), MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) ||
                    ( ( BOOL ) FindResource( GetInstance(),  MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) || pIsAppThemed() )         /*ACA pIsAppThemed es funcion o var, creo que deberia ser una var*/

    ....
 

salu2
carlos vargas

Re: IsAppThemed()

Posted: Tue Oct 19, 2010 7:04 am
by Antonio Linares
Carlos,

Esa variable contendrá un puntero cargado desde uxtheme.dll al que se puede llamar como si fuese una función :-)

En él código que he publicado esta todo. Solo tienes que compilarlo :-)

Re: IsAppThemed()

Posted: Wed Oct 27, 2010 3:30 pm
by Patricio Avalos Aguirre
Estimados

he colocado esta funcion en mi sistema

Code: Select all

function IsAppThemed()
return( .f. )
 
puede producir algun problema posterior

lo comento porque con esta funcion elimino el problema de presionar la tecla ALT y desaparezcan la informacion en pantalla
aunque tenga en el recurso MANIFIEST

Code: Select all

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    type="win32"
    name="MyOrganization.MyDivision.MyApp"
    version="1.0.0.0"
    processorArchitecture="X86"
    />
    <description>Verbal description of MyApp.</description>
    <dependency>
    <dependentAssembly>
    <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        processorArchitecture="X86"
        publicKeyToken="6595b64144ccf1df"
        language="*"
    />
    </dependentAssembly>
    </dependency>
</assembly>

Re: IsAppThemed()

Posted: Mon Nov 08, 2010 9:21 pm
by carlos vargas
Pues he probado con winxp/win7 y las respuestas de la funciones isappthemed y istheme active son correctas con thema y sin thema,
con el manifest en el exe incrustado o como archivo externo, por lo que no hallo falla. :-(
aunque aprendi algunas consillas en c como los punteros a funciones. ;-)
aca dejo los ficheros de prueba por si algien les mete mano.

theme.prg

Code: Select all

#include "fivewin.ch"

procedure main()
   
   ?"Hola Mundo"
   ?"IsAppThemed:",IsAppThemed()   //original de fwh
   ?"IsActive:",IsThemeActive()         //original de fwh
   
   ?"IsAppThemed:",IsAppThemed2()  //las aca incluidas
   ?"IsActive:",IsThemeActive2()        //las aca incluidas

   CloseTheme()
   
return

#pragma BEGINDUMP


/*----------------------------------------------------------------------------*/

#include "hbapi.h"
#include "windows.h"
#include "uxtheme.h"

/*----------------------------------------------------------------------------*/

typedef BOOL ( __stdcall * PFNISAPPTHEMED ) ( void );
typedef BOOL ( __stdcall * PFNISTHEMEACTIVE ) ( void );

static HMODULE        hDLL         = NULL;
static PFNISAPPTHEMED pIsAppThemed = NULL;

static void InitThemes( void );
BOOL _IsAppThemed( void );
BOOL _IsThemeActive( void );
BOOL _CloseTheme(void);

/*----------------------------------------------------------------------------*/

HB_FUNC( ISAPPTHEMED2 )
{
   hb_retl( _IsAppThemed() );
}

HB_FUNC( ISTHEMEACTIVE2 )
{
   hb_retl( _IsThemeActive() );
}

HB_FUNC( CLOSETHEME )
{
   hb_retl( _CloseTheme() );
}

/*----------------------------------------------------------------------------*/

static void InitThemes( void )
{
   /*inicializa variable estatica*/
   static BOOL bInit = FALSE;

   /*valida con variable estatica que la funcion se ejecute solo una vez*/
   if( bInit )
   {
      return;
   }
   else
   {
      bInit = TRUE;
   }


   if( hDLL == NULL )
   {

      /*carga dll que manipula los temas*/
      if( hDLL = LoadLibrary( "UXTHEME.DLL" ) )
      {

         /*obtiene puntero a funcion IsAppThemed contenida en la dll cargada previamente*/
         pIsAppThemed = ( PFNISAPPTHEMED ) GetProcAddress( hDLL, "IsAppThemed" );

      }

   }

}

/*----------------------------------------------------------------------------*/

BOOL _IsAppThemed( void )
{
   /*inicializa variables estaticas*/
   static BOOL bInit     = FALSE;
   static BOOL bIsThemed = FALSE;

   /*obtiene puntero de la funcion IsAppThemed*/
   InitThemes();

   if( pIsAppThemed && ! bInit )
   {

      WIN32_FIND_DATA fd;

      bInit     = TRUE;
      bIsThemed = ( ( ( BOOL ) FindResource( GetResources(), MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) ||
                  (   ( BOOL ) FindResource( GetInstance(),  MAKEINTRESOURCE( 1 ), MAKEINTRESOURCE( 24 ) ) ) || pIsAppThemed() );

      if( ! bIsThemed )
      {
         char AppName[ 256 ];
         HANDLE hFind;

         GetModuleFileName( NULL, AppName, 255 );
         lstrcat( AppName, ".Manifest" );

         if( ( hFind = FindFirstFile( AppName, &fd ) ) != INVALID_HANDLE_VALUE )
         {
            bIsThemed = TRUE;
            FindClose( hFind );
         }

      }

   }

   if( pIsAppThemed != NULL )
   {
      return bIsThemed;
   }
   else
   {
      return FALSE;
   }

}

/*----------------------------------------------------------------------------*/

BOOL _IsThemeActive( void )
{
   PFNISTHEMEACTIVE pIsThemeActive = NULL;   

   if( hDLL != 0 )
   {
      /*puntero a funcion IsThemeActive*/
      pIsThemeActive = ( PFNISTHEMEACTIVE ) GetProcAddress( hDLL, "IsThemeActive" );
   
      /*ejecuta funcion*/
      if( pIsThemeActive() )
      {
         return TRUE;
      }
   
   }
   return FALSE;

}

/*----------------------------------------------------------------------------*/

BOOL _CloseTheme( void )
{
   BOOL bClose = FALSE;

   if( hDLL != 0 )
   {
      bClose = FreeLibrary( hDLL );   
   }

   return bClose;
}

#pragma ENDDUMP


/* codigo tomado de internet como ejemplo.
bool bReturn = false;
HMODULE hDll = ::LoadLibrary(_T("UxTheme.dll"));
if( hDll )
{
typedef BOOL(*THEMEACTIVE)(VOID);

THEMEACTIVE pIsThemeActive = (THEMEACTIVE)GetProcAddress(hDll, "IsThemeActive");
if( pIsThemeActive )
bReturn = pIsThemeActive();
::FreeLibrary( hDll );
}
return bReturn; 

*/
 
theme.rc

Code: Select all

// Generated by ResEdit 1.5.4
// Copyright (C) 2006-2010
// http://www.resedit.net

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"




//
// Manifest resources
//
1                  RT_MANIFEST    ".\\manifest.xml"
 
y el archivo manifest.xml

Code: Select all

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>