Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Форма поверх всех других приложений [D7, 95/98, XP]


Xmen ©   (2006-11-24 13:00:00) 

Хочу сделат так что в определенных случаях сделат форму поверх всех других приложений и вывести месаже.
Гдето нашел кусок кода, правда сам еще не разбирался с кодом

 F := TForm1.Create(nil);
 F.Show;
 SetWindowLong(F.Handle, GWL_HWNDPARENT, GetDesktopWindow);
 SetWindowPos(F.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE   or SWP_NOSIZE);
 Beep;
 ShowMessage('Новое сообщение');

Но при этом месажже не показывается он остается позади формы. Так как форма поверх всех окон.
Мне просто нужно было сообшит юзеру о новых сообщения. Как это сделат в стиле ICQ?

Вот ссылка на вчерашный пост, от туда можно узнат чут подробие.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1164278756&n=18


Anatoly Podgoretsky   (2006-11-24 15:11:00) [1]

> Xmen  (24.11.2006 14:46:12)  [12]

Help (справка по русски) разбросана по разним папкам, ищи во всех.


Xmen   (2006-11-24 14:46:00) [2]

:( Help е ненашел


Anatoly Podgoretsky   (2006-11-24 14:44:00) [3]

> Xmen  (24.11.2006 14:13:10)  [10]

BalloonHint


Xmen   (2006-11-24 14:13:00) [4]


> Таймер просить на форму и два раза по нему щелкнуть

Спосибо. Это уже сделал, хотя медленно мигает. Попробовал значение таймера уменшит не дал результата. Я туда еще и Beep написал тепер у меня он пишшит.
Но все таки как это делается

> Ну тогда как нашет сообщения в стиле ICQ. Сообщения выходит
> над систем трейем и мигает иконка программы в трейе.


Anatoly Podgoretsky   (2006-11-24 14:05:00) [5]

> Xmen  (24.11.2006 13:25:06)  [6]

Таймер просить на форму и два раза по нему щелкнуть


Xmen   (2006-11-24 13:49:00) [6]

А постояно до нажатия на эту форму не получется, Таск мененджер он может находится поверх всех и у винапа есть такая фишка.


DVM   (2006-11-24 13:32:00) [7]


> Xmen   (24.11.06 13:00)  

"Поверх всех" это так (пока другое окно тоже не захочет наверх)

function ForceForegroundWindow(hWnd: HWND): BOOL; stdcall;
const
 SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
 SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
 OsVerInfo: TOSVersionInfo;
 Win32MajorVersion: Integer;
 Win32MinorVersion: Integer;
 Win32Platform: Integer;
 ForegroundThreadID: DWORD;
 ThisThreadID: DWORD;
 Timeout: DWORD;
begin
 OsVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
 GetVersionEx(osVerInfo);
 Win32MajorVersion := OsVerInfo.dwMajorVersion;
 Win32MinorVersion := OsVerInfo.dwMinorVersion;
 Win32Platform := OsVerInfo.dwPlatformId;
 if IsIconic(hWnd) then ShowWindow(hWnd, SW_RESTORE);
 if GetForegroundWindow = hWnd then Result := True
 else
 begin
   if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
     ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and ((Win32MajorVersion > 4)
       or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)))) then
   begin
     Result := False;
     ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
     ThisThreadID := GetWindowThreadPRocessId(hWnd, nil);
     if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
     begin
       BringWindowToTop(hWnd);
       SetForegroundWindow(hWnd);
       AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
       Result := (GetForegroundWindow = hWnd);
     end;
     if not Result then
     begin
       SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @Timeout, 0);
       SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
         SPIF_SENDCHANGE);
       BringWindowToTop(hWnd);
       SetForegroundWindow(hWnd);
       SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(Timeout),
                                                              SPIF_SENDCHANGE);
     end;
   end
   else
   begin
     BringWindowToTop(hWnd);
     SetForegroundWindow(hWnd);
   end;
   Result := (GetForegroundWindow = hWnd);
 end;
end; // End of function ForceForegroundWindow


Xmen   (2006-11-24 13:25:00) [8]

Да что то мне невезет. Никак не получается. а как насчет мигания загаловка формы.
Вот пример
var
 Flash: boolean;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 // Мигание заголовка окна
 FlashWindow(Form1.Handle, Flash);
 // Мигание заголовка на панели задач
 FlashWindow(Application.Handle, Flash);
 Flash := not Flash;
end;
Но как это правильно внедрит  в прогу?


Anatoly Podgoretsky   (2006-11-24 13:20:00) [9]

> Xmen  (24.11.2006 13:10:03)  [3]

А она тоже не поверх всех приложений.
Тебе просто кажется.


Сергей М.   (2006-11-24 13:14:00) [10]

см. какой-нть компонент а-ля TrayIcon ... Оных в Интернет - навалом ...


Xmen   (2006-11-24 13:10:00) [11]

Ну тогда как нашет сообщения в стиле ICQ. Сообщения выходит над систем трейем и мигает иконка программы в трейе.


Сергей М.   (2006-11-24 13:04:00) [12]


> Хочу сделат так что в определенных случаях сделат форму
> поверх всех других приложений


В общем случае это невозможно.


zdm   (2006-11-24 13:01:00) [13]

showmessage, сама по себе модальна и должна выводится поверх ранее созданных модальных окон,,, или я ошибаюсь???


Наверх

Титульная страница Поиск, карта сайта Написать письмо