Bonjour,
Voila, c'est ma premiere application avec les API windows, je vous explik son but :
-Permet de verifier la reception de nouveaux e-mails au lancement du prog, puis toutes les 5minutes;
-Place une icone dans le systray en fonction du resultat de la verification : si un ou plusieurs messages sont recus, une icone specifik apparait ds le systray, de mm sil n'y a pas de nouveaux messages, une icone differente apparait;
-Presence d'un lien pour me contacter
-Sauvegarde des parametres de connexion ds un fichier (a venir simple cryptage du mot de passe)
Et puis voila, vous verrez par vous mm si j'oublie des chose ;)
Source / Exemple :
#include <stdio.h>
#include <windows.h>
#include <winsock.h>
#include "resource.h"
#define IsDigit(c) (c <= '9' && c >= '0')
#define WM_SYSTRAY (WM_USER + 2)
#pragma comment(lib, "ws2_32.lib")
LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK OptionDlgProc(HWND, UINT, WPARAM, LPARAM);
int iCheckMail(void);
int iInitWinsock(void);
int iShellCmd(SOCKET);
int ctoi(char);
int iSaveParam(void);
int iRecupInfoFile(void);
int iPutSystray(HWND);
int iLeaveSystray();
int iModifySystray(int, char *);
HINSTANCE hInstDlg;
NOTIFYICONDATA nidIcon;
char sPop[40];
char sCmd[2][40];
char sMyAddress[] = "mailto:Alhexman@tiscali.fr?subject=AboutMailProg";
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
hInstDlg = hInstance;
nidIcon.cbSize = sizeof(NOTIFYICONDATA);
nidIcon.uID = IDI_NO;
nidIcon.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
nidIcon.uCallbackMessage = WM_SYSTRAY;
strcpy(nidIcon.szTip, "Verification des mails en cours...");
DialogBoxParam(hInstance, (LPCTSTR)IDD_DIALOG1, 0, (DLGPROC)DlgProc, 0);
return TRUE;
}
LRESULT CALLBACK DlgProc(HWND hwndDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
static HBRUSH hbrMail;
char sMsg[40];
int iNbre_Msg = 0;
int iFlagFile = 1;
int iResult = 0;
switch (uMessage) {
case WM_INITDIALOG:
hbrMail = CreateSolidBrush(GetSysColor(COLOR_3DFACE));
SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(hInstDlg, MAKEINTRESOURCE(IDI_NO)));
iPutSystray(hwndDlg);
if (!(iResult = iRecupInfoFile())) {
iFlagFile = 0;
}
SetTimer(hwndDlg, 1, 300000, NULL); //Verification ttes les 5min...
SetClassLong(GetDlgItem(hwndDlg, IDC_DEV), GCL_HCURSOR, (long)LoadCursor(hInstDlg, (LPCTSTR)IDCUR_HAND));
SendMessage(hwndDlg, WM_COMMAND, IDC_CHECK, 0);
return TRUE;
case WM_CTLCOLORSTATIC: //Cette fonction ne marche po, si kelkun sait pkoi...merci d'avance !
if (GetWindowLong((HWND)lParam, GWL_ID) == IDC_DEV) {
SetBkMode((HDC)wParam, TRANSPARENT);
SetTextColor((HDC)wParam, RGB(50, 50, 255));
return (BOOL)hbrMail;
}
return FALSE;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDC_CLOSE:
iLeaveSystray();
DeleteObject(hbrMail);
EndDialog(hwndDlg, 0);
return FALSE;
case IDC_REDUCE:
//SendMessage(hwndDlg, WM_SYSCOMMAND, SC_MINIMIZE, 0);
ShowWindow(hwndDlg, SW_HIDE);
return FALSE;
case IDC_CHECK:
SetDlgItemText(hwndDlg, IDC_MAIL, "Vérification des mails...\r\n");
if ((iNbre_Msg = iCheckMail()) != -1) {
if (iNbre_Msg >= 1) {
sprintf(sMsg, "Vous avez %d nouveau(x) message(s).\r\n", iNbre_Msg);
} else if (!iNbre_Msg) {
strcpy(sMsg, "Vous n'avez pas de nouveaux messages.\r\n");
}
SetDlgItemText(hwndDlg, IDC_MAIL, sMsg);
iModifySystray(iNbre_Msg, sMsg);
} else {
SetDlgItemText(hwndDlg, IDC_MAIL, "Erreur lors de la connexion au serveur...\r\n");
}
return FALSE;
case IDC_OPTION:
if (!iFlagFile) {
DialogBoxParam(hInstDlg, (LPCTSTR)IDD_DIALOG2, hwndDlg, (DLGPROC)OptionDlgProc, 0);
} else {
if (MessageBox(NULL, "Des paramètres de connexion ont déjà été entrés, voulez-vous les supprimer ?", "Suppression paramètres de connexion", MB_YESNO) == IDYES) {
DialogBox(hInstDlg, (LPCTSTR)IDD_DIALOG2, hwndDlg, (DLGPROC)OptionDlgProc);
}
}
return FALSE;
case IDC_DEV:
ShellExecute(0, "open", sMyAddress, 0, 0, SW_SHOWNORMAL);
return FALSE;
default:
return FALSE;
}
case WM_SYSTRAY:
switch (lParam) {
case WM_LBUTTONDBLCLK:
if (!IsWindowVisible(hwndDlg)) {
ShowWindow(hwndDlg, SW_SHOW);
} else if (IsIconic(hwndDlg)) {
ShowWindow(hwndDlg, SW_RESTORE);
}
SetForegroundWindow(hwndDlg);
return FALSE;
default:
return FALSE;
}
case WM_TIMER:
SendMessage(hwndDlg, WM_COMMAND, IDC_CHECK, 0);
default:
return FALSE;
}
}
LRESULT CALLBACK OptionDlgProc(HWND hwndDlgOpt, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
char sBuffer[40];
switch (uMessage) {
case WM_COMMAND:
switch (wParam) {
case IDOK:
//Recupere le serveur pop
GetDlgItemText(hwndDlgOpt, IDE_POP, sPop, sizeof sPop);
//Recupere le nom d'utilisateur
GetDlgItemText(hwndDlgOpt, IDE_USER, sBuffer, sizeof sBuffer);
sprintf(sCmd[0], "USER %s\r\n", sBuffer);
//Recupere le mot de passe
GetDlgItemText(hwndDlgOpt, IDE_PASS, sBuffer, sizeof sBuffer);
sprintf(sCmd[1], "PASS %s\r\n", sBuffer);
iSaveParam();
EndDialog(hwndDlgOpt, 0);
return FALSE;
case IDCANCEL:
EndDialog(hwndDlgOpt, wParam);
return FALSE;
default:
return FALSE;
}
default:
return FALSE;
}
return TRUE;
}
int iInitWinsock()
{
WORD wVersionRequested;
WSADATA wsaData;
int iReturn = 0;
wVersionRequested = MAKEWORD(2, 0);
if (iReturn = WSAStartup(wVersionRequested, &wsaData)) {
return FALSE;
}
return TRUE;
}
int iCheckMail()
{
struct hostent *hstServIP;
struct sockaddr_in sinAddr;
SOCKET sckActiv;
int iResult = 0;
int iTentConnect = 0;
iInitWinsock();
if ((sckActiv = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
return -1;
}
if (!(hstServIP = gethostbyname(sPop))) {
return -1;
}
sinAddr.sin_addr.s_addr = *((u_long *)hstServIP->h_addr_list[0]);
sinAddr.sin_port = htons(110);
sinAddr.sin_family = AF_INET;
while (iResult = connect(sckActiv, (const struct sockaddr *)&sinAddr, sizeof(sinAddr)) && iTentConnect < 3) {
iTentConnect++;
}
if (iTentConnect == 3) {
return -1;
}
iResult = iShellCmd(sckActiv);
WSACleanup();
closesocket(sckActiv);
return iResult;
}
int iShellCmd(SOCKET sckCmd)
{
char sReturn[] = "+OK";
char sBuffer[128];
char *s = (sBuffer + 4);
int iResult = 0;
int i = 0;
iResult = recv(sckCmd, sBuffer, sizeof sBuffer, 0);
sBuffer[iResult] = 0;
for ( ; i < 2; ++i) {
memset(sBuffer, 0, sizeof sBuffer);
send(sckCmd, sCmd[i], strlen(sCmd[i]), 0);
iResult = recv(sckCmd, sBuffer, sizeof sBuffer, 0);
sBuffer[iResult] = 0;
if (strncmp(sBuffer, sReturn, strlen(sReturn))) {
return -1;
}
}
while (IsDigit(*s)) s++;
return atoi((char *)(sBuffer + 4));
}
int iSaveParam()
{
HANDLE hFile;
char sBufferToWrite[128];
DWORD dwWritten = 0;
hFile = CreateFile("pp.opt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0);
sprintf(sBufferToWrite, "%s\r\n%s%s", sPop, sCmd[0], sCmd[1]);
WriteFile(hFile, sBufferToWrite, strlen(sBufferToWrite), &dwWritten, 0);
if (dwWritten != strlen(sBufferToWrite)) {
MessageBox(NULL, "Erreur lors de l'écriture du fichier...", "Erreur", MB_OK);
return FALSE;
}
CloseHandle(hFile);
return TRUE;
}
int iRecupInfoFile()
{
DWORD dwRead;
HANDLE hFile;
char *sBuffer;
int iReturn = 1;
int i = 0;
//Teste pour verifier l'existence d'un fichier...
/*if (GetFileAttrbutesW("pp.opt") & 0x80000000) {
return FALSE;
}*/
sBuffer = (char *)HeapAlloc(GetProcessHeap(), 0, 4096);
if (!(hFile = CreateFile("pp.opt", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0))) {
iReturn = 0;
goto lFin;
}
ReadFile(hFile, sBuffer, 4095, &dwRead, 0);
if (!dwRead) {
iReturn = 0;
goto lFin;
}
strcpy(sPop, strtok(sBuffer, "\r\n"));
for ( ; i < 2; ++i) {
strcpy(sCmd[i], strtok(NULL, "\r\n"));
strcat(sCmd[i], "\r\n");
}
lFin:
CloseHandle(hFile);
HeapFree(GetProcessHeap(), 0, sBuffer);
return iReturn;
}
int iPutSystray(HWND hwndDlg)
{
int iResult = 0;
nidIcon.hWnd = hwndDlg;
nidIcon.hIcon = LoadIcon((HINSTANCE)GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_NO));
strcpy(nidIcon.szTip, "Recherche de nouveaux messages...");
if (iResult = Shell_NotifyIcon(NIM_ADD, &nidIcon)) {
return TRUE;
}
return FALSE;
}
int iLeaveSystray()
{
int iResult = 0;
if (iResult = Shell_NotifyIcon(NIM_DELETE, &nidIcon)) {
return TRUE;
}
return FALSE;
}
int iModifySystray(int iParam, char *sTip)
{
int iResult = 0;
//Pesence de mails
if (iParam) {
nidIcon.hIcon = LoadIcon(hInstDlg, (LPCTSTR)IDI_YES);
} else { //Pas presence de mails
nidIcon.hIcon = LoadIcon(hInstDlg, (LPCTSTR)IDI_NO);
}
strcpy(nidIcon.szTip, sTip);
if (iResult = Shell_NotifyIcon(NIM_MODIFY, &nidIcon)) {
return TRUE;
}
return FALSE;
}
__inline int ctoi(char c)
{
if (c >= '0' && c <= '9') {
return (c - 48);
}
return FALSE;
}
Conclusion :
Il n'y a pour le moment pas de commentaires, je ferai un post commenté ce soir (jprefere le soir, jsui trankil), donc ne vous inkietez pas si vous ne comprenez pas tt, vous verrez ce soir !
J'attends des remark sur tt ski concerne l'API windows...Et puis eventuellement la correction de certains bugs...le code est compilé avec Visual Studio .net 2003.
Voila
++ Alhexman
PS : merci a BruNews pour ces sources (dont jme suis inspiré) et surtout son aide sur le forum...
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.