Continuer a faire tourner uen appli en la reduisant dans le systeme tray [Résolu]

Signaler
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012
-
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012
-
Slt a tous,

Voila je pense que le titre est bien detaille

Alors voila j'ai un prog qui met l'appli dans le systemtray (d'ailleur savez vosu comment faire pour quand on quitte sur reduire on met l'appli hidden dans le systray) et par la meme occasion comment faire pour que quand l'appli est reduite elle continue de tourner.

Si qqun a une idee ou si vous avez un lien vers des sources(pourtant j'ai cherche) il est le bienvenue.

Merci ++ Nexus

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.

15 réponses

Messages postés
688
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
19 mai 2005

voila un petit exemple sur comment realiser des thread (piké du site developez)

#include <windows.h>
#include <stdio.h>
#include <conio.h>

// prototye de la procédure utilisée pour notre 2e thread
DWORD WINAPI ThreadProc(LPVOID lpParam);

int main(int argc, char* argv[])
{
DWORD ThreadId;
// On démarre le thread. ThreadId est l'identifiant du thread
// ThreadId ne nous est d'aucune utilité dans cet exmple car le thread se termine de lui même
CreateThread(NULL,NULL,ThreadProc,NULL,NULL,&ThreadId);

// Nous sommes en attente mais le thread peut écrire dans la console
Sleep(2000);

// Le thread est maintenant terminé, on quitte
printf("On ferme!\nPressez une touche !\n");

// Pressez une touche !
getch();
return 0;
}

// Procédure utilisée par le thread
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
// Pendant que le thread principal est en attente, nous affichons sur la console
printf("Je suis actif...\n");

// On ferme, le thread va être arrèté par le système dès que cette fonction retournera
return 0;
}
Life is Short 8-)
Messages postés
688
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
19 mai 2005

Oki ami :)

pour ca tu dois realiser des thread :)

Life is Short 8-)
Messages postés
69
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
19 octobre 2005
4
Oui il faut un thread pour qu'il tourne...
Le code pour systray est ici:
http://www.cppfrance.com/code.aspx?ID=19613
(Cherche d'abord les sources sur cppfrance parcequ'on a plein ici!)
J'espere que ça t'aide!
(Des remerciements a "swonder" qui a ecrit le source sur le systray!)
.486
.model flat, stdcall
option casemap:none
Messages postés
688
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
19 mai 2005

Merci alller beybey
Life is Short 8-)
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012

En fait pour moi c un peu complique LordBob que je remercie m'a fait une ptite source qui permet d'utilsier la systray
lol ca va faire gros dans le forum mais voila je sais pas trop ou mettre le thread j'ai bien compris son fonctionnement mais c la premiere fosi que je touche au systray et au thread :
#include "calendrier.h"

HINSTANCE hInst;
BOOL AffichageMenu = FALSE;

// fonction pour ajouter l'icone a la systray
BOOL AddIcone(HINSTANCE hInst, HWND hWnd, UINT id, LPTSTR IconName, char *infobulle)
{
BOOL res;

NOTIFYICONDATA trid;

trid.cbSize = sizeof(NOTIFYICONDATA);
trid.hWnd = hWnd;
trid.uID = id;
trid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
trid.uCallbackMessage = WM_TRAY_ICONE;
trid.hIcon = LoadIcon(hInst, IconName);

if (infobulle)
lstrcpyn(trid.szTip, infobulle, sizeof(trid.szTip));
else
trid.szTip[0] = '\0';

res = Shell_NotifyIcon(NIM_ADD, &trid);

return res;
}

// fonction pour enlever l'icone de la systray
BOOL RetIcone(HWND hWnd, UINT id)
{
BOOL res;

NOTIFYICONDATA trid;
trid.cbSize = sizeof(NOTIFYICONDATA);
trid.hWnd = hWnd;
trid.uID = id;

res = Shell_NotifyIcon(NIM_DELETE, &trid);

return res;
}

