📄 zmsg.c
字号:
char *p = strstr(szTemp, "http=");
if (p)
{
p += 5;
}
else
{
p = szTemp;
}
// 分割地址和端口信息
for (i = lstrlen(p); i > 0; i--)
{
if (p[i] == ':')
{
SetDlgItemInt(hDlg, IDC_EDIT_PROXYPORT, atoi(&p[i + 1]), FALSE);
p[i] = '\0';
SetDlgItemText(hDlg, IDC_EDIT_PROXYADDRESS, p);
}
}
}
RegCloseKey(hKey);
}
}
if (g_bClassXP)
SendDlgItemMessage(hDlg, IDC_CHECK_CLASSXP, BM_SETCHECK, BST_CHECKED, 0);
WideCharToMultiByte(CP_ACP, 0, g_wszSign, -1, szTemp, sizeof(szTemp), NULL, NULL);
SetDlgItemText(hDlg, IDC_EDIT_SIGN, szTemp);
WideCharToMultiByte(CP_ACP, 0, g_wszFillChar, -1, szTemp, sizeof(szTemp), NULL, NULL);
SetDlgItemText(hDlg, IDC_EDIT_FILL, szTemp);
SetDlgItemText(hDlg, IDC_EDIT_USERNAME, g_szUserName);
SetDlgItemText(hDlg, IDC_EDIT_PASSWORD, g_szPassword);
SendDlgItemMessage(hDlg, IDC_EDIT_FILL, EM_LIMITTEXT, 1, 0);
break;
case WM_LBUTTONUP:
if (wParam & MK_CONTROL)
{
if ((LOWORD(lParam) > 137) && (LOWORD(lParam) <148) && (HIWORD(lParam) > 287) && (HIWORD(lParam) < 304))
{
MessageBox(g_hWnd, "好人一生平安!", STR_APPNAME, MB_ICONINFORMATION);
}
}
break;
// 命令处理
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_EHECK_USEPROXY:
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_PROXYADDRESS),
(BOOL) SendDlgItemMessage(hDlg, IDC_EHECK_USEPROXY, BM_GETCHECK, 0, 0));
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_PROXYPORT),
(BOOL) SendDlgItemMessage(hDlg, IDC_EHECK_USEPROXY, BM_GETCHECK, 0, 0));
break;
case IDC_CHECK_SIGN:
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_SIGN),
(BOOL) SendDlgItemMessage(hDlg, IDC_CHECK_SIGN, BM_GETCHECK, 0, 0));
break;
case IDC_CHECK_FILL:
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_FILL),
(BOOL) SendDlgItemMessage(hDlg, IDC_CHECK_FILL, BM_GETCHECK, 0, 0));
break;
case IDC_CHECK_CLASSXP:
g_bClassXP = (BOOL) SendDlgItemMessage(hDlg, IDC_CHECK_CLASSXP, BM_GETCHECK, 0, 0);
ClassXP(NULL, g_bClassXP);
ShowScrollBar(GetDlgItem(g_hWnd, IDC_EDIT_MESSAGE), SB_BOTH, !g_bClassXP);
break;
case IDC_BUTTON_REGISTER:
ShellExecute(NULL, NULL,
(g_uGateWay == GW_NBUC) ? "http://211.91.2.221/sms165/password/NewUser.asp" :
((g_uGateWay == GW_ZMSHOP) ? "http://www.zmshop.com/user/reg.asp" :
"http://www.zj.chinamobile.com/register.jsp?zmccCatalog=0805"),
NULL, NULL, SW_SHOW);
break;
case IDOK:
g_bRemindPassword = (BOOL) SendDlgItemMessage(hDlg, IDC_EHECK_REMINDPASSWORD, BM_GETCHECK, 0, 0);
GetDlgItemText(hDlg, IDC_EDIT_USERNAME, g_szUserName, sizeof(g_szUserName));
GetDlgItemText(hDlg, IDC_EDIT_PASSWORD, g_szPassword, sizeof(g_szPassword));
g_wProxyPort = GetDlgItemInt(hDlg, IDC_EDIT_PROXYPORT, NULL, FALSE);
if (SendDlgItemMessage(hDlg, IDC_EHECK_USEPROXY, BM_GETCHECK, 0, 0))
GetDlgItemText(hDlg, IDC_EDIT_PROXYADDRESS, g_szProxyAddress, sizeof(g_szProxyAddress));
else
g_szProxyAddress[0] = 0;
if (g_uGateWay == GW_ZMSHOP)
{
}
else if (g_uGateWay != GW_NBUC)
{
g_bFillChar = (BOOL) SendDlgItemMessage(hDlg, IDC_CHECK_FILL, BM_GETCHECK, 0, 0);
GetDlgItemText(hDlg, IDC_EDIT_FILL, szTemp, sizeof(szTemp));
MultiByteToWideChar(CP_ACP, 0, szTemp, -1, g_wszFillChar, sizeof(g_wszFillChar));
}
g_bSign = (BOOL) SendDlgItemMessage(hDlg, IDC_CHECK_SIGN, BM_GETCHECK, 0, 0);
GetDlgItemText(hDlg, IDC_EDIT_SIGN, szTemp, sizeof(szTemp));
MultiByteToWideChar(CP_ACP, 0, szTemp, -1, g_wszSign, sizeof(g_wszSign));
SetAccount();
EndDialog(hDlg, IDOK);
break;
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
}
break;
// 关闭
case WM_CLOSE:
EndDialog(hDlg, 0);
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 设置窗口回调函数
INT_PTR CALLBACK GetRandomDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HBITMAP hBitmap;
char szTempPath[MAX_PATH];
char szFileName[MAX_PATH];
WCHAR wszFileName[MAX_PATH];
static IPicture *s_pPicture = NULL;
switch (uMsg)
{
// 初始化
case WM_INITDIALOG:
SendDlgItemMessage(hDlg, IDC_EDIT_RANDOM, EM_LIMITTEXT, 4, 0);
GetTempPath(MAX_PATH, szTempPath);
wsprintf(szFileName, "%sZMSGRandom.jpg", szTempPath);
MultiByteToWideChar(CP_ACP, 0, szFileName, -1, wszFileName, MAX_PATH);
OleLoadPicturePath(wszFileName, NULL, 0, 0, &IID_IPicture, (PVOID *) &s_pPicture);
if (s_pPicture)
{
s_pPicture->lpVtbl->get_Handle(s_pPicture, (OLE_HANDLE *) &hBitmap);
SendDlgItemMessage(hDlg, IDC_STATIC_RANDOM, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hBitmap);
}
break;
// 命令处理
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_EDIT_RANDOM:
if (HIWORD(wParam) == EN_CHANGE)
{
EnableWindow(GetDlgItem(hDlg, IDOK),
SendDlgItemMessage(hDlg, IDC_EDIT_RANDOM, WM_GETTEXTLENGTH, 0, 0) == 4);
}
break;
case IDOK:
GetDlgItemText(hDlg, IDC_EDIT_RANDOM, g_szRandom, sizeof(g_szRandom));
if (s_pPicture)
{
s_pPicture->lpVtbl->Release(s_pPicture);
}
EndDialog(hDlg, IDOK);
break;
case IDCANCEL:
if (s_pPicture)
{
s_pPicture->lpVtbl->Release(s_pPicture);
}
EndDialog(hDlg, IDCANCEL);
break;
}
break;
// 关闭
case WM_CLOSE:
SendMessage(hDlg, WM_COMMAND, (SendDlgItemMessage(hDlg, IDC_EDIT_RANDOM, WM_GETTEXTLENGTH, 0, 0) == 4) ? IDOK : IDCANCEL, 0);
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 短信编辑窗口子类化回调函数
LRESULT CALLBACK MessageEditProc(HWND hEdit, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int i;
BYTE szTemp[256];
LRESULT lResult;
// 调用原来的窗口函数
lResult = CallWindowProc(
(WNDPROC) GetWindowLong(hEdit, GWL_USERDATA), hEdit, uMsg, wParam, lParam);
switch (uMsg)
{
case WM_KEYDOWN:
// 判断是否是 Ctrl + Enter
if ((wParam == VK_RETURN) && (GetKeyState(VK_CONTROL) & 0x8000))
{
SendMessage(g_hWnd, WM_COMMAND, IDC_BUTTON_SEND, 0);
break;
}
case WM_LBUTTONDOWN:
case WM_KEYUP:
case WM_CUT:
case WM_PASTE:
// 显示当前行字数信息
i = (int) SendDlgItemMessage(g_hWnd, IDC_EDIT_MESSAGE, EM_LINEFROMCHAR, -1, 0);
wsprintf(szTemp, "第 %d 条",i + 1);
SendDlgItemMessage(g_hWnd, IDC_STATUS, SB_SETTEXT, 2, (LPARAM) szTemp);
*((WORD *) szTemp) = 255;
i = (int) SendDlgItemMessage(g_hWnd, IDC_EDIT_MESSAGE, EM_GETLINE, i, (LPARAM) szTemp);
szTemp[min(i, 255)] = '\0';
i = MultiByteToWideChar(CP_ACP, 0, szTemp, -1, NULL, 0) - 1;
wsprintf(szTemp, "%d 字%c", i, (i > 70) ? '!' : ' ');
SendDlgItemMessage(g_hWnd, IDC_STATUS, SB_SETTEXT, 3, (LPARAM) szTemp);
}
return lResult;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 关于对话框回调函数
INT_PTR CALLBACK AboutDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int i;
HDC hDC;
HPEN hPen;
HPEN hpenOld;
HBRUSH hBrush;
HFONT hfontOld;
HICON hIcon;
RECT rtRect;
LOGFONT lfFont;
char *p;
char szTemp[1024];
PAINTSTRUCT psPaint;
static DWORD s_dwVersion;
// 静态局部变量,记录上一次鼠标所在的区域类型
// 0 表示在非 URL 区域
// 1 表示在 Email 文字区域
// 2 表示在 HomePage 区域
// 3 表示在 ViewHelp 区域
// 4 表示在 CheckUpdate 区域
static int s_iURLType = 0;
static BOOL s_bNeedLogIn = FALSE;
switch (uMsg)
{
case WM_INITDIALOG:
// 判断是否是 Windows 98 及其以上版本系统
s_dwVersion = GetVersion();
s_bNeedLogIn = FALSE;
if (((BYTE) s_dwVersion > 4) || (((BYTE) s_dwVersion == 4) && (HIBYTE(LOWORD(s_dwVersion)) > 0)))
s_dwVersion = TRUE;
else
s_dwVersion = FALSE;
SetClassLong(hWnd, GCL_HCURSOR, 0);
SetCursor(LoadCursor(NULL, IDC_ARROW));
break;
case WM_CTLCOLORDLG:
case WM_CTLCOLORSTATIC:
return (int) GetStockObject(WHITE_BRUSH);
case WM_COMMAND:
if(LOWORD(wParam) != IDCANCEL && LOWORD(wParam) != IDOK)
break;
case WM_RBUTTONUP:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
case WM_LBUTTONUP:
// 左键弹起,判断是否执行 URL 点击处理
if( LOWORD(lParam) >= 60 && LOWORD(lParam) < 180 && HIWORD(lParam) >= 184 && HIWORD(lParam) < 198)
{
ShellExecute(NULL, NULL, STR_EMAIL, NULL, NULL, SW_SHOW);
}
else if ( LOWORD(lParam) >= 60 && LOWORD(lParam) < 185 && HIWORD(lParam) > 199 && HIWORD(lParam) < 213)
{
ShellExecute(NULL, NULL, STR_HOMEPAGE, NULL, NULL, SW_SHOW);
}
else if( LOWORD(lParam) >= 340 && LOWORD(lParam) < 388 && HIWORD(lParam) > 235 && HIWORD(lParam) < 249)
{
wsprintf(szTemp,
"ZMSG 版本 %d.%d.%d%s\n\n"
" 浙江移动短信发送工具。CopyLeft(L) 2003-2004 Yonsm,不保留版权。\n\n"
" 如果是浙江移动通信有限责任公司的手机用户,并且在浙江移动网站 "
"(http://www.zmcc.com.cn) 上注册账号后,就可以使用 ZMSG "
"发送短信。目前发送短信是完全是免费的,按照浙江移动的说明,暂时只"
"能给浙江省内的移动用户发送短信。\n\n"
" ZMSG 使用非常简单,先设置好账号和密码,输入接收方的"
"手机号码和短信内容,点击“发送”按钮即可。短信编辑框内除空行外的"
"每行文字都将作为一条短信发送,每行不能超过 70 字,超过部分将自动"
"丢弃。在短信编辑框内按 Ctrl+Enter 可以发送或取消发送短信;使用热"
"键 Win+Z 可以显示或隐藏 ZMSG。\n\n"
" 手机号码的格式可以是单独的手机号码,也可以是“姓名(手机号码)”"
"的格式 (如“Yonsm(1395716****)”)。如果要删除已记录的手机号码,可"
"用鼠标中键点击手机号码下拉框。",
ZMSG_VERSION / 100,
(ZMSG_VERSION % 100) / 10,
ZMSG_VERSION % 10,
(ZMSG_VERSION % 2) ? " (测试版)" : NULL,
g_szIniFileName);
MessageBox(hWnd, szTemp, STR_APPNAME, MB_ICONINFORMATION);
}
else if( LOWORD(lParam) >= 340 && LOWORD(lParam) < 388 && HIWORD(lParam) > 250 && HIWORD(lParam) < 264)
{
if (g_hCheckUpdate == NULL)
{
g_hCheckUpdate = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) CheckUpdate, (LPVOID) hWnd, 0, &i);
}
}
else
{
if(LOWORD(lParam) >= 60 && LOWORD(lParam) < 116 && HIWORD(lParam) > 43 && HIWORD(lParam) < 99 && (wParam & MK_CONTROL))
{
if (g_uGateWay == GW_NBUC)
{
g_uGateWay = GW_ZMSHOP;
}
else if (g_uGateWay == GW_ZMSHOP)
{
g_uGateWay = GW_ZMCC;
}
else
{
g_uGateWay = GW_NBUC;
}
rtRect.left = 223;
rtRect.top = 58;
rtRect.right = 300;
rtRect.bottom = 78;
InvalidateRect(hWnd, &rtRect, TRUE);
s_bNeedLogIn = TRUE;
}
else
{
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
}
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));
}
SetDlgItemText(hWnd, IDC_STATIC_STATUS, szTemp);
break;
case WM_ZMSGUPDATE:
OnZmsgUpdate(hWnd, wParam, lParam);
break;
case WM_MOUSEMOVE:
// 鼠标移动,判断是否改变 URL 文字的颜色
if( LOWORD(lParam) >= 60 && LOWORD(lParam) < 180 && HIWORD(lParam) >= 184 && HIWORD(lParam) < 198)
i = 1;
else if( LOWORD(lParam) >= 60 && LOWORD(lParam) < 185 && HIWORD(lParam) > 199 && HIWORD(lParam) < 213)
i = 2;
else if( LOWORD(lParam) >= 340 && LOWORD(lParam) < 388 && HIWORD(lParam) > 235 && HIWORD(lParam) < 249)
i = 3;
else if( LOWORD(lParam) >= 340 && LOWORD(lParam) < 388 && HIWORD(lParam) > 250 && HIWORD(lParam) < 264)
i = 4;
else
i = 0;
// 如果当前鼠标与上一次鼠标所在区域类型改变
if (i != s_iURLType)
{
// 改变 URL 文字的颜色
s_iURLType = i;
SetCursor(LoadCursor(NULL, (i && s_dwVersion) ? IDC_HAND : IDC_ARROW));
hDC = GetDC(hWnd);
SetTextColor(hDC, i == 1 ? 0x000000FF : 0x00FF0000);
hfontOld = (HFONT) SendMessage(hWnd, WM_GETFONT, 0, 0);
GetObject(hfontOld, sizeof(LOGFONT), &lfFont);
lfFont.lfUnderline = (i == 1);
hfontOld = (HFONT) SelectObject(hDC, CreateFontIndirect(&lfFont));
TextOut(hDC, 60, 185, STR_EMAIL, sizeof(STR_EMAIL) - 1);
DeleteObject(SelectObject(hDC, hfontOld));
lfFont.lfUnderline = (i == 2);
hfontOld = (HFONT) SelectObject(hDC, CreateFontIndirect(&lfFont));
SetTextColor(hDC, i == 2 ? 0x000000FF : 0x00FF0000);
TextOut(hDC, 60, 200, STR_HOMEPAGE, sizeof(STR_HOMEPAGE) - 1);
DeleteObject(SelectObject(hDC, hfontOld));
lfFont.lfUnderline = (i == 3);
hfontOld = (HFONT) SelectObject(hDC, CreateFontIndirect(&lfFont));
SetTextColor(hDC, i == 3 ? 0x000000FF : 0x00FF0000);
TextOut(hDC, 340, 235, STR_VIEWHELP, sizeof(STR_VIEWHELP) - 1);
DeleteObject(SelectObject(hDC, hfontOld));
lfFont.lfUnderline = (i == 4);
hfontOld = (HFONT) SelectObject(hDC, CreateFontIndirect(&lfFont));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -