【问题标题】:Keep Window Looking Active保持窗口看起来活跃
【发布时间】:2010-12-28 20:44:52
【问题描述】:

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

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

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

【问题讨论】:

  • 您的应用程序看起来像任务栏吗?我问是因为“真正的”任务栏没有任何聚焦/不聚焦的外观 - 没有非客户端框架可以更改颜色。我想我不明白任务栏的“专注”诗句“不专注”会是什么。
  • 是的,当它设置为“aero”模式时,它看起来就像 win7 的任务栏。由于我必须实现模糊代码的方式,当您单击我的任务栏时,它看起来很活跃。单击它,它看起来已停用。下面的答案其实帮我解决了。
  • 我想你可以在这里看到截图:facebook.com/…

标签: taskbar


【解决方案1】:

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

对于 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;

【讨论】:

  • 谢谢。我花了几个小时试图解决这个问题。我知道这可能是一个简单的消息拦截,但我在绕圈子。这是德尔福代码。关键是 DefWindowProc 部分。这是固定代码:procedure TForm1.WndProc(var Message: TMessage);开始继承; if (Message.Msg = WM_NCACTIVATE) 然后开始 DefWindowProc(handle, Message.Msg, 1, Message.LParam); Message.Result := 1;结尾;结束;
  • 是的,你真的不想涉足绘制自己的非客户区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2011-08-07
  • 1970-01-01
  • 2012-10-09
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多