📄 zmsg.c
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 说明: 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 + -