windows启动后直接进入指定程序并且不显示欢迎界面和windows桌面

windows启动后直接进入指定程序并且不显示欢迎界面和windows桌面

前言

由于系统需求需要做到电脑开机后显示完windows加载页面就直接进入自己系统的界面,并且不显示登录欢迎页面,查阅了很多资料,得到的进入指定程序方法如下:

开机进入指定程序

方法

更改注册表(打开注册表快捷方式“WIN+R 输入regedit 按回车)
定位HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon, 将Shell键值改为你的程序文件名,如将explorer.exe替换为:d:\work\release\test.exe,推荐先改为notepad.exe进行测试:
在这里插入图片描述

问题

修改Shell键的方法确实可以实现开机后进入指定程序界面,但却无法跳过windows的欢迎屏幕,于是又查阅资料,很多都说操作如下可以去掉欢迎界面:

1. win键+R,输入“gpedit.msc”回车
2. 定位到计算机配置->管理模板->系统->登录
3. 双击右侧“登录时不显示欢迎屏幕”,点击“已启用”,确定

但是这个方法对win10系统根本就不起作用,该功能支持的平台仅Windows 2000,那些推荐这个方法的博主些为什么都不去验证一下呢?生气!!!
在这里插入图片描述

浅尝GINA和Credential Providers

没办法,继续翻墙查阅相关资料,也看了不少windows系统方面的文档,熟悉了操作系统的安全登录机制和身份机制。如windows xp的自定义GINA和windows 7版本以上的凭据提供程序

所谓凭据就是提供了一种身份认证的方式,原有的 Windows 身份认证方式就是开机的时候需要你输入密码。而通过微软提供这套接口你可以实现丰富的身份认证方式,比如指纹、人脸和虹膜识别、USB-Key等任意修改 Windows 系统登录时的界面。比较有名的有些一些应该了解过的产品就是 ThinkPad 的指纹解锁功能,通过验证指纹来解锁计算机,当你了解了实现机制以后,硬件条件允许的情况下,你也可以做一套自己的身份认证系统。

想的是通过修改登录欢迎页面来模拟自己程序的启动页面,于是github上下载了CredentialProvider官方示例源码进行编译和修改注册表后弄来弄去最后做成这样:
在这里插入图片描述
发现Credential Providers自定义凭据提供程序并不能改变登录页面的背景图片和取消界面上的所有元素。最后发现Credential Providers文档中有如下一段话:
在这里插入图片描述
就是说 :

不显⽰⽤⼾名、登录状态或平铺图像这些功能现在都由登录 UI 处理,⽆需凭据提供程序进⾏任何额外⼯作”。

好吧,这不是它的职责,又回到了起点,于是又在虚拟机中去捣腾注册表了,最后经过不断的尝试,终于找到了解决办法!

关闭欢迎屏幕

前提
首先电脑不能有开机密码,其次windows 10系统版本太低也不行,比如1803,1709都不行,后来换成windows10_21h1的business版和comsumer版亲测有效。
具体操作如下:

  1. 在“控制面板”>“程序”>“启用或关闭windows功能”>“设备锁定”中勾选“自定义登录”和“无商标的启动”项目,如图:

在这里插入图片描述
2. 打开注册表,定位到“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Embedded\EmbeddedLogon”,设置BrandingNeutral如下:

Value值Description 描述
1禁用所有欢迎屏幕UI元素。
2禁用电源按钮。
4禁用“语言”按钮。
8禁用“轻松访问”按钮。
16禁用“切换”用户按钮。
32禁用阻塞关闭解决程序(BSDR)屏幕,以便重新启动或关闭系统时,操作系统会立即强制关闭任何阻止系统关闭的应用程序。没有UI显示,用户没有机会取消关机过程。如果任何打开的应用程序有未保存的数据,则可能导致数据丢失。

