begin process at 2012 05 29 07:39:45
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

DirectX

 > 

hardware overlay


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

hardware overlay

vendredi 24 avril 2009 à 11:49:03 | hardware overlay

acropole

Bonjour,

Je cherche des infos sur la hardware overlay. Il s'agit d'un système des cartes vidéos qui permet la gestion 2D pour créer des interfaces utilisateur. Le buffer du hardware overlay étant affiché par dessus ce qui est calculé par la carte vidéo il permet de créer des UI fonctionnant à la fois en mode fenêtré et en plein écran par dessus toute application ayant le focus. C'est un autre canal que le canal 3D habituel.
Toutes les infos que j'ai pu trouver parlent de directshow et directdraw qui sont passés à la trappe avec directx9.

Merci.
samedi 25 avril 2009 à 14:21:03 | Re : hardware overlay

rt15

Membre Club Administrateur CodeS-SourceS
Bonjour,

Tu peux faire de la 2D en Direct3D si c'est la question. Qui peut le plus peu le moins, même si directshow et directdraw était au moins encore il y a peu beaucoup utilisé.
samedi 25 avril 2009 à 19:57:47 | Re : hardware overlay

acropole

Oui, je sais qu'on peut faire de la 2D avec directx, mais le problème ici est de pouvoir afficher la 2D hors de tout contexte, que ce soit sur le bureau ou par dessus une application fenêtrée ou plein écran.
Je vais regardé ton lien, mais on m'a parlé des Swap Chains.
Affaire à suivre...
samedi 25 avril 2009 à 23:06:05 | Re : hardware overlay

rt15

Membre Club Administrateur CodeS-SourceS
Tu veux faire quelque chose comme ça ?

A priori ça n'a rien à voir avec DirectX que ce soit show, draw ou 3D. C'est juste quelques flags bien positionnés. Je crois me souvenir avoir fait des essais là dessus. Je peux donner plus d'info si ça t'intéresse.
samedi 25 avril 2009 à 23:10:02 | Re : hardware overlay

acropole

Si ça marche aussi en mode fenêtré comme une fenêtre standard windows c'est exactement ce qu'il me faut !
Toutes les infos sont les bienvenue.
dimanche 26 avril 2009 à 10:02:51 | Re : hardware overlay

rt15

Membre Club Administrateur CodeS-SourceS
WS_EX_TOPMOST

Et la fenêtre reste devant même quand on active une autre fenêtre.

#ifdef UNICODE
#define _UNICODE
#endif /* UNICODE */

#include <windows.h>
#include <tchar.h>

HINSTANCE _hThisInstance;              /* Handle du module                    */
HWND _hWnd;                            /* Handle de la fenêtre                */
LPTSTR _lpAppName = _T("StayOnTop");   /* Nom de l'appli                      */

/**
 * Affiche un message d'erreur correspondant à la dernière erreur Win32
 */
DWORD __stdcall ShowLastError()
{
  DWORD nLastError;           /* Numéro de l'erreur                           */
  LPTSTR lpMessageBuffer;     /* Récupération du message                      */

  nLastError = GetLastError();

  /* Formatage du message */
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (void*)&lpMessageBuffer, 0, NULL);

  /* Affichage du message */
  MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);

  LocalFree(lpMessageBuffer);
  return nLastError;
}

/**
 * Traitement des messages
 */
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
  int bHandled;               /* Pour savoir si le message est traité          */
  long nResult;

  nResult = 0;
  bHandled = 0;
  switch (nMessage)
  {
    case WM_DESTROY:
      /* On signale que le thread va s'arrêter */
      PostQuitMessage(0);
      bHandled = 1;
      break;
  }
  if (! bHandled)
    nResult = DefWindowProc(hWnd, nMessage, wParam, lParam);
  return nResult;
}

/**
 * Initialise la fenêtre principale de l'appli.
 */
