Checkmail [c][vc.net]

Description

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++;

  • s = 0;
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...

Codes Sources

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.