OVH Cloud OVH Cloud

Systray et application console

11 réponses
Avatar
Alain Migeon
Bonjour

J'ai une application type console, que je dois faire fonctionner en=20
service, sous Windows 2000 et VC6.

Cette application a besoin d'une ic=F4ne dans le systray.

Dans cette optique, j'ai fait les op=E9rations suivantes :
- r=E9cup=E9ration d'un HMODULE que j'utilise comme HINSTANCE avec
GetModuleHandle ()
- cr=E9ation d'une fen=EAtre invisible, de mani=E8re =E0 avoir un hWnd
- d=E9finition d'un WM_xxx de mani=E8re =E0 r=E9cup=E9rer les messages
- appel de Shell_NotifyIcon.

L'appel de Shell_NotifyIcon renvoie 1, et l'ic=F4ne apparait bien dans le=
=20
systray.

Le probl=E8me que j'ai est qu'aucune action sur l'ic=F4ne ne renvoie de=20
message.

Le probl=E8me peut-il venir du fait que mon applcation est de type=20
console?

Alain


Extrait du code.

// r=E9cup=E9ration du HINSTANCE.
m_hModule =3D GetModuleHandle (NULL);
m_hInstance =3D m_hModule;

// cr=E9ation de la fen=EAtre, et de HWND.
WNDCLASSEX=09 wc;
int=09=09 ret;

wc.cbSize=09 =3D sizeof (WNDCLASSEX);
wc.style=09 =3D 0;
wc.lpfnWndProc =3D this->WndProc;
wc.cbClsExtra=09 =3D wc.cbWndExtra =3D 0;
wc.hInstance=09 =3D m_hInstance;
wc.hIcon =3D LoadIcon (m_hInstance, MAKEINTRESOURCE (IDI_ICON0));
wc.hIconSm =3D (HICON) LoadImage (m_hInstance,
MAKEINTRESOURCE(IDI_ICON0),
IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON), 0);
wc.hCursor=09 =3D LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground =3D (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName =3D NULL;
wc.lpszClassName =3D className.c_str ();

ret =3D RegisterClassEx (&wc);

if (ret !=3D 0)
=09m_hWnd =3D CreateWindowEx (0,
className.c_str (), className.c_str (),
WS_POPUPWINDOW, CW_USEDEFAULT, 0,
CW_USEDEFAULT, 0, NULL, NULL,
m_hInstance, NULL);

// cr=E9ation de l'ic=F4ne.
#define WM_ICON_NOTIFY WM_USER+10

int=09=09=09=09=09 ret;

nid.cbSize =3D sizeof (NOTIFYICONDATA);
nid.hWnd =3D m_hWnd;
nid.uID =3D uID;
nid.uFlags =3D NIF_MESSAGE | NIF_ICON | NIF_TIP;
nid.uCallbackMessage =3D WM_ICON_NOTIFY;
nid.hIcon =3D icon;
strcpy (nid.szTip, szToolTip.c_str ());

// Set the tray icon
ret =3D Shell_NotifyIcon (NIM_ADD, &nid);

1 réponse

1 2
Avatar
Arnaud Debaene
Alain Migeon wrote:

Le but de l'opération est de permettre à un système constitué de
plusieurs serveurs (4 à 5), de redémarrer automatiquement après un
reboot de la machine.
La solution consiste à transformer ces serveurs en services.


Logique.

Ce que j'aimerais avoir, c'est une icône dans le systray, offrant un
menu avec les icönes de mes services et permettant d'interréagir avec
eux. Je souhaiterais avoir cette icône visible lorsqu'un utilisateur
se loggue.
Pour un de mes serveurs, j'aimerais pouvoir ouvrir une fenêtre de log,
par exemple, en cliquant sur son icône.


Une solution parmi d'autres : le serveur se contente d'écrire dans un
fichier de log et ton appli GUI fait l'équivalent d'un "tail" sur ce fichier
avec FindFirstChangeNotification / FindNextChangeNotification.

Une simple DLL peut-elle suffire? Ou dois je faire un programme
classique communiquant avec mes serveurs?


Un programme en mode utilisateur normal qui communique avec le serveur après
avoir validé le contexte d sécurité (n'autoriser certaines manipulations
qu'aux administrateurs, etc...)

Quel serait alors le meilleur protocole à utiliser? Il m'a été suggéré
IPC et RPC. Je ne connais rien de IPC,


IPC = "Inter Process Communication" - un terme générique pour tous les
mécanismes permettant de communiquer entre processus : RPC, COM, sockets,
memory mapped files, events, ... tout ce que tu peux imaginer.

mais je connais la version ONC
de
RPC (pas la version Microsoft), et je sais commant écrire un protocole
et générer les stubs. ONC RPC est déja utilisé par les serveurs.


Si tu connais RPC, c'est sans doute la solution qui serait la plus rapide à
mettre en oeuvre. Sinon, regardes du côté de COM ou des memory mapped files
et des primitives de synchronisation (mutexs, events, ....) En fait tou
dépend de la complexité des échanges avec le service.

Arnaud
1 2