因此将BrandingNeutral项设置为1即可。
您可以进一步将HideAutoLogonUIHideFirstLogonAnimation 设置为 1 以隐藏欢迎屏幕 。
至此,你开机重启后应该再也见不到欢迎屏幕了。

  • 19
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 Windows 后台服务,它会定时监控指定进程,并在进程关闭时重新启动它们。同时,该服务可以打开指定进程的界面。 ```c++ #include <Windows.h> #include <tchar.h> #define SERVICE_NAME _T("MyService") SERVICE_STATUS g_ServiceStatus = { 0 }; SERVICE_STATUS_HANDLE g_ServiceStatusHandle = NULL; HANDLE g_ServiceStopEvent = INVALID_HANDLE_VALUE; VOID WINAPI ServiceMain(DWORD argc, LPTSTR* argv); VOID WINAPI ServiceCtrlHandler(DWORD); DWORD WINAPI ServiceWorkerThread(LPVOID lpParam); int _tmain(int argc, TCHAR* argv[]) { SERVICE_TABLE_ENTRY ServiceTable[] = { { SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; if (StartServiceCtrlDispatcher(ServiceTable) == FALSE) { return GetLastError(); } return 0; } VOID WINAPI ServiceMain(DWORD argc, LPTSTR* argv) { DWORD Status = E_FAIL; g_ServiceStatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, ServiceCtrlHandler); if (g_ServiceStatusHandle == NULL) { return; } ZeroMemory(&g_ServiceStatus, sizeof(g_ServiceStatus)); g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; g_ServiceStatus.dwControlsAccepted = 0; g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; g_ServiceStatus.dwWin32ExitCode = 0; g_ServiceStatus.dwServiceSpecificExitCode = 0; g_ServiceStatus.dwCheckPoint = 0; if (SetServiceStatus(g_ServiceStatusHandle, &g_ServiceStatus) == FALSE) { return; } g_ServiceStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (g_ServiceStopEvent == NULL) { g_ServiceStatus.dwCurrentState = SERVICE_STOPPED; g_ServiceStatus.dwWin32ExitCode = GetLastError(); SetServiceStatus(g_ServiceStatusHandle, &g_ServiceStatus); return; } g_ServiceStatus.dwControlsAccepted |= SERVICE_ACCEPT_STOP; g_ServiceStatus.dwControlsAccepted |= SERVICE_ACCEPT_SHUTDOWN; g_ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(g_ServiceStatusHandle, &g_ServiceStatus); HANDLE hThread = CreateThread(NULL, 0, ServiceWorkerThread, NULL, 0, NULL); WaitForSingleObject(hThread, INFINITE); CloseHandle(g_ServiceStopEvent); g_ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(g_ServiceStatusHandle, &g_ServiceStatus); } VOID WINAPI ServiceCtrlHandler(DWORD CtrlCode) { switch (CtrlCode) { case SERVICE_CONTROL_STOP: if (g_ServiceStatus.dwCurrentState != SERVICE_RUNNING) break; g_ServiceStatus.dwControlsAccepted = 0; g_ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; g_ServiceStatus.dwWin32ExitCode = 0; g_ServiceStatus.dwCheckPoint = 4; SetServiceStatus(g_ServiceStatusHandle, &g_ServiceStatus); SetEvent(g_ServiceStopEvent); break; case SERVICE_CONTROL_SHUTDOWN: g_ServiceStatus.dwControlsAccepted = 0; g_ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; g_ServiceStatus.dwWin32ExitCode = 0; g_ServiceStatus.dwCheckPoint = 3; SetServiceStatus(g_ServiceStatusHandle, &g_ServiceStatus); SetEvent(g_ServiceStopEvent); break; default: break; } } DWORD WINAPI ServiceWorkerThread(LPVOID lpParam) { while (WaitForSingleObject(g_ServiceStopEvent, 0) != WAIT_OBJECT_0) { // 监控进程并重启 STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; // 进程路径和名称 TCHAR szProcessPath[] = _T("C:\\Windows\\notepad.exe"); if (!CreateProcess(szProcessPath, NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)) { // 进程启动失败,可以在这里记录日志 } else { // 进程启动成功,可以在这里记录日志 // 等待进程结束 WaitForSingleObject(pi.hProcess, INFINITE); // 关闭句柄 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } // 等待一段时间后重启 Sleep(5000); } return ERROR_SUCCESS; } ``` 上述代码会定时监控 C:\Windows\notepad.exe 进程,并在进程关闭时重新启动它。你可以将 szProcessPath 改为你所需的进程路径和名称。如果你需要打开进程的界面,可以在 CreateProcess 函数的第一个参数中指定启动的应用程序路径和名称。 要安装该服务,你需要使用管理员权限打开命令提示符,然后运行以下命令: ``` sc create MyService binPath= "C:\path\to\MyService.exe" ``` 其中,MyService 是服务名称,C:\path\to\MyService.exe 是服务可执行文件的路径。你需要将该路径改为你自己的可执行文件路径。 要启动该服务,你可以使用以下命令: ``` net start MyService ``` 要停止该服务,你可以使用以下命令: ``` net stop MyService ``` 注意:在 Windows 系统中,服务运行时没有桌面交互权限,因此无法直接打开界面。如果你需要打开界面,你可以使用 CreateProcess 函数的第一个参数指定启动的应用程序路径和名称,该应用程序应具有桌面交互权限。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值