// fonction pour la console
void StartConsole()
{
AllocConsole(); // affiche console
SetConsoleTitle("Calendrier by A&Nexus"); // titre console

// redirection flux entree/sortie
freopen("conin$", "r", stdin); 
freopen("conout$", "w", stdout); 
freopen("conout$", "w", stderr);

// le reste de la fonction est le code du programme console que l'on souhaite qu'il
// realise, comme un programme console "normal"

main_console();

FreeConsole();
}

// fonction permettant de quitter le menu A Propos
BOOL CALLBACK APDDialogProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_APROPOS_OK:
EndDialog(hWnd, 0);
return TRUE;
}
break;
}
return FALSE;
}

// fonction principal du programme
BOOL CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
// initialisation de la boite de dialogue (on ajoute le prog a la systray)
case WM_INITDIALOG:
SetClassLong(hWnd, GCL_HICON, (long)LoadIcon(hInst, (LPCTSTR)IDI_ICON));
AddIcone(hInst, hWnd, 2, MAKEINTRESOURCE(IDI_ICON), "Calendrier by A&Nexus");

// on rend invisible le dialog
WINDOWPLACEMENT My_Hwnd;
My_Hwnd.length = sizeof(WINDOWPLACEMENT);
My_Hwnd.showCmd = SW_HIDE;
SetWindowPlacement(hWnd,&My_Hwnd);
break;

case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDCANCEL: // on ferme le programme
{
EndDialog(hWnd, FALSE);
return TRUE;
}

case ID_TRAY_ITEM_1: // Affichage Console
{
StartConsole();
return TRUE;
}

case ID_TRAY_ITEM_2: // Affichage A Propos
{
DialogBox((HINSTANCE) GetModuleHandle (NULL), MAKEINTRESOURCE(IDD_APROPOS), hWnd, APDDialogProc);
return TRUE;
}

case ID_TRAY_ITEM_3: // quitter le programme
{
RetIcone(hWnd, 2); // on retire l'icone de la systray
EndDialog(hWnd, FALSE); // on ferme la boite de dialogue

return TRUE;
}
}
}

case WM_TRAY_ICONE: // pour l'affichage menu
{
// seulement si double clik gauche ou clic droit
if(AffichageMenu || (lParam != WM_RBUTTONUP && lParam != WM_LBUTTONDBLCLK))
return FALSE;

HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENUTRAY));

if(!menu)
return FALSE;

HMENU submenu = GetSubMenu(menu, 0);

if(!submenu)
return FALSE;

// si clique droit
if(lParam == WM_RBUTTONUP)
{
AffichageMenu = TRUE;
POINT mouse;
GetCursorPos(&mouse);
SetMenuDefaultItem(submenu, ID_TRAY_ITEM_1, FALSE);
SetForegroundWindow(hWnd);
TrackPopupMenu(submenu, TPM_RETURNCMD || TPM_RIGHTALIGN, mouse.x, mouse.y, 0, hWnd, NULL);
AffichageMenu = FALSE;
DestroyMenu(submenu);
DestroyMenu(menu);

return TRUE;
}
else // sinon c'est un double clique gauche
{
StartConsole();
return TRUE;
}
}

default:
return FALSE;
}

return TRUE;
}

// fonction permettant que le prog n'apparaisse pas dans la taskbar
BOOL CALLBACK DemDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg) 
  {
case WM_INITDIALOG: // initialisation de ma boite de dialogue
      PostMessage(hWnd, bnuSWOW_APP, 0, 0);
      return TRUE;

    case bnuSWOW_APP:
      DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_MAIN), hWnd, MainDlgProc, 0
);
      EndDialog(hWnd, 0);
  }
  return 0;
}

// fonction WinMain
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
hInst = hInstance;

StartConsole();

DialogBox(hInst, MAKEINTRESOURCE(IDD_DEM), 0, (DLGPROC)DemDlgProc);

return 0;
}

Ca fait pas si gros finalement ?-)
main_console est mon appli console.

Un gros merci a celui qui trouve la reponse (gspr qu' elle n'est pas bien dur)

Merci ++ Nexus le new....

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
Messages postés
688
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
19 mai 2005

ben tu le met la creation du theard dans le winmain et voila
Life is Short 8-)
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012

