begin process at 2012 02 10 10:50:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

GetLayeredWindowAttributes et Windows 2000


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

GetLayeredWindowAttributes et Windows 2000

vendredi 13 mars 2009 à 08:54:17 | GetLayeredWindowAttributes et Windows 2000

Xaviou

Bonjour à tous.

J'ai un petit soft qui tourne actuellement sur différentes machines, dont certaines encore équipées de Windows 2000.

A un moment donné, j'ai besoin de récupérer les éventuelles informations de transparence d'une fenêtre.
Mais Windows 2000, s'il possède bien la fonction SetLayeredWindowAttributes, ne possède pas la fonction GetLayeredWindowAttributes.
D'après MSDN, cette fonction est apparue à partir deWindow XP.

Je passe donc par la fonction GetWindowLong pour savoir si oui ou non la fenêtre a le style transparent (car dans ce cas, elle a le style WS_EX_LAYERED).
Par contre, je ne sais pas comment retrouver les valeurs des deux derniers paramètres de GetLayeredWindowAttributes :

Merci d'avance pour vos éventuelles  pistes (ou solutions).

@+
Xav'
samedi 14 mars 2009 à 20:00:22 | Re : GetLayeredWindowAttributes et Windows 2000

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Désassemblé, sous XP, c'est juste un appel au service système 0x125C...

Je ne trouve plus la doc avec les numéros des services systèmes par OS...
dimanche 15 mars 2009 à 15:11:13 | Re : GetLayeredWindowAttributes et Windows 2000

Xaviou

Salut.

Est-ce que tu peux m'en dire plus sur ce genre de truc (les appels aux services systèmes). C'est quelque chose que je ne connais pas du tout.
Quels genre de services peut-on appeler de cette façon (je suppose qu'il ne s'agit pas des mêmes services que ceux auxquels on peut avoir accès depuis le panneau de configuration, mais je ne voispas du tout à quoi ça correspond).

Merci d'avance.

@+
Xav'
dimanche 15 mars 2009 à 17:42:24 | Re : GetLayeredWindowAttributes et Windows 2000

rt15

Membre Club Administrateur CodeS-SourceS
En gros un certain nombre de fonction win32 (CreateFile) appellent des fonctions présentes dans ntdll (NtCreateFile). Ces fonctions préfixées par Nt font souvent un appel à un service système, c'est à dire une fonction du noyau. Les fonctions préfixées Nt mettent le numéro de service dans le registre eax et appellent KiFastSystemCall, une fonction de NtDll. Cette fonction utilise l'instruction sysenter pour passer en mode noyau et exécuter la fonction KiFastCallEntry de celui-ci. KiFastCallEntry appelle KiSystemService. KiSystemService regarde dans la GTD ou LTD l'adresse de la fonction correspondant au numéro de service mis en place dans eax par la fonction préfixée Nt. Et le service peut enfin s'exécuter.

Plus d'infos ici.

Dans ton cas, GetLayeredWindowAttributes ne passe pas par une fonction Nt
GetLayeredWindowAttributes. Le code de cette fonction de user32 est le suivant :

mov eax, 0x125C
mov edx,
KiFastSystemCall
call dword ptr edx

Bref elle fait le boulot de NtDll à la place de NtDll.
Ce qui est un peu curieux (Pour moi...), c'est le numéro du service : 0x125C, qui est sensé correspondre à une entrée dans la GDT. Il est sacrément élevé...

Tu pourrais donc facilement implémentée ta propre GetLayeredWindowAttributes pour un OS en particulier : quelques lignes d'assembleur...

Mais le numéro de service n'est pas forcément compatible avec windows 2000 : les numéros peuvent changer d'un NT à l'autre. Et le service GetLayeredWindowAttributes n'existe peut être tout simplement pas sous 2000.

Pour aller plus loin, il faudrait regarder dans la GDT si
0x125C est un index valide, et désassembler la fonction correspondante.

Le problème de la chose étant qu'il faut un débugueur noyau et savoir à peu près s'en servir. (Windbg un des "Debugging Tools for Windows" s'en sort très bien en mode non intrusif pour ce genre de chose). Et qu'ensuite il faudrait (Probablement) faire un driver pour windows 2000 faisant la même chose que le code désassemblé d'un XP ou d'un Vista.

Bref, il y a pas mal de boulot...
dimanche 15 mars 2009 à 18:06:11 | Re : GetLayeredWindowAttributes et Windows 2000

rt15

Membre Club Administrateur CodeS-SourceS
Erratum sur mon code de GetLayeredWindowAttributes, mais bon c'est le même esprit...
mov eax, 0x125C
mov edx,
entrée KiFastSystemCall dans la table d'import
call dword ptr edx

Je supporte plus Vista. Et il a même pas ntsd, un petit débugueur bien sympa présent sous XP par défaut.


lundi 16 mars 2009 à 13:41:27 | Re : GetLayeredWindowAttributes et Windows 2000

Xaviou

Gloups....

C'est d'un niveau malheureusement trop élevé pour que je m'y mette

Va falloir que je trouve une autre solution.

J'ai bien, dans un premier temps, trouvé ceci, mais en regardant le code source fourni, la fonction recréée ne retourne pas les valeurs correspondantes à la fenêtre. Elle renvoie tout simplement les valeurs 0x00FFFFFF pour COLORREF, 0xFF pour la valeur alpha, et LW_ALPHA pour les flags. Autant dire que ça ne sert à rien.

Il y a ensuite ce projet (qu'il faudrait que je teste pour voir si la fonction GetLayeredWindowAttributes fonctionne correctement), mais cette fois-ci, le problème est tout autre : il s'agit d'un package à installer qui, d'après ce que j'ai compris, fait une copie de certaines dll et prend leur place.
Par exemple, la dll user32.dll est "renommée" en user2k.dll, et la nouvelle user32.dll mise prend sa place et lui est linkée.
Le genre de truc que l'on ne veut surtout pas imposer à nos utilisateurs.

En tout cas, merci pour avoir pris le temps de regarder mon problème, et pour tes explications.

@+
Xav'


Cette discussion est classée dans : fonction, windows, fenêtre, getlayeredwindowattributes, éventuelles


Répondre à ce message

Sujets en rapport avec ce message

[Visual C] Comment rediriger des fprintf() vers une fenêtre windows [ par castelj ] Bonjour,Débutant en programmation windows, mon problème est que j'aimerai savoir comment est-ce que l'on peut faire des fprintf dans une fenetre Windo Remplacer la fonction de copie de fichier sous Windows [ par MangaII ] Salut !Quelqu'un sorai-t-il comment on pe remplacer la fonction de copie de fichier sous Windows par un programme maison !Mon but est d'optimiser la c Fenêtre windows... [ par ELECTRORESiSTiK ] Salut,Je suis debutant en Visual C++ et je n'arrive pas à créer ce que je veux faire...Je voudrais créer une fenêtre windows ( Form ) avec 2 edit box fonction system avec windows [ par darkalpha ] jutilise un programme afin de détecter quand un overflow se produit (le nombre de caractères) et le pb c que le programme entré avec system n'existe p ShowWindow() [ par JCpp ] ShowWindow(hdlg,SW_HIDE);Je viens de comprendre pourquoi quand je cache une fenêtre, elle n'apparaît pas avec la fonction : ShowWindow(hdlg,SW_SHOW);E activation fenêtre après lancement automatique sous windows 2000 [ par polkas ] Bonjour,Je développe un Ecran de Veille demandant un Password qui peut être activer par l ' utilisateur ou lancer automatiquement sous Windows 2000Pro activer une fenetre dans une appli MDI [ par arno2004 ] Bonjourj'ai récupérer un éditeur de dessin. j'y est ajouter une fonction'ci dessous) pour copier une zone sélectionnée dans une nouvelle fenêtre. la f Comment créer une fenêtre Windows [ par lebarn ] Bonmatin, bonaprèsmidi, bonsoir, bonnuit, bonmidi, etc ...Comment peut-on créer un fenêtre Windows ? Car j'ai de nombreux problème et je ne comprends Recopier une zone mémoire dans une fenêtre windows [ par brosse_adan ] Bonjour à tous!mon sujet était peut-être pas super bien choisi, mais bon, j'avais pas mieux... et en plus, mon pb est compliqué à exposer!! :)voilà, j Fonction API permettant de copier le contenu d'une fenêtre dans une var HBITMAP [ par elflink ] Bonjour à tous et à toutes,Je suis à la recherche d'une fonction API qui permettrait de copier le contenu d'une fenêtre window dans une variable de ty


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,432 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales