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>