最近写一个程序,要求对话框总在最前,并且始终保持激活状态。在网上搜了半天,找到一段代码:
CRect rc;
GetWindowRect(&rc);
SetWindowPos(&wndTopMost,rc.left,rc.top,rc.bottom,rc.right,
SWP_NOMOVE |SWP_NOSIZE |SWP_NOACTIVATE);
试了一下,窗口是显示在最前面了,但是鼠标点击别的地方的时候就失去焦点了。怎么办呢?
在ClassWizard里找失去焦点的事件,找到一个WM_KILLFOCUS,嗯?捕获不到?再一查,原来这个消息使用的是SendMessage,不放到消息队列里的,当然捕获不到了~
又找到一个WM_ACTIVE,试了一下,还是不行,最后终于找到了解决办法:
if(::GetForegroundWindow() == m_hWnd)
return;
HWND hCurWnd = NULL;
DWORD lMyID;
DWORD lCurID;
hCurWnd = ::GetForegroundWindow();
lMyID = ::GetCurrentThreadId();
lCurID = ::GetWindowThreadProcessId(hCurWnd, NULL);
::AttachThreadInput(lMyID, lCurID, TRUE);
SetForegroundWindow();
::AttachThreadInput(lMyID, lCurID, FALSE);
把线程的输入连接到当前活动线程里,就可以进行设置啦~如果要始终保持激活,设置一个定时器,定期检查窗口状态就可以了。