您的位置:首页 > 其它

PPPOE登录程序一(主程序部分locked)

2010-08-20 13:58 148 查看
如果有看官看的话,有点抱歉,我只是记录一下我比较容易忘记的函数使用方法,方便我查询.我会把源代码贴出来的
其实我写的时候发现要注意的细节真的好多....
locked.exe主程序部分需要一个参数的结构体,这个结构体是跟配置程序的结构体通用的。

typedef struct _lockcfg{
wchar_t superuser[20];//超级管理员账号
wchar_t superpwd[20];//超级管理员密码
wchar_t cfgpwd[20];//设置窗口密码
wchar_t myadsl[20];//自己的PPPOE
wchar_t picpath[MAX_PATH];//登陆程序背景位置
int sht_time;//自动关机时间
int try_time;//联网尝试失败时间
int sa_sht_time;//超级管理员允许登陆时间
}LOCKCFG,*PLOCKCFG;//配置文件结构体
主程序中的一些重要函数如下:

//dll函数的一些声明

//dll的函数
#pragma comment(lib,"..//Release//lock.lib")
#pragma comment(lib,"..//Release//connect.lib")
//#pragma comment(lib,"..//debug//lock.lib")
//#pragma comment(lib,"..//debug//connect.lib")
_declspec(dllimport) bool LockWnd(HWND wnd);//_declspec(dllimport)//_declspec(dllexport)
_declspec(dllimport) bool UnLockWnd(HWND wnd);
_declspec(dllimport) void ScanMasterWnd();
_declspec(dllimport) int network_test();
_declspec(dllimport) int connect_adsl(wchar_t* adsl_name
,wchar_t* user_name
,wchar_t* user_pwd
,bool b_try
,int try_time);//b_try是否启用尝试时间
_declspec(dllimport) int disconnect_adsl();

//////////////初始化函数

BOOL CLockedDlg::OnInitDialog()
{
//...............省略部分代码

::LockWnd(this->m_hWnd);
m_hThread=::CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ScanMasterWnd,NULL,0,NULL);///////////////////////////此处感觉不是很好!!!!
SetTimer(SHUTDOWN_EVENT,m_cfg.sht_time*1000,NULL);

this->ReadOnlyEdit(IDC_USER,0);
this->ReadOnlyEdit(IDC_PWD,0);
this->ReadOnlyEdit(IDC_LOCK_PWD,1);

SetBG(m_cfg.picpath);

///////////初始化图片按钮/////////////////////
m_lbtn.LoadBitmaps(IDB_LOGIN1,IDB_LOGIN2);
m_sbtn.LoadBitmaps(IDB_SHUTDOWN1,IDB_SHUTDOWN2);
m_lbtn.SubclassDlgItem(IDC_LOGIN_BTN,this);
m_sbtn.SubclassDlgItem(IDC_SHUTDOWN_BTN,this);
m_lbtn.SizeToContent();
m_sbtn.SizeToContent();

ShowLoginMsg(_T("等待登录.."));
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

//登陆函数,其中主要包括了Shell_NotifyIcon函数的使用
int CLockedDlg::LogIn(bool IsSA)//是否是管理员登录
{
CString tip;
memset(&m_nid,0,sizeof(m_nid));

m_nid.cbSize=sizeof(m_nid);
m_nid.hWnd=this->m_hWnd;
m_nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
m_nid.uID=IDR_MAINFRAME;
m_nid.uCallbackMessage=WM_ICONNOTIFY;
if(IsSA)
{
tip=_T("超级管理员登录");
m_nid.hIcon=::LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON2));
::TerminateThread(m_hThread,0);
::UnLockWnd(this->m_hWnd);
SetTimer(SHUTDOWN_EVENT,m_cfg.sa_sht_time*1000,NULL);

}
else
{
tip=_T("普通用户登录");
m_nid.hIcon=::LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON1));
::UnLockWnd(this->m_hWnd);
}
wcscpy(m_nid.szTip,tip);
::Shell_NotifyIcon(NIM_ADD,&m_nid);

SetStartTime();
this->ShowWindow(0);
return 0;
}
//弹出菜单的实现
LRESULT CLockedDlg::OnIconNotify(WPARAM wParam,LPARAM lParam)
{
if(lParam==WM_RBUTTONUP)
{
POINT pt;
CMenu menu;
::GetCursorPos(&pt);
menu.LoadMenu(IDR_MENU1);//加载菜单
::TrackPopupMenu(GetSubMenu(menu.m_hMenu,0), TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN,pt.x,pt.y,0,this->m_hWnd,NULL);
menu.DestroyMenu();
}

return 0;
}
//使label等文字实现透明,重载的函数
HBRUSH CLockedDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: 在此更改 DC 的任何属性