Ok merci ca marche je peux utiliser les autres options de la systray totu en faisaint le programme mais en fait j'ai un autre probleme serieux car pour lancer mon programme le source me le lance mais apres je susi oblige de quitter le programme comment faire pour lui dire SI(bouton reduire OU bouton croix enclenche)
ALORS
je reduit ma fenetre dans le systeme tray prete a etre reouverte si je rappelle ma fonction StartConsole();

// fonction pour la console
void StartConsole()
{
AllocConsole(); // affiche console
SetConsoleTitle("Calendrier by A&Nexus"); // titre console

// redirection flux entree/sortie
freopen("conin$", "r", stdin); 
freopen("conout$", "w", stdout); 
freopen("conout$", "w", stderr);

// le reste de la fonction est le code du programme console que l'on souhaite qu'il
// realise, comme un programme console "normal"

main_console();

        //Quitte la console
FreeConsole();
}


Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
Messages postés
688
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
19 mai 2005

ben tu met une var globale nomé par exemple
bool isminimized=false;

puis dans l'evenement de reduction de la feulle tu donne met

isminimized =true;

alors la tu aura une var qui te determinera la si t en minimized ou non ;)
juste des astuce
Life is Short 8-)
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012

ok je te remercie mais comment faire pour la minimiser cette console sachant qu'elle s'ouvre et se ferme a chaque appel de cette fonction.
pusique je fais un AllocConsole(); et un FreeConsole();

Merci. ++ Nexus

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
Messages postés
688
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
19 mai 2005

ben je comprend pas bccp la car la verité j'ai pas bien regarder ton code ben tu utilise de la win32 alors la tu na cas geré les evenement si tu connais pas comment alors il te faut un solid cours de la win32 :)
http://bob.developpez.com/tutapiwin/
Life is Short 8-)
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012

En fai tpour bien t'expliquer je n'utilise du Win32 que pour pouvoir utiliser le systray et a partir de la je lance mon appli en console. toute mon appli est en console.
je lance l'appli a partir de la fonction AllocConsole() et la ferme avec FreeConsole() le probleme c que j'aimerais juste l'ouvrir avec AllocConsole et ne plus jamais la fermer sauf quand la personne ferme avec le bouton droit sur le systray puis quitter.
sinon si la personne appuie sur la croix de la console ou la quitte ou la reduit j'aimerais que ca rentre dans le systray et que on la reactive en la double cliquant dessus

moi il me manque plus que la methode pour reduire ou fermer la consoel pour la cacher dans le systray et qu'elle continue de tourner tout le reste je l'ai deja programme.
C dommage il me manque que ca et j'ai presque finit mon projet. %-6

Merci. ++ Nexus

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
Messages postés
688
Date d'inscription
jeudi 26 décembre 2002
Statut
Membre
Dernière intervention
19 mai 2005

TU PEUT A LA PLACE DE la reduire la caché avec l'api ShowWindow et la dire au prog si il clique sur la systray alors la il la montr esinon il la cache et si il qu'il il qui aussi le prog dos
pour utiliser l'api Showwinds tuutilsse pour le premier agrument le Hwnd de la fenetre et au desieme deux constant
..Show ou ... Hide

aller a@+ je dor moi
Life is Short 8-)
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012

ok je te remercie ca a l'air d'etre une excellente idee
bon dodo.

Merci
Merci. ++ Nexus

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
j'ai fais une application ki peux t'intéréssé également

http://www.cppfrance.com/code.aspx?ID=24582

met dans le systray en clickant sur une fenetre,

tu peux également voir l'énumération des processus avec ses fils...

un peux com spy++ mais ca le met dans le tray
tu choisi n'importe kel élément d'une fentre, si tu veux tu peux meme cacher desktop :D

a voir si cela peux t'intéresser pour ton prog, mais le but est sensiblement le meme

youpi :)
Messages postés
163
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
3 février 2012

Ok je te remercie je vais jeter un coup d'oeil pour voir c aa l'air interessant

Merci. ++ Nexus

Chaque problème a sa solution. S'il n'y a pas de solution c'est qu'il n'y a pas de problème.