需求的提出:
- 自己编写的程序开机全屏运行
- 不能见到任何windows界面,不能见到资源管理器、任务栏、win 、win + L、ALT + CTL + DEL组合键等系统键都不能用。
- 用户只能见到自己编写的程序界面,只能在自己编写的程序上进行鼠标、键盘操作、关机操作等。
第1点很容易实现,程序全屏这个很容易,当今主流的C++开发包,如:MFC、qt等都能做到。
第2点编程实现有难度,但可以通过windows注册表和组策略来实现。win环境下,用你的程序代替explorer.exe启动,就可以实现不能见到任何windows界面,不能见到资源管理器、任务栏;win 、win + L按键不起作用,方法如下:
有两种方式可以快速完成以上效果
a:“运行” 输入“%windir%\system.ini”,“确定”
在“; for 16-bit app support”首行下按回车键加入以下两行内容,保存
[boot]
shell=你程序的绝对路径
例如:
[boot]
shell=D:\Test\fuck.exe
b:“运行” 输入“regedit”,打开注册表
找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
修改该分支下的Shell值“explorer.exe”为“D:\Test\fuck.exe”
OK,重启,搞定。
其中b方法的C++代码实现如下:
void CEmergencyModeWnd::doWinExplorer(bool bEnableoWinExplorer/* = false*/)
{
bool bRet = false;
HKEY hKey;
wstring strRegPath = L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon";
// 1、找到系统的启动项
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, strRegPath.c_str(), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) ///打开启动项
{
// 2、得到本程序自身的全路径
TCHAR strExeFullDir[MAX_PATH];
GetModuleFileName(NULL, strExeFullDir, MAX_PATH);
if (!bEnableoWinExplorer)
{
RegSetValueEx(hKey, L"Shell", 0, REG_SZ, (LPBYTE)strExeFullDir, (lstrlen(strExeFullDir) + 1) * sizeof(TCHAR));
}
else
{
RegSetValueEx(hKey, L"Shell", 0, REG_SZ, (LPBYTE)L"explorer.exe", (lstrlen(L"explorer.exe") + 1) * sizeof(TCHAR));
}
RegCloseKey(hKey);
}
}
ALT + CTL + DEL组合键可以通过组策略来实现,参考《如何禁用ALT+CLT+DEL组合键》,需要说明的是:这样当自己编写的程序崩溃时,因为不能见到任何windows界面,不能见到资源管理器、任务栏、win 、win + L、ALT + CTL + DEL组合键等系统键都不能用,除了重装系统外,别无它法,也就是我们所说的肉鸡。为了解决肉鸡问题,我们需要留个后门,
比如:当自己编写的程序开机运行起来后第一个界面出现时,在该界面类中实现按clt + shift +k键能调出如下界面进行急救(注意:这个界面应该保证无论如何都不会出现异常、崩溃从而导致出不来,否则下面的方法依然不能解决肉鸡问题):
启用windows程序管理器、禁用windows程序管理器就是调用上面的函数从而将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon中的shell改为自己的程序或者是windows程序管理器explorer.exe(这样开机时就可以进入桌面,看到windows的界面和资源管理器了),打开注册表用C++代码实现如下:
system("regedit.exe");
打开组策略代码如下:
system("gpedit.msc");
这样就可以通过操作注册表来手动更改 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon中的shell是改回windows程序管理器explorer.exe(这样开机时就可以进入桌面,看到windows的界面和资源管理器了)、手动更改组策略从而启动任务管理器,如下:
单击右侧红色框中项,来启用相应的项,如:任务管理器
选择”未配置“或者”已禁用“则就开启了相应的项,如:任务管理器