![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Форма поверх всех других приложений [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, сама по себе модальна и должна выводится поверх ранее созданных модальных окон,,, или я ошибаюсь???