int __stdcall CreateMyWindow()
{
  WNDCLASSEX wincl;       /* Classe de la fenêtre utilisée                    */
  int nResult;

  nResult = 0;

  /* Création de la classe de fenêtre */
  wincl.cbSize = sizeof(WNDCLASSEX);
  wincl.style = 0;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.cbClsExtra = 0;
  wincl.cbWndExtra = 0;
  wincl.hInstance = _hThisInstance;
  wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
  wincl.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
  wincl.lpszMenuName = 0;
  wincl.lpszClassName = _lpAppName;
  wincl.hIconSm = NULL;

  /* Enregistrement de la classe */
  if (! RegisterClassEx(&wincl)) goto the_end;

  /* Création de la fenêtre */
  _hWnd = CreateWindowEx(WS_EX_TOPMOST,
                         _lpAppName, _lpAppName,
                         WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
                         HWND_DESKTOP, NULL, _hThisInstance, NULL);
  if (! _hWnd) goto the_end;

  /* Affichage de la fenêtre */
  ShowWindow (_hWnd, SW_SHOW);

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Main
 */
int __cdecl WinMainCRTStartup()
{
  MSG messages;                       /* Messages envoyés à l'application     */
  int nResult;

  /* Récupération du handle du module */
  _hThisInstance = GetModuleHandle(NULL);

  if (! CreateMyWindow())
  {
    nResult = ShowLastError();
    goto the_end;
  }

  /* Boucle de traitement des messages */
  while (GetMessage(&messages, NULL, 0, 0))
  {
    TranslateMessage(&messages);
    DispatchMessage(&messages);
  }
  nResult = messages.wParam;

the_end:
  /* ExitProcess nécessaire car sinon c'est un ExitThread */
  ExitProcess(nResult);

  /* Pour esquiver le warning */
  return 0;
}

dimanche 26 avril 2009 à 10:25:28 | Re : hardware overlay

acropole

J'avais déjà essayé en managed et j'ai réessayé avec le code standard comme celui que tu as donné.
Ça ne marche ni sur Quake 3 ni sur Left4Dead.
WS_EX_TOPMOST ne place la fenêtre que devant toute fenêtre non WS_EX_TOPMOST. Il y'a donc de nombreux cas dans lesquels ça ne marche pas. A mois qu'il ne suffise pas de mettre WS_EX_TOPMOST et que quelque chose d'autre m'a échappé.
dimanche 26 avril 2009 à 11:22:59 | Re : hardware overlay

rt15

Membre Club Administrateur CodeS-SourceS
Visiblement, les gens s'orientent plutôt vers un hook des fonction de rendu de manière à dessiner depuis l'application en question... Mais ce n'est très probablement pas la technique employée pour "game overlay" de mon lien plus haut. Ce logiciel fonctionne-t-il sur Quake 3 ?

A tout hasard, je vais essayer de faire un bout de code qui s'arrange pour que seule la fenêtre courante soit WS_EX_TOPMOST.
dimanche 26 avril 2009 à 12:04:54 | Re : hardware overlay

acropole

J'ai regardé pas mal de trucs sur le hook et l'injection de d3d.dll, mais le problème ici est que ça ne marche qu'a l'intérieur de l'application, pas sur le bureau ni à cheval sur une application fenêtrée et le bureau.
Pourtant c'est possible [ Lien ]

> A tout hasard, je vais essayer de faire un bout de code qui s'arrange pour que seule la fenêtre courante soit WS_EX_TOPMOST.

Je ne vois pas comment. Si c'était possible on pourrait se retrouver avec des fenêtres qui bataillent pour être topmost et bloquer le pc. Du genre "si je ne suis plus devant, me mettre devant" qui déclanche le "si je ne suis plus devant, me mettre devant" de l'autre et ainsi de suite.

Je pense qu'il faut dessiner directement dans la carte vidéo juste avant qu'elle n'envoi les infos à l'écran, ce qui marcherait quelque soit ce qui est affiché à l'écran.
dimanche 26 avril 2009 à 13:29:57 | Re : hardware overlay

rt15

Membre Club Administrateur CodeS-SourceS
"Si c'était possible on pourrait se retrouver avec des fenêtres qui bataillent pour être topmost et bloquer le pc. Du genre "si je ne suis plus devant, me mettre devant" qui déclanche le "si je ne suis plus devant, me mettre devant" de l'autre et ainsi de suite."

Bah vi ça peut rentrer en conflit avec une application existante... Mais bon, n'est ce pas ce que tu veux au final, que ce soit ton application qui soit au premier plan quitte à batailler avec le reste du monde ?

Cette application s'arrange pour être la seule topmost. C'est mal codé (timer...) mais c'est suffisant pour faire des essais. Globalement, cela supprime le caractère top most de toutes les fenêtres sauf de la fenêtre courante. Cela fonctionne sur des applications classique. Je n'ai pas essayé avec un jeu.

#ifdef UNICODE
#define _UNICODE
#endif /* UNICODE */

#include <windows.h>
#include <tchar.h>

#define TIMER_ID 1
#define BUFFER_SIZE 1024

HINSTANCE _hThisInstance;              /* Handle du module                    */
HWND _hWnd;                            /* Handle de la fenêtre                */
LPTSTR _lpAppName = _T("StayOnTop");   /* Nom de l'appli                      */
HDESK _hDesk;                          /* Handle sur le desktop               */

/**
 * Affiche un message d'erreur correspondant à la dernière erreur Win32
 */
DWORD __stdcall ShowLastError()
{
  DWORD nLastError;           /* Numéro de l'erreur                           */
  LPTSTR lpMessageBuffer;     /* Récupération du message                      */

  nLastError = GetLastError();

  /* Formatage du message */
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (void*)&lpMessageBuffer, 0, NULL);

  /* Affichage du message */
  MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);

  LocalFree(lpMessageBuffer);
  return nLastError;
}

/**
 * Call back appelée pour toutes les fenêtres
 */
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
  if (IsWindowVisible(hwnd) && (hwnd != _hWnd))
    SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0,
                 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
  return TRUE;
}

