Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];

Вниз

Как сделать окно активным   Найти похожие ветки 

 
Керик   (2002-06-09 05:36) [0]

Помогите, плиз! Моя прога запускается вместе с Windows. Главное окно её при этом не показывается. Для этого я использую Application.ShowMainForm. Когда юзер щёлкает крысой на значок в трее моей проги, то окно появляется на экране, но за всеми другими окнами и неактивным. Я использовал: BringWindowToTop, SetWindowPos, Self.Activate, но ничего не работает! ХЭЛП!


 
SPeller   (2002-06-09 06:14) [1]

SetWindowPos как использовал?


 
Song   (2002-06-09 10:15) [2]

А Вы все эти окна открывали перед тем как засунуть приложение в трей ?

И покажите процедуру обработки сообщения от значка.


 
easy   (2002-06-10 16:17) [3]

попробуй

SetForegroundWindow(form1.Handle);


 
Керик   (2002-06-11 06:13) [4]

Song! Я не открывал эти окна перед тем, как засунуть его в трей. Использую Application.ShowMainForm := False ещё до создания окна!
Вот процедура обработки клика по значку в трее:
procedure TLogForm.TrayIconClick(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
LogForm.Show;
TrayIcon.Active := False;
AnimateTray := False;
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, swp_nosize+swp_nomove);
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, swp_nosize+swp_nomove);
Activate;
end;


easy! SetForegroundWindow(...); - к сожалению не активизирует окно моей проги!


 
SPeller   (2002-06-11 11:43) [5]

swp_nosize+swp_nomove

Это что-то новое... :) swp_nosize or swp_nomove


 
Song   (2002-06-11 14:27) [6]

2SPeller © (11.06.02 11:43)
Идентично. Битовую арифметику давно не изучали ? :-))


 
SPeller   (2002-06-11 14:39) [7]

Давно. Я просто знаю и везде где не смотрел везде было логическое "или". Простое сложение первый раз вижу в таком случае.


 
короед   (2002-06-11 15:26) [8]

2Керик

А зачем второй
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, swp_nosize+swp_nomove); ?

и еще

SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0{а разве это не Width окна???}, 0{а это не Height???}, swp_nosize+swp_nomove);


 
Керик   (2002-06-12 06:27) [9]

2Song © (11.06.02 14:27)
Верно!:-) Это одно и тоже в этом случае!

короед © (11.06.02 15:26)
А второй для того, чтобы окно не постоянно оставалось поверх всех. Только появилось сверху на экране и всё! А BringWindowToTop и SetForegroundWindow не работают :-(

Насчёт SetWindowPos: ты прав, это Width и Height окна, но ты забыл посмотреть на флаги: swp_nosize{не менять размеры} и swp_nomove {не перемещать}.

Только ответ на свой вопрос, изложенный вначале, я так и не получил :-( Может быть кто-то знает?


 
Tkach_   (2002-06-12 12:50) [10]

достаточно задать стиль этой формы StayOnTop. А если необходимо, чтобы форма была поверх всех окон системы, даже если она теряет фокус необходимо описать обработчик Application.OnDeactivate.
ИМХО лучше в таких случаях работать именно с объектом Application а не бороться со свойствами самой формы.


interface

TStartForm = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure SetOnTop(Sender: TObject);
end;

implementation

procedure TStartForm.SetOnTop(Sender: TObject);
begin
Application.BringToFront;
end;

procedure TStartForm.FormCreate(Sender: TObject);
begin
FormStyle:=StayOnTop;
Application.OnDeactivate:=setontop;
end;




 
Diamond Cat   (2002-06-13 01:32) [11]

SetForegroundWindow обязано сработать вопрос только в каком месте ты пытаешся его воткнуть, може просто к моменту вызова этой функции твое окно еще не готово к показу или какие другие аклюзии посмотри что говорит GetLastError


 
Керик   (2002-06-14 05:19) [12]

Tkach, мне не надо чтобы окно было всегда на верху, а только чтобы оно при появлении установилось поверх всех, а потом уже если юзер захочет сделать его не на самом верху, то окно должно послушно выполнить перемещение окна из верха в зад. Кстати, а что такое ИМХО?

Diamond Cat ©.
В принцине это работает, выводит окно на верх, но не активизирует его!


 
Cobalt   (2002-06-14 06:23) [13]

Попробуй сначала Form.Show, Application.ProcessMessages а затем SetForegroundWindow.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
1-60624
Uran
2002-08-08 16:41
2002.08.19
СoInitialize - как вызывать!?


1-60742
SergeySA
2002-08-07 14:13
2002.08.19
как послать всем окнам сообщение , чтоб перерисовались ?


1-60607
Nico1a
2002-08-08 10:29
2002.08.19
Drag n Drop


1-60604
Sedunov Vitaly
2002-08-08 12:15
2002.08.19
Свойства компонентов


1-60697
proc
2002-08-05 15:19
2002.08.19
if Var1(0.01) > Var2(0.01) = True





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский