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 に答える