Я хочу написать приложение, окно которого должно располагаться под всеми окнами (like Desktop). На delphi.mastak.ru я нашёл вот что:
procedure WMWindowPosChanging(var Message:TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
//а вот это в implementation
procedure TForm1.WMWindowPosChanging(var Message:TWMWindowPosChanging);
begin
with message.WindowPos^ do flags:=flags or SWP_NOZORDER;
inherited;
end;
Это работает, но мне это нужно сделать без VCL. Пробовал сделать так:
...
WM_WINDOWPOSCHANGING:
...
SetWindowPos (hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);
...
// или так:
WINDOWPOS * ppos = (WINDOWPOS*) lparam;
ppos->flags |= SWP_NOZORDER;
...
— не работает.
У меня пока так:
SetWindowPos (hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
Так работает, но при клике на моём десктопе десктоп перерисовывается (выходит на передний план) и потом уходит под все окна.
Заранее благодарю за помощь.
P.S.
Поиск по сайту не помог, по инету — тоже...
В исходниках VCL ничего не понял.
Здравствуйте, __MasteR__, Вы писали:
__M>Так работает, но при клике на моём десктопе десктоп перерисовывается (выходит на передний план) и потом уходит под все окна.
__M>Заранее благодарю за помощь.
__M>P.S.
__M>Поиск по сайту не помог, по инету — тоже...
__M>В исходниках VCL ничего не понял.
The WM_LBUTTONDOWN message is posted when the user presses the left mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
Я не уверен, но думаю, что можно не обрабатывать это сообщение вообще. Может быть с сообщением напутал.
... << RSDN@Home 1.1.3 stable silent>>
Попробуй сделать свое окно дочерним настоящего desktop-а.
Тебе это НЕ поможет, но очень красиво...
Здравствуйте, __MasteR__, Вы писали:
__M>Я хочу написать приложение, окно которого должно располагаться под всеми окнами (like Desktop).
Вот, кажется нашёл.
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
/* bla-bla-bla */
if(uMsg == WM_MOUSEACTIVATE)
return MA_NOACTIVATE;
/* bla-bla-bla */
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
... << RSDN@Home 1.1.3 stable silent>>
Здравствуйте, NoFate, Вы писали:
NF>Здравствуйте, __MasteR__, Вы писали:
__M>>Я хочу написать приложение, окно которого должно располагаться под всеми окнами (like Desktop).
NF>Вот, кажется нашёл.
NF>NF>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
NF>{
NF>/* bla-bla-bla */
NF> if(uMsg == WM_MOUSEACTIVATE)
NF> return MA_NOACTIVATE;
NF>/* bla-bla-bla */
NF> return DefWindowProc(hwnd, uMsg, wParam, lParam);
NF>}
NF>
А при переключении на окно, например, через Alt+Tab это помогает?
Здравствуйте, rus blood, Вы писали:
RB>А при переключении на окно, например, через Alt+Tab это помогает?
Думаю, нет.
Там, наверное другое сообщение нужно обработать.
MSDN в помощь
... << RSDN@Home 1.1.3 stable silent>>
Здравствуйте, NoFate, Вы писали:
RB>>А при переключении на окно, например, через Alt+Tab это помогает?
NF>Думаю, нет.
NF>Там, наверное другое сообщение нужно обработать.
NF>MSDN в помощь
Для Alt-TAB не помогает...
MSDN-то MSDN-ом, но меня больше интересует, что VCL делает когда я такой (прведённый выше) код пишу.
Когда я делаю так:
WINDOWPOS * ppos = (WINDOWPOS*) lparam;
ppos->flags |= SWP_NOZORDER;
окно все равно выходит на передний план. А ведь тот самый код, как мне сказали в форуме Delphi&Builder,
"в пришедшем меседже устанавливает флаг SWP_NOZORDER"
??