2

我正在为辅助监视器制作任务栏。我让它工作得很好。我也得到了航空模糊效果。但我的问题可能与航空无关。

我想要做的是让我的任务栏窗口始终显示为焦点/激活。它不需要真正集中或激活,我只是希望它看起来那样。您只需在应用程序空闲时调用 setforgroundwindow 即可看到我所追求的效果。但我不能使用它,因为我真的不希望它像那样抓住焦点。我只是希望它总是看起来像它确实有焦点时的样子。

我尝试过各种 WM_XXX 消息调用,包括捕获和发送,我尝试过 setwindowpos 调用,等等。唯一有效的是调用 Mouse_Event(MOUSEEVENTF_LEFTDOWN 然后是 Mouse_Event(MOUSEEVENTF_LEFTUP。我不喜欢这个解决方案,因为它是我想做的一个非常俗气的黑客/解决方法。但无论用 Mouse_Event 调用什么基本上都是什么我只需要在不实际单击我的应用程序或向其发送 Mouse_Event 调用的情况下实现。

4

1 回答 1

3

你没有说你正在使用什么语言,或者这是托管代码还是非托管代码。

对于 C++ 非托管代码,您只需处理 WM_NCACTIVATE 消息并强制它始终处于活动状态,如下所示:

case WM_NCACTIVATE:
   {
   // wParam tells us whether we are active or inactive, but we are going to ignore
   // that and always pass active down to DefWindowProc so it will draw us active.
   DefWindowProc(hwnd, uMsg, TRUE, lParam);
   //return FALSE; // returning false here prevents actual deactivation
   return TRUE; // return true allows deactivation (even though we draw as active)
   }
   break;

编辑:delphi代码中的解决方案(从注释中移出以使其更具可读性)

procedure TForm1.WndProc(var Message: TMessage); 
begin inherited; 
  if (Message.Msg = WM_NCACTIVATE) then 
  begin 
    DefWindowProc(handle, Message.Msg, 1, Message.LParam ); 
    Message.Result := 1; 
  end; 
end;
于 2009-12-21T19:43:45.687 回答