// TODO: 如果默认的不是所需画笔,则返回另一个画笔

// TODO: Return a different brush if the default is not desired
if(pWnd->GetDlgCtrlID()==IDC_STATIC||pWnd->GetDlgCtrlID()==IDC_WAIT_CHECK) // Your ID
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,0,0));
hbr = (HBRUSH)::GetStockObject(NULL_BRUSH); //注意最后这个hbr返回
}

if(pWnd->GetDlgCtrlID()==IDC_LOGIN_MSG) // Your ID
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
hbr = (HBRUSH)::GetStockObject(NULL_BRUSH); //注意最后这个hbr返回
}
return hbr;
}

//登陆按钮

void CLockedDlg::OnBnClickedLoginBtn()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();

//////////////此处为登录所需要的信息//////////////////////////////
wchar_t user[100]={0};
wchar_t pwd[100]={0};
wcscpy(user,m_user);//获取用户名
wcscpy(pwd,m_pwd);//获取密码
//////////////////////////////////////////////////////////////////
if(GetLockedState()==false)//不是锁定状态
{
ShowLoginMsg(_T("电脑登录中,请耐心等待..."));

if(m_user=="")//如果用户名为空,直接结束函数
{
return ;
}
if(wcscmp(user,m_cfg.superuser)==0&&wcscmp(pwd,m_cfg.superpwd)==0)
{
SetSuperUserState(true);
LogIn(GetSuperUserState());//管理员登陆
}
else
{
connect_adsl(m_cfg.myadsl,user,pwd,!this->GetWaitChecked(),m_cfg.try_time*1000);//连接PPPOE上网
if(1==network_test())//测试是否通过PPPOE上网
{
SetSuperUserState(false);
LogIn(GetSuperUserState());//普通登录
}
else
{
// MessageBox(_T("登录失败,请检查输入密码,或去掉登录尝试时间!"),_T("提示"),MB_OK|MB_ICONERROR);
ShowLoginMsg(_T("如果总是登录失败,请选择等待模式登录,如果仍然无法登录,请确定你的账号与密码,并且跟管理员联系!"));

return ;
}
}
}
else
{
if(m_lock_pwd.Compare(m_unlock_pwd)==0)
{
UnLockWnd();
SetLockedState(false);
}
else
{
// MessageBox(_T("解锁密码错误,请重新输入!"),_T("提示"),MB_OK|MB_ICONERROR);
ShowLoginMsg(_T("请检查锁定密码是否输入错误,请重新输入!"));

return ;
}
}

}

//两个全局函数用于进程的相互保护,主要注意获得进程的函数使用方法,protect函数的代码跟plck.exe的代码相对应

BOOL bExistOne(IN CString szName,OUT DWORD* pdwPID)//只有存在同名进程的时候才有意义
{
PROCESSENTRY32 processEntry32 = {0};
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{

return FALSE;
}
processEntry32.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(hProcessSnap,&processEntry32);
CString strModuleNames;
while (bRet)
{
if (szName.Compare(processEntry32.szExeFile)==0) //存在其他同样的进程
{
CloseHandle(hProcessSnap);
*pdwPID = processEntry32.th32ProcessID;
return TRUE;
}

bRet = Process32Next(hProcessSnap,&processEntry32);
}
// AfxMessageBox(strModuleNames);
return FALSE;

}

void protect()
{

HANDLE hProcessForWait;
DWORD dwPidIfExist;
DWORD exit_code;

if (TRUE == bExistOne(_T("plck.exe"),&dwPidIfExist))
{

hProcessForWait = OpenProcess(2035711,FALSE,dwPidIfExist);
WaitForSingleObject(hProcessForWait,INFINITE);
GetExitCodeProcess(hProcessForWait,&exit_code);

if(exit_code==69)
{
::TerminateProcess(::GetCurrentProcess(),69);
}
else
{

while(true)
{
ShellExecute(NULL,NULL,_T("shutdown"),_T("-s -t 5000 -c 保护进程程被异常卸载,电脑将5秒后重启!!"),NULL,1);
Sleep(15*1000);
}
}
}
else
{
::MessageBox(NULL,_T("locked.exe非正常启动程序,模块被强制卸载!"),_T("错误提示"),MB_OK|MB_ICONERROR);
::TerminateProcess(::GetCurrentProcess(),99);//exit code is 99
}
}

void CLockedApp::StartProtect()
{
::AfxBeginThread((AFX_THREADPROC)protect,NULL);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: