⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zmsg.c

📁 利用免费网关发送短信
💻 C
📖 第 1 页 / 共 5 页
字号:



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 说明: ZMSG.c
// 更新: 2004-4-20
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 编译预处理
#include <Winsock2.h>
#include <CommCtrl.h>
#include <OleCtl.h>
#include <Shlwapi.h>
#include "ClassXP.h"
#include "Resource.h"
#include "HttpRequest.h"

#pragma warning(disable: 4311)
#pragma warning(disable: 4312)
#pragma comment(lib, "ComCtl32.lib")
#pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib, "WS2_32.lib")
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 宏定义
#define FOR_XIAOLY

#define ZMSG_VERSION		184

#ifdef FOR_XIAOLY
#define STR_VERSION			"1.8.4 For XiaoLy"
#define _StrToDebug(s)		OutputDebugString(s)
#else // FOR_XIAOLY
#define STR_VERSION			"1.8.4"
#define _StrToDebug(s)		
#endif // FOR_XIAOLY

#define ZMSG_ATOM			0x1108
#define WM_ZMSGNOTIFY		WM_USER + ZMSG_ATOM
#define WM_ZMSGUPDATE		WM_USER + ZMSG_ATOM + 1
#define IDC_NOTIFYICON		ZMSG_ATOM

#define WINDOW_WIDTH		368
#define WINDOW_HEIGHT		275
#define BUTTON_PREFIX		18
#define BUTTON_INTERVAL		10
#define BUTTON_TOP			14
#define BUTTON_HEIGHT		23
#define FRAME_HEIGHT		45
#define FRAME_XPREFIX		10
#define FRAME_YPREFIX		72
#define EDIT_XPREFIX		30
#define EDIT_YPREFIX		120
#define COMBO_HEIGHT		300

#define GW_ZMCC				0
#define GW_NBUC				1
#define GW_ZMSHOP			2
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数声明
void WINAPI OnSaveSetting();
void WINAPI OnInitDialog();
void WINAPI OnSize(WPARAM wParam, LPARAM lParam);
void WINAPI OnCommand(WPARAM wParam, LPARAM lParam);
void WINAPI OnZmsgUpdate(HWND hWnd, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK SettingDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK GetRandomDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK AboutDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK MessageEditProc(HWND hEdit, UINT uMsg, WPARAM wParam, LPARAM lParam);

void WINAPI CheckUpdate(HWND hWnd);
int WINAPI ZmccLogin();
int WINAPI ZmccGetRandom();
void WINAPI SendThread();
void WINAPI GetAccount();
void WINAPI SetAccount();
int WINAPI ZmccSendMessage(LPCSTR pszMessage, int iLen);

int WINAPI URLEncode(LPCSTR pszSrc, LPSTR pszDest);
char WINAPI GetRandom(LPBYTE pbBitmap, LPBYTE pbEnd);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 全局变量
HWND g_hWnd;
HANDLE g_hLogin;
HANDLE g_hSend;
HANDLE g_hCheckUpdate;
UWORD g_wProxyPort;
UINT g_uGateWay = GW_ZMCC;
BOOL g_bRemindPassword;
BOOL g_bClassXP;
char g_szRandom[64];
char g_szUserID[16];
char g_szUserMobile[16];
char g_szSession[256];
char g_szUserName[21];
char g_szPassword[41];
char g_szProxyAddress[50];
char g_szIniFileName[256];
BOOL g_bSign;
BOOL g_bFillChar;
WCHAR g_wszSign[50];
WCHAR g_wszFillChar[2];
char g_szMobile[50];

char g_szZmccHost[32] = "www.zj.chinamobile.com";

const char STR_APPNAME[]		= "ZMSG";
const char STR_NBUC[]			= "NBUC";
const char STR_ZMSHOP[]			= "ZMSHOP";
const char STR_CORPNAME[]		= "Yonsm.com";
const char STR_EMAIL[]			= "mailto:Yonsm@163.com";
const char STR_HOMEPAGE[]		= "http://Yonsm.8800.org";
const char STR_VIEWHELP[]		= "查看帮助";
const char STR_CHECKUPDATE[]	= "检查升级";
const char STR_APPINFO[]		= "祝福我要祝福的人,愿好运永相随……";
const char STR_VERINFO[]		= "版本: " STR_VERSION;
const char STR_BUILDINFO[]		= "编译: " __DATE__ " " __TIME__;
const char STR_COPYRIGHT[]		= "Copyleft(L) 2003-2004,Yonsm。不保留任何权利。";

typedef enum tagZMSG_ERROR
{
	ZERROR_SUCCESS,
	ZERROR_ARGUMENT,
	ZERROR_SOCKET,
	ZERROR_RESOLVEDNS,
	ZERROR_CONNECT,
	ZERROR_SEND,
	ZERROR_RECEIVE,
	ZERROR_CANCELED,
	ZERROR_LOGIN,
	ZERROR_SESSION,
	ZERROR_MOBILEPHONE,
	ZERROR_UNICOM,
	ZERROR_SENDMESSAGE,
	ZERROR_NOACCOUNT,
	ZERROR_NOCONTENT,
	ZERROR_CHECKRANDOM,
	ZERROR_ALLOCMEMORY,
	ZERROR_FILESIZE,
	ZERROR_CREATEFILE,
	ZERROR_WRITEFILE,
}
ZMSG_ERROR;

LPCSTR c_szErrorMsg[] =
{
	"执行成功。",
		"参数错误。",
		"创建 Socket 失败。",
		"解析域名失败。",
		"连接失败。",
		"发送数据失败。",
		"接收数据失败。",
		"用户取消了正在执行的操作。",
		"登录失败,请检查账号设置。",
		"会话失败,需要重新登录。",
		"发送短信失败,请检查手机号码。",
		"暂时不能给联通的用户发送短信。",
		"发送短信失败,发生未知错误。",
		"没有用户名或密码。",
		"没有短信内容。",
		"无法获取随机校验值。",
		"无法分配内存。",
		"文件大小错误。",
		"无法创建文件。",
		"无法写入文件。",
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 程序入口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
	WSADATA WSAData;

	// 不允许运行多个实例
	CreateMutex(NULL, FALSE, STR_APPNAME);
	if (GetLastError() == ERROR_ALREADY_EXISTS)
	{
		// 查找窗口,调至最前端
		g_hWnd = FindWindow(NULL, STR_APPNAME);
		if (g_hWnd)
		{
			SendMessage(g_hWnd, WM_ZMSGNOTIFY, ZMSG_ATOM, WM_LBUTTONUP);
			return 1;
		}
	}

	// 初始化 Windows Socket
	if (WSAStartup(MAKEWORD(1, 1), &WSAData))
	{
		MessageBox(NULL, "初始化 Windows Socket 失败!", STR_APPNAME, MB_ICONSTOP);
		return 2;
	}

	CoInitialize(NULL);

	// 显示主对话框
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC) MainDlgProc);

	CoUninitialize();

	// 取消 ClassXP 风格并清除 Windows Socket
	if (g_bClassXP)
		ClassXP(NULL, FALSE);

	WSACleanup();
	return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 主窗口回调函数
INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	RECT rtRect;
	char szTemp[256];
	NOTIFYICONDATA Nid;

	switch (uMsg)
	{
		// 初始化
	case WM_INITDIALOG:
		g_hWnd = hDlg;
		OnInitDialog();
		break;

		//拖动窗口的时候,限制拖动尺寸不小于特定值
	case WM_SIZING:
#define pRect ((LPRECT) lParam)
		if((pRect->right - pRect->left) < WINDOW_WIDTH)
			pRect->right = pRect->left  + WINDOW_WIDTH;
		if((pRect->bottom - pRect->top) < WINDOW_HEIGHT)
			pRect->bottom = pRect->top  +  WINDOW_HEIGHT;
#undef pRect
		break;

		// 最小化
	case WM_SIZE:
		OnSize(wParam, lParam);
		break;

		// 系统托盘图标消息
	case WM_ZMSGNOTIFY:
		if ((lParam == WM_LBUTTONUP) || (lParam == WM_RBUTTONUP))
		{
			// 删除系统托盘图标,恢复主窗口
			ZeroMemory(&Nid, sizeof(NOTIFYICONDATA));
			Nid.cbSize = sizeof(NOTIFYICONDATA);
			Nid.hWnd = g_hWnd;
			Nid.uID = IDC_NOTIFYICON;
			Shell_NotifyIcon(NIM_DELETE, &Nid);
			ShowWindow(g_hWnd, SW_RESTORE);
			SetForegroundWindow(g_hWnd);
		}
		break;

	case UM_HRNOTIFY:
		switch (wParam)
		{
		case HRNOTIFY_RESOLVEDNS:
			wsprintf(szTemp, "正在解析域名 %s...", lParam);
			break;

		case HRNOTIFY_CONNECT:
			wsprintf(szTemp, "正在连接到 %s...", lParam);
			break;

		case HRNOTIFY_SEND:
			wsprintf(szTemp, "正在发送 %u 字节数据...", lParam);
			break;

		case HRNOTIFY_DISCONNECT:
			wsprintf(szTemp, c_szErrorMsg[lParam]);
			break;

		default:
			wsprintf(szTemp, "已接收 %u 字节 (共 %u 字节),完成 %u%%...", lParam, wParam, MulDiv((int)lParam, 100, (int)wParam));
		}
		//SendDlgItemMessage(g_hWnd, IDC_STATUS, SB_SETTEXT, 0, (LPARAM) szTemp);
		_StrToDebug(szTemp);
		break;

		// 鼠标中键点击地址框
	case WM_PARENTNOTIFY:
		if (LOWORD(wParam) == WM_MBUTTONDOWN)
		{
			GetWindowRect(GetDlgItem(g_hWnd, IDC_COMBO_MOBILEPHONE), &rtRect);
			MapWindowPoints(NULL, g_hWnd, (LPPOINT) &rtRect, 2);
			if ((LOWORD(lParam) > rtRect.left) && (LOWORD(lParam) < rtRect.right) &&
				(HIWORD(lParam) > rtRect.top) && (HIWORD(lParam) < rtRect.bottom))
			{
				int i;
				int iCount;

				i = (int) SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE, CB_GETCURSEL, 0, 0);

				if (i >= 0)
				{
					SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE, CB_DELETESTRING, i, 0);
					iCount = (int) SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE, CB_GETCOUNT, 0, 0);
					if (i >= iCount)
					{
						i = iCount - 1;
					}
					SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE, CB_SETCURSEL, i, 0);
				}
				//ShellExecute(NULL, NULL, g_szIniFileName, NULL, NULL, SW_SHOW);
			}
		}
		break;

		// 热键消息
	case WM_HOTKEY:
		if (wParam == ZMSG_ATOM)
		{
			if (IsWindowVisible(g_hWnd))
				CloseWindow(g_hWnd);
			else
				SendMessage(g_hWnd, WM_ZMSGNOTIFY, ZMSG_ATOM, WM_LBUTTONUP);
		}
		break;

		// 命令处理
	case WM_COMMAND:
		OnCommand(wParam, lParam);
		break;

	// 程序更新
	case WM_ZMSGUPDATE:
		OnZmsgUpdate(hDlg, wParam, lParam);
		break;

		// 关闭
	case WM_CLOSE:
		OnCommand(MAKEWPARAM(IDC_BUTTON_EXIT, 0), lParam);
		break;

	default:
		return FALSE;
	}
	return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 设置窗口回调函数
INT_PTR CALLBACK SettingDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	int i;
	HKEY hKey;
	DWORD dwType;	
	char szTemp[256];

	switch (uMsg)
	{
		// 初始化
	case WM_INITDIALOG:
		if (g_bRemindPassword)
		{
			SendDlgItemMessage(hDlg, IDC_EHECK_REMINDPASSWORD, BM_SETCHECK, BST_CHECKED, 0);
		}

		if (g_bSign)
		{
			SendDlgItemMessage(hDlg, IDC_CHECK_SIGN, BM_SETCHECK, BST_CHECKED, 0);
			EnableWindow(GetDlgItem(hDlg, IDC_EDIT_SIGN), g_bSign);
		}

		if (g_uGateWay == GW_NBUC)
		{			
			EnableWindow(GetDlgItem(hDlg, IDC_CHECK_FILL), FALSE);
			EnableWindow(GetDlgItem(hDlg, IDC_EDIT_FILL), FALSE);
			SetWindowText(hDlg, "设置 - 宁波联通版");
			SetWindowLong(GetDlgItem(hDlg, IDC_EDIT_USERNAME), GWL_STYLE, 
				GetWindowLong(GetDlgItem(hDlg, IDC_EDIT_USERNAME), GWL_STYLE) | ES_NUMBER);
		}
		else if (g_uGateWay == GW_ZMSHOP)
		{
			//EnableWindow(GetDlgItem(hDlg, IDC_BUTTON_REGISTER), FALSE);
			//EnableWindow(GetDlgItem(hDlg, IDC_EDIT_PASSWORD), FALSE);
			//EnableWindow(GetDlgItem(hDlg, IDC_EHECK_REMINDPASSWORD), FALSE);
			EnableWindow(GetDlgItem(hDlg, IDC_CHECK_FILL), FALSE);
			EnableWindow(GetDlgItem(hDlg, IDC_EDIT_FILL), FALSE);
			SetWindowText(hDlg, "设置 - 移动商城版");
			SetWindowLong(GetDlgItem(hDlg, IDC_EDIT_USERNAME), GWL_STYLE, 
				GetWindowLong(GetDlgItem(hDlg, IDC_EDIT_USERNAME), GWL_STYLE) | ES_NUMBER);
		}
		else
		{
			if (g_bFillChar)
			{
				SendDlgItemMessage(hDlg, IDC_CHECK_FILL, BM_SETCHECK, BST_CHECKED, 0);
				EnableWindow(GetDlgItem(hDlg, IDC_EDIT_FILL), g_bFillChar);
			}
			SetWindowText(hDlg, "设置 - 浙江移动版");
		}

		if (g_szProxyAddress[0])
		{
			SendDlgItemMessage(hDlg, IDC_EHECK_USEPROXY, BM_SETCHECK, BST_CHECKED, 0);
			EnableWindow(GetDlgItem(hDlg, IDC_EDIT_PROXYADDRESS) ,TRUE);
			EnableWindow(GetDlgItem(hDlg, IDC_EDIT_PROXYPORT) ,TRUE);
			SetDlgItemText(hDlg, IDC_EDIT_PROXYADDRESS, g_szProxyAddress);
			SetDlgItemInt(hDlg, IDC_EDIT_PROXYPORT, g_wProxyPort, FALSE);
		}
		else
		{
			// 如果没有指定代理,则读取 Internet Explorer 的代理设置
			if (RegOpenKey(HKEY_CURRENT_USER,
				"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
				&hKey) == ERROR_SUCCESS)
			{
				i = sizeof(szTemp);
				dwType = REG_SZ;
				if (RegQueryValueEx(hKey, "ProxyServer", NULL, &dwType, szTemp, &i) == ERROR_SUCCESS)
				{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -