Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.190.207.144] |
|
Сообщ.
#1
,
|
|
|
Как скрыть ее вообще - понятно. Но проблема в том, что одного раза выполнения sw_hide не достаточно, винда иногда обновляет таскбар так, что скрытая кнопка появляется. До сих пор решал проблему установкой периодического таймера с процедурой скрытия и интервалом 1-5 сек. Но как то это не очень...
|
Сообщ.
#2
,
|
|
|
Ну еще кроме sw_hide - Application.ShowMainForm := False.
|
Сообщ.
#3
,
|
|
|
s-mike, ну это понятно, но ведь форма не всегда будет спрятана. Посадить sw_hide на показ формы тоже оказалось не вариант - иногда чудесным образом кнопка все-таки всплывает.
|
Сообщ.
#4
,
|
|
|
мыш, а вот это разьве не пашет?
procedure TForm1.FormCreate(Sender: TObject); begin SetWindowLong(Application.Handle,GWL_EXSTYLE,GetWindowLong(Application.Handle,GWL_EXSTYLE) or WS_EX_TOOLWINDOW); end; |
Сообщ.
#5
,
|
|
|
Так оно ж WS_EX_TOOLWINDOW устанавливает, мне не нужно тулвиндоу.
|
Сообщ.
#6
,
|
|
|
Ну дык оно ж скрывает кнопку в таскбаре. Тебе ведь это и нуно? А то, что WS_EX_TOOLWINDOW - это же для окна Application.Handle, а не для формы. Какая тебе разница какой стиль будет иметь окно Application?
Или я чего-то не допонял ? |
Сообщ.
#7
,
|
|
|
да не, все ок, это я недопонял Вобщем работает, пока не вылазила, только вот как ее теперь показать?
SetWindowLong(Application.Handle,GWL_EXSTYLE,GetWindowLong (Application.Handle,GWL_EXSTYLE) xor WS_EX_TOOLWINDOW) не помогает. |
Сообщ.
#8
,
|
|
|
SetWindowLong(Application.Handle,GWL_EXSTYLE,GetWindowLong(Application.Handle,GWL_EXSTYLE) and not WS_EX_TOOLWINDOW) |
Сообщ.
#9
,
|
|
|
Видимо весь этот метод не годится Потому что в таскбаре то кнопка скрывается конечно, но если показать окно программы, а затем его свернуть, то остается его заголовок над таскбаром!
Вот так: Прикреплённый файл__________.JPG (12.11 Кбайт, скачиваний: 484) |
Сообщ.
#10
,
|
|
|
Ну дык все правильно - если кнопки нет на таскбаре, куда ж ей еще сворачиваться-то? Тут только три варианта - в кнопку на таскбаре, в минимизированное окно (как у тя щас) или в трей.
Вобщем, видимо ты хочешь так: запустил прогу - окно на десктопе, кнопки на таскбаре нету. Свернул окно - окна на десктопе нету, кнопка на таскбаре появилась. Развернул окно опять - окно на десктопе, кнопки на таскбаре нету. Я правильно тебя понял? Если правильно, то вот код unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private procedure AppRestore(Sender: TObject); procedure WMSysCommand(var M:TWMSysCommand); message WM_SYSCOMMAND; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Application.OnRestore:=AppRestore; SetWindowLong(Application.Handle,GWL_EXSTYLE,GetWindowLong(Application.Handle,GWL_EXSTYLE) or WS_EX_TOOLWINDOW); end; procedure TForm1.WMSysCommand(var M: TWMSysCommand); begin if M.CmdType=SC_MINIMIZE then SetWindowLong(Application.Handle,GWL_EXSTYLE,GetWindowLong(Application.Handle,GWL_EXSTYLE) and not WS_EX_TOOLWINDOW); inherited end; procedure TForm1.AppRestore(Sender: TObject); begin ShowWindow(Application.Handle,SW_HIDE); end; end. если нет - тады говори чего ты хочешь сделать. |
Сообщ.
#11
,
|
|
|
нифига не выходит Эта кнопка ведет себя как хочет. Я сделал по твоему,
Krid, рецепту процедуру: procedure VisibleInTaskBar(aApplName:string;aApplication:TApplication; aVisible:boolean); var hTaskBar : THandle; begin hTaskbar := FindWindow('TApplication',pchar(aApplName)); if not aVisible then begin SetWindowLong(aApplication.Handle,GWL_EXSTYLE,GetWindowLong(aApplication.Handle,GWL_EXSTYLE) or WS_EX_TOOLWINDOW); ShowWindow(hTaskBar, SW_HIDE); end else begin SetWindowLong(aApplication.Handle,GWL_EXSTYLE,GetWindowLong(aApplication.Handle,GWL_EXSTYLE) and not WS_EX_TOOLWINDOW); ShowWindow(hTaskBar, SW_SHOW); end; end; И запускаю ее из трех мест 1. FormCreate - Нужно спрятать кнопку, приложение грузится в трей. VisibleInTaskBar(false); 2. Событие "Открыть главную форму" (это не событие как таковое, а просто процедура которая вызывается при клике на иконку в трее, но показ формы происходит всегда только через эту процедуру, так что я использую ее, а не application.onrestore - которое происходит не всегда при показе формы) - показать кнопку, пока главная форма на экране - кнопка должна быть в таскбаре. Минимизируем приложение - кнопка в таскбаре все равно. VisibleInTaskBar(true); 3. Событие WmSysCommand SC_CLOSE - юзер нажал на красный крестик, значит убрать кнопку, и свернуть приложение в трей. VisibleInTaskBar(false); прибамбас в этой процедуре с hTaskbar := FindWindow('TApplication',pchar(aApplName)); и т.п. - оно конечно лишнее, если бы всякого рода SetWindowLong сработали, но они не сработали и я решил "бомбить" кнопку двумя методами сразу. Так тоже не помогло. |
Сообщ.
#12
,
|
|
|
Ага, теперь вроде понял. Посмотри проект в аттаче.
Прикреплённый файлTRAY.zip (148.13 Кбайт, скачиваний: 359) |