在网上下载了一个Windows 自动登录器,觉得挺好玩的。发现它是修改注册表实现自动登录。自己也就试试写一个玩玩。
程序界面:
实现原理,修改注册表键值
=========================================================================================================
在运行中输入:regedit 打开注册表编辑器:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon主键
要求:指定的自动登陆帐号至少是user级别用户;
前三项键值是必须要有的:
----autoadminlogon,键值为1,用于设置是否可以自动登陆;键值为0,则反之 ----defaultusername:键值为自动登陆默认的用户名; ----defaultpassword: 键值为自动登陆用户的密码; ----defaultdomainname:键值为自动登陆的计算机名称或者登陆网络的域名; ----ForceAutoLogon的字符串值,并将这个值设为1,这样系统即便是在注销之后也会自动登录到指定的账户; ----在默认情况下,在启动时可以按住Shift键来阻止自动登录,要消除Shift键对自动登录的影响,可以添加一个名为IgnoreShiftOverride的字符串值,并将该值设为1; ----添加AutoLogonCount的DWORD值,可以设置希望自动登录的次数
=========================================================================================================
初始化代码 在 OnInitDialog() 末尾(return TRUE; 前)加入:
// 获取当前用户名
char User[MAX_PATH];
DWORD Size = MAX_PATH;
if (GetUserName(User,&Size)) // 获取用户名
SetDlgItemText(IDC_Name , User); // 显示在编辑框中
else
SetDlgItemText(IDC_Name , "自动获取用户名失败,请输入用户名");
HKEY RegKey;
char temp[MAX_PATH]; // 获取键值存放缓冲区
DWORD dwtype; // 键值类型
DWORD sl = MAX_PATH; // 缓冲区大小 if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",0, KEY_ALL_ACCESS, &RegKey))
{
RegQueryValueEx(RegKey,"AutoAdminLogon",NULL,&dwtype,(LPBYTE)temp,&sl);
if (strcmp("1",(char *)temp) == 0) // 判断 AutoAdminLogon 是否为 1
SetDlgItemText(IDC_ZT,"温馨提示:检测到系统已经是自动登录状态!");
else
SetDlgItemText(IDC_ZT,"系统尚未设置自动登录!");
}========================================================================================================= 修改注册表函数:
// 参数:设置、取消,注销生效,屏蔽Shift键,用户名,密码:返回 1 为失败 0 为成功
int Reg(int i, int zhux, int Shift, char User[], char Password[])
{
HKEY RegKey;
char AutoUser[] = "DefaultUserName"; // 用户名
char AutoPass[] = "Defaultpassword"; // 密码
char Auto[] = "AutoAdminLogon"; // 1 自动登录
char Autozhux[] = "ForceAutoLogon"; // 注销时有效
char AutoShift[] = "IgnoreShiftOverride"; // 消除Shift键对自动登录的影响 if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",0, KEY_ALL_ACCESS, &RegKey))
return 1; if (i) // 设置
{
char T='1'; RegSetValueEx(RegKey, AutoUser, 0, REG_SZ, (LPBYTE)User, strlen(User)); // 设置用户名
RegSetValueEx(RegKey, AutoPass, 0, REG_SZ, (LPBYTE)Password, strlen(Password)); // 设置密码
if (!zhux) // 如果没有勾选 注销无效复选框 则设置注销有效
RegSetValueEx(RegKey, Autozhux, 0, REG_SZ, (const BYTE *)&T, 1);
else
RegDeleteValue(RegKey, Autozhux);
if (!Shift) // 如果没有勾选 不屏蔽Shift 键 则设置屏蔽Shift键
RegSetValueEx(RegKey, AutoShift, 0, REG_SZ, (const BYTE *)&T, 1);
else
RegDeleteValue(RegKey, AutoShift);
if (RegSetValueEx(RegKey, Auto, 0, REG_SZ, (const BYTE *)&T, 1)) // 只判断关键的注册表值就行啦
return 1;
}
else // 取消
{
RegDeleteValue(RegKey, AutoUser); // 删除用户名键值
RegDeleteValue(RegKey, AutoPass); // 删除密码键值
RegDeleteValue(RegKey, Autozhux); // 删除注销有效键值
RegDeleteValue(RegKey, AutoShift); // 删除屏蔽Shift 键值
if (RegDeleteValue(RegKey, Auto)) // 删除自动登录
return 1;
}
RegCloseKey(RegKey);
return 0;
}========================================================================================================= 【自动登录】按键触发代码: void CWindowsDlg::OnAutoAdd()
{
// TODO: Add your control notification handler code here
char User[MAX_PATH]; // 存储 用户名 编辑框中数据的缓冲区
char Password[MAX_PATH]; // 存储 密码 编辑框中数据的缓冲区 GetDlgItemText(IDC_Name, User, MAX_PATH); // 获取 用户名 编辑框中的缓冲区
GetDlgItemText(IDC_Password, Password, MAX_PATH); // 获取 密码 编辑框中的缓冲区 CButton *pButton; // 定义对象 pButton = (CButton *)GetDlgItem(IDC_ZX); //获得指定IDcheckbox对象引用,并转换为CButton对象
int zhux = pButton->GetCheck();//获得checkbox的点击状态,值只有0 1 2三种状态,点击后为非0值 pButton = (CButton *)GetDlgItem(IDC_Shift);
int Shift = pButton->GetCheck();
char temp[50] = "设置 Windows 自动登录"; // 状态显示 if (!Reg(1,zhux,Shift,User,Password))
{
strcat(temp,"成功!");
if (!zhux) // 如果没有勾选 注销无效
strcat(temp," 注销时有效!");
if (!Shift) // 如果没有勾选 不屏蔽Shift 键
strcat(temp," 屏蔽Shift 键的影响!");
SetDlgItemText(IDC_ZT, temp); // 显示状态
MessageBox("设置 Windows 自动登录成功! ", "OK", MB_ICONASTERISK | MB_SYSTEMMODAL);
}
else
{
SetDlgItemText(IDC_ZT, "设置 Windows 自动登录失败!");
MessageBox("设置 Windows 自动登录失败!可能是由于安全软件的拦截或权限原因! ", "ERROR", MB_ICONWARNING | MB_SYSTEMMODAL);
}
} ========================================================================================================= 【取消自动】按键触发代码: void CWindowsDlg::OnAutoDel()
{
// TODO: Add your control notification handler code here
if (!Reg(0,NULL,NULL,NULL,NULL))
{
SetDlgItemText(IDC_ZT, "取消 Windows 自动登录成功!");
MessageBox("取消 Windows 自动登录成功! ", "OK", MB_ICONASTERISK | MB_SYSTEMMODAL);
}
else
{
SetDlgItemText(IDC_ZT, "取消 Windows 自动登录失败!");
MessageBox("取消 Windows 自动登录失败! 可能由于安全软件的拦截 或 早就取消 Windows自动登录! ", "ERROR",MB_ICONWARNING | MB_SYSTEMMODAL);
}
}
|