Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

Форма поверх всех других приложений   Найти похожие ветки 

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

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

 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://delphimaster.net/view/2-1164278756/


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

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


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


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


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


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

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


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

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


 
Anatoly Podgoretsky ©   (2006-11-24 13:20) [5]

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

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


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

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

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


 
DVM ©   (2006-11-24 13:32) [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:49) [8]

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


 
Anatoly Podgoretsky ©   (2006-11-24 14:05) [9]

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

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


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


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

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

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


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

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

BalloonHint


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

:( Help е ненашел


 
Anatoly Podgoretsky ©   (2006-11-24 15:11) [13]

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

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



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

Текущий архив: 2006.12.10;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
2-1163944177
Anth
2006-11-19 16:49
2006.12.10
форма на панели пуск


3-1160123972
Tornado
2006-10-06 12:39
2006.12.10
Подключение к dbf-файлам


15-1163760410
untermensch
2006-11-17 13:46
2006.12.10
В чём щас помосчь пишется ?


1-1162035166
OlDirtyBastard
2006-10-28 15:32
2006.12.10
Twain


15-1164214148
Andy BitOff
2006-11-22 19:49
2006.12.10
Не сочтите зп рекламу, но ...