背景:
在做类似虚拟键盘的程序时,一个关键问题是,需要做一个置顶的,并且不会占用输入焦点的对话框;也就是说,你的程序运行之后必须一直在最前端显示,并且它还不会获取焦点,系统焦点任然停留在原来的位置上,这样通过你的程序产生的模拟键盘事件才能传给原来的那个输入位置上;
实现技术:
为了实现这个功能,需要做以下几个内容
1.对话框设置为POPUP类型,TOPMOST=TRUE;
2.在PreCreateWindow中,去掉WS_VISIBLE风格:cs.style &= ~WS_VISIBLE ;
3.在OnInitDialog,调用SetWindowPos,参数uFlag取值SWP_SHOWWINDOW | SWP_NOACTIVATE
4.在OnInitDialog, 调用:
HWND m_hForground = ::GetForegroundWindow();
ModifyStyleEx(WS_EX_NOACTIVATE,0);
::SetForegroundWindow(m_hForground);
ModifyStyleEx(0,WS_EX_NOACTIVATE);
上面的代码使得系统焦点任然停留在上一层桌面;
经过上面的几个步骤,就完成了一个 置顶、且不会获取焦点的对话框程序
参考:
2 。 不激活窗口