突发奇想,想要制作一个类似于windows开机密码的界面,可以实现开机自启并在其中输入密码时实现自己想要的炫酷效果
既然是开机密码,肯定不能让人不输密码就随意进入。除了设置了开机自启要输入密码才会关掉程序去掉标题栏全屏化,并且用了低级钩子屏蔽了系统按键,还实现了自己想要的开机时的动画效果,但是还有一个问题,就是程序必须要强制置顶
如果不强制置顶首先会因为各种原因失去焦点,用任务管理器也可以关掉程序,本来想简单的用SetWindowPos,HWND_TOPMOST实现,但是这样虽然也会一直置顶没办法切出去,但是总是会失去焦点,而且要是有其他一样是用HWND_TOPMOST的程序,还是可能被覆盖
于是查阅了解到通过
SetForegroundWindow(m_hWnd);//函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口
SetFocus(m_hWnd);//将键盘焦点设置为指定窗口
即可重新获取焦点
为了能够最先获得消息,通过
AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(), NULL), GetCurrentThreadId(), TRUE);
//这个函数中将当前应用程序中的当前线程连接到最前端的窗口中,使得输入的消息会最先本分发到当前的线程中。
AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(), NULL), GetCurrentThreadId(), FALSE);
即可优先获得焦点
然后就是函数使用的时机,本来经过查阅了解WM_ACTVITE消息会发给激活与非活的窗口,wParam对应WA_I