Voila une petite source qui affiche un graphique transparent du débit réseau (moyenne sur 1/2 minute)
Objectifs:
----------
- modification du curseur
- déplacement d'une fenêtre par la souris
- dessin de graphiques
- récupération des octets téléchargés et envoyés
- transparence de fenêtre
click gauche = déplacement
click droit = quitter
Attention modifier "ncard" pour spécifier votre carte réseau si ce n'est pas la 1ère
comme d'habitude modifier renommer le fichier ".ex" en ".exe",
attention j'ai sélectionné un débit de 800ko/128ko et la première carte réseau pour une utilisation autre il faudra modifier ces variables.
enjoy ;)
Source / Exemple :
//------------------------------------------------------------------------------
// Projet Graph : mesure du débit entrant/sortant (moyennes)
// Auteur : Hanteville Nicolas
// Fichier : proc.c
// Version : 0.1
// Date de modification : 20/04/2008
// Description : code pour exemple
// Environnement : compatibilité DEVCPP / VISUAL C++ / BORLAND C++ 5.x
//------------------------------------------------------------------------------
/*
Objectifs:
----------
- modification du curseur
- déplacement d'une fenêtre par la souris
- dessin de graphiques
- récupération des octets téléchargés et envoyés
- transparence de fenêtre
click gauche = déplacement
click droit = quitter
Attention modifier "ncard" pour spécifier votre carte réseau si ce n'est pas la 1ère
//------------------------------------------------------------------------------
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <iphlpapi.h> //-liphlpapi
#pragma comment(lib, "iphlpapi.lib")
//------------------------------------------------------------------------------
//débit réseau en ko entrant/sortant
#define debit_dw 800 // ko
#define debit_up 128 // ko
//tailles de graph + fenêtre
#define x_refresh 0
#define y_refresh 0
#define xx_refresh 264
#define yy_refresh 95
#define x_cadre_i 150
#define y_cadre_m 46
//bordure entre les cadres + espacement internes
#define border 5
#define espace 3
//sélection de la carte réseau
#define ncard 0
//nombre de valeurs /graphiques
#define NB_Item 28
#define szClassName "WindowsApp"
BOOL start;
RECT rect;
float items[NB_Item];
float itemo[NB_Item];
HWND hwnd;
//------------------------------------------------------------------------------
//timer de mise à jour du schéma + down + upload
DWORD WINAPI timer(LPVOID lParam)
{
unsigned short i;
PMIB_IFTABLE buffer;
ULONG size=0;
//instance pour récupération de la structure
GetIfTable (NULL, &size, TRUE);
buffer = (PMIB_IFTABLE)GlobalAlloc(GMEM_FIXED, size);
//lecture actuel + init des valeurs
GetIfTable(buffer, &size, FALSE);
int in = buffer->table[ncard].dwInOctets;
int out = buffer->table[ncard].dwOutOctets;
//tant que l'on ne quitte pas on continue
while(start)
{
_sleep(1000);//toutes les secondes maj
//rotation des valeurs
for (i=0;i<NB_Item-1;i++)
{
items[i]=items[i+1];
itemo[i]=itemo[i+1];
}
//maj des valeurs
GetIfTable(buffer, &size, FALSE);
//copie du débit en ko
items[NB_Item-1]=(buffer->table[ncard].dwInOctets-in)/1024;
itemo[NB_Item-1]=(buffer->table[ncard].dwOutOctets-out)/1024;
//totaux
in = buffer->table[ncard].dwInOctets;
out = buffer->table[ncard].dwOutOctets;
//emplacement de refresh de la forme
/*rect.left = x_refresh;
rect.top = y_refresh;
rect.right = xx_refresh;
rect.bottom = yy_refresh;*/
//toute le forme ici
InvalidateRect(hwnd,0/*&rect*/,FALSE);
UpdateWindow(hwnd);
}
GlobalFree(buffer);
}
//------------------------------------------------------------------------------
/* This function is called by the Windows function DispatchMessage() */
POINT pt;
int mouseX,mouseY;
BOOL bCapture;
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
//gestion du déplacement de la fenêtre
case WM_LBUTTONDOWN:
mouseX = LOWORD(lParam);
mouseY = HIWORD(lParam);
SetCapture(hwnd);
bCapture = 1;
return 0;
break;
case WM_LBUTTONUP:
if(GetCapture() == hwnd)
{
ReleaseCapture();
bCapture = 0;
GetCursorPos(&pt);
SetWindowPos(hwnd, 0, pt.x - mouseX, pt.y - mouseY, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
break;
case WM_MOUSEMOVE:
if(bCapture)
{
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
ClientToScreen(hwnd, &pt);
SetCursor( LoadCursor( NULL , IDC_SIZEALL ));//icone de déplacement
SetWindowPos(hwnd, 0, pt.x - mouseX, pt.y - mouseY, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
break;
//----
//on quit par un click droit
case WM_RBUTTONDOWN:
start=0;
PostQuitMessage (0);
break;
//dessin du graphique + fenêtre
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd,&ps);
HBRUSH Hb1 = CreateSolidBrush(RGB(0, 150, 0)); //vert
HBRUSH Hb2 = CreateSolidBrush(RGB(150, 0, 0)); //rouge
int a;
unsigned int taillephrag,nbnb;
unsigned short val,val2;
float moy=0,moyout=0;
//rect de contour global
Rectangle(hdc,0,0,xx_refresh,yy_refresh);
//les 2 autres rectangles
Rectangle(hdc,border,border,x_cadre_i,y_cadre_m);
Rectangle(hdc,border,y_cadre_m+espace,x_cadre_i,yy_refresh-border);
for (a=0;a<NB_Item;a++)
{
moy+=items[a];
moyout+=itemo[a];
//position de la barre d'état
val2 = 8+a*(5);
//down
val =y_cadre_m-(y_cadre_m-8)*items[a]/debit_dw;
if (val<8)val=8;
SelectObject(hdc,Hb1);
Rectangle(hdc,val2,val,val2+4,y_cadre_m);
//up
val =yy_refresh-border-(y_cadre_m-8)*itemo[a]/debit_up;
if (val<52)val=52;
SelectObject(hdc,Hb2);
Rectangle(hdc,val2,val,val2+4,yy_refresh-5);
}
moy = moy/NB_Item;
moyout= moyout/NB_Item;
//on ajoute les écritures max et min
char tmpMoy[256];
//min
rect.top = yy_refresh-20;
rect.bottom = yy_refresh-border;
rect.left = x_cadre_i+espace;
rect.right = xx_refresh-border;
FillRect(hdc, &rect, GetSysColorBrush(COLOR_WINDOW));
SetTextColor(hdc, GetSysColor(COLOR_MENUTEXT));
//1000 car au dessus de 999.99
if (moyout<1000)sprintf(tmpMoy,"up:%5.2fKo/s",moyout);
else if (moyout<1024000)sprintf(tmpMoy,"up:%5.2fMo/s",moyout/1024.0);
else sprintf(tmpMoy,"up:%5.2fGo/s",moyout/1048576.0);
DrawText(hdc,tmpMoy,strlen(tmpMoy), &rect, DT_VCENTER);
//max
rect.top = border;
rect.bottom = (y_cadre_m+espace)*2;
if (moyout<1000)sprintf(tmpMoy,"dw:%5.2fKo/s",moy);
else if (moyout<1024000)sprintf(tmpMoy,"dw:%5.2fMo/s",moy/1024.0);
else sprintf(tmpMoy,"dw:%5.2fGo/s",moy/1048576.0);
DrawText(hdc,tmpMoy,strlen(tmpMoy), &rect, DT_VCENTER);
//libération
DeleteObject(Hb1);
DeleteObject(Hb2);
EndPaint(hwnd,&ps);
}
break;
case WM_DESTROY:
start=0;
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
//------------------------------------------------------------------------------
int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
{
MSG messages;
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&wincl))
return 0;
//fenêtre sans icone dans la barre des tâche
hwnd = CreateWindowEx (WS_EX_LAYERED|WS_EX_NOACTIVATE|WS_EX_TOPMOST,szClassName,"Windows App",WS_POPUP,900,200,xx_refresh,yy_refresh,HWND_DESKTOP,NULL,hThisInstance,NULL);
//on affiche la fenêtre
ShowWindow (hwnd, 1);
//définition de l'état de transparence (0-255), 255= opaque
SetLayeredWindowAttributes(hwnd,0,150,0x02);
//timer maj
start=1;
CreateThread(NULL,0,timer,0,0,0);
//définision de la région a afficher ici non utile car = fenêtre
//HRGN region = CreateRectRgn(x_refresh,y_refresh,xx_refresh,yy_refresh);
//SetWindowRgn(hwnd,region,1);
bCapture=0;
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.