最近写一个程序,要求对话框总在最前,并且始终保持激活状态。在网上搜了半天,找到一段代码:
      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);

    把线程的输入连接到当前活动线程里,就可以进行设置啦~如果要始终保持激活,设置一个定时器,定期检查窗口状态就可以了。