2009-12-21 3 views
2

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

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

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

+0

ли ваше приложение * внешний вид * как панель задач? я спрашиваю, потому что «реальная» панель задач не имеет никакого сфокусированного/нефокусного взгляда - нет рамки без клиента для изменения цветов. я думаю, я не понимаю, что «сфокусированные» стихи «нефокусированные» будут искать панель задач. –

+0

Да, он выглядит так же, как панель задач win7, когда она установлена ​​в режим «aero». Из-за того, как мне пришлось реализовать код blurbehind, когда вы нажали на панель задач, он выглядел активным. Отключите его, и он выглядит дезактивированным. Ответ на самом деле помог мне решить эту проблему. – 2009-12-21 22:13:03

+0

Я думаю, вы сможете увидеть скриншот здесь: http://www.facebook.com/photo.php?pid=106932&l=8cf7240918&id=100000261298303 – 2009-12-21 22:30:10

ответ

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; 

редактировать: раствор в Дельфах коде (перенесено из комментариев, чтобы сделать его более удобным для чтения)

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; 
+0

СПАСИБО. Я потратил часы, пытаясь решить эту проблему. Я знал, что это, вероятно, будет чем-то простым, как перехват msg, но я собирался по кругу. Это код delphi. Ключ был частью DefWindowProc. Вот фиксированный код: процедура TForm1.WndProc (var Message: TMessage); начало унаследовано; if (Message.Msg = WM_NCACTIVATE), затем begin DefWindowProc (handle, Message.Msg, 1, Message.LParam); Message.Result: = 1; конец; конец; – 2009-12-21 22:16:28

+0

Да, вы действительно ДЕЙСТВИТЕЛЬНО не хотите заходить в организацию рисования собственной неклиентской области. –

Смежные вопросы