Держать окно в активном состоянии - PullRequest
2 голосов
/ 21 декабря 2009

Я работаю над панелью задач для вторичных мониторов. У меня это работает довольно хорошо. У меня также работает аэродинамичность. Но мой вопрос, вероятно, не связан с аэродинамикой.

Что я хочу сделать, так это чтобы окно панели задач всегда было сфокусированным / активированным. Это не должно быть на самом деле сфокусировано или активировано, я просто хочу, чтобы это выглядело так. Вы можете увидеть эффект, которого я добиваюсь, просто поместив вызов setforgroundwindow в простое приложения. Но я не могу использовать это, поскольку я действительно не хочу, чтобы это захватывало центр внимания таким образом. Я просто хочу, чтобы оно всегда выглядело так, как оно есть, когда оно имеет фокус.

Я пробовал всевозможные вызовы сообщений WM_XXX, как перехват, так и отправку, я пробовал вызовы setwindowpos, и так далее, и так далее. Единственное, что сработало, - это вызвать Mouse_Event (MOUSEEVENTF_LEFTDOWN, а затем Mouse_Event (MOUSEEVENTF_LEFTUP). Мне не нравится это решение, хотя это действительно глупый взлом / обходной путь к тому, что я хочу сделать. Но то, что вызывается с помощью Mouse_Event, по существу Мне нужно, чтобы это происходило, только не нажимая на мое приложение и не отправляя ему вызовы Mouse_Event.

1 Ответ

3 голосов
/ 21 декабря 2009

Вы не говорите, на каком языке вы работаете, или это управляемый или неуправляемый код.

Для неуправляемого кода 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;

edit: решение в коде 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;
...