/**
 * Traitement des messages
 */
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
  int bHandled;               /* Pour savoir si le message est traité          */
  long nResult;

  nResult = 0;
  bHandled = 0;
  switch (nMessage)
  {
    case WM_TIMER:
      EnumDesktopWindows(_hDesk, EnumWindowsProc, 0);
      bHandled = 1;
      break;
    case WM_DESTROY:
      /* On signale que le thread va s'arrêter */
      PostQuitMessage(0);
      bHandled = 1;
      break;
  }
  if (! bHandled)
    nResult = DefWindowProc(hWnd, nMessage, wParam, lParam);
  return nResult;
}

/**
 * Initialise la fenêtre principale de l'appli.
 */
int __stdcall CreateMyWindow()
{
  WNDCLASSEX wincl;       /* Classe de la fenêtre utilisée                    */
  int nResult;

  nResult = 0;

  /* Création de la classe de fenêtre */
  wincl.cbSize = sizeof(WNDCLASSEX);
  wincl.style = 0;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.cbClsExtra = 0;
  wincl.cbWndExtra = 0;
  wincl.hInstance = _hThisInstance;
  wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
  wincl.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
  wincl.lpszMenuName = 0;
  wincl.lpszClassName = _lpAppName;
  wincl.hIconSm = NULL;

  /* Enregistrement de la classe */
  if (! RegisterClassEx(&wincl)) goto the_end;

  /* Création de la fenêtre */
  _hWnd = CreateWindowEx(WS_EX_TOPMOST,
                         _lpAppName, _lpAppName,
                         WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
                         HWND_DESKTOP, NULL, _hThisInstance, NULL);
  if (! _hWnd) goto the_end;

  /* Affichage de la fenêtre */
  ShowWindow (_hWnd, SW_SHOW);

  nResult = 1;
the_end:
  return nResult;
}

/**
 * Main
 */
int __cdecl WinMainCRTStartup()
{
  MSG messages;                       /* Messages envoyés à l'application     */
  int nResult;

  /* Récupération du handle du module */
  _hThisInstance = GetModuleHandle(NULL);

  /* Récupération d'un handle sur le desktop (CloseDesktop pas nécessaire) */
  _hDesk = GetThreadDesktop(GetCurrentThreadId());
  if (! CreateMyWindow())
  {
    nResult = ShowLastError();
    goto the_end;
  }

  /* Création du timer */
  if (! SetTimer(_hWnd, TIMER_ID, 100, NULL))
  {
    nResult = ShowLastError();
    goto the_end;
  }

  /* Boucle de traitement des messages */
  while (GetMessage(&messages, NULL, 0, 0))
  {
    TranslateMessage(&messages);
    DispatchMessage(&messages);
  }
  nResult = messages.wParam;

the_end:
  /* ExitProcess nécessaire car sinon c'est un ExitThread */
  ExitProcess(nResult);

  /* Pour esquiver le warning */
  return 0;
}


1 2

Cette discussion est classée dans : créer, infos, permet, hardware, overlay


Répondre à ce message

Sujets en rapport avec ce message

Projet Qt sous .NET [ par tomsp ] bonsoir a tous,Je me permet de venir poser ma question aussi bête qu'elle soit, mais ca fait plusieurs jours que j'essaye de résoudre mon problème en Afficher des news à intervalle régulier [ par lukaslunt ] Bonjour tout le monde; Je suis débutant en programmation c'est pour cela que j'aurais besoins de votre aide. J'aimerais savoir si il est possible en création de dll sous vb 2005 [ par snowlover18 ] Bonjour a tous. Alors voila. Je suis débutant en c++ et je dois , pour ma société, rajouter des fonctionnalités (boutons et autre) a un logiciel de ge usage de la fonction CreateSolidBrush( ) [ par floufy69100 ] Bonjours, j'ai un petit problème que je n'arrive pas à résoudre, je réussi à créer et à afficher une fenêtre windows, mais mon compilateur me dit qu'i Créer une icone dans le poste de travail ? [ par norton ] Bonjour à tous. Je développe une application qui sauvegarde des fichiers. J'aimerai savoir si il est possible d'ajouter une îcone de lecteur dans le Créer un compilateur C avec C [ par agsudoku ] Bonjour Je suis appelée à créer un compilateur C dans le cadre d'un projet. je connais le principe(analyse lexicale, ensuite syntaxique, analyse sé Comment créer un périph usb [ par lacaulac ] [HELP] Créer une fenêtre GUI de forme personnalisé avec SDL [ par etoileastrale ] Bonjour, je souhaite en utilisant la bibliothèque SDL et VC++ 2008 pour créer une fenêtre non pas carré comme d'habitude mais de forme personnalisé. Information pour sécuriser un fichier compilé [ par ruskofszym ] Coucou tout le monde Alors voila mon problème ou plutôt ma question : Dans mon boulot j'ai créer un petit code que d'autres personnes veulent utilis Récupérer les infos sur les services Windows [ par sen25000 ] Bonjour. Comment afficher dans un fichier/tableau la liste des services Windows de façon à savoir quand ils ont démarré et quand ils se sont arrêtés.


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 0,484 sec (4)

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