Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Все формы приложения поверх всего, Как это сделать? 
V
    Опции темы
Sunvas
  Дата 16.3.2006, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Как сделать чтобы две формы моего приложения были всегда поверх других окон? Вариант чтобы в свойствах форм выставить вместо fsnormal fsstayontop не подходит, потому что при показе нескольких форм сразу все они почемуто не отображаються поверх остальных окон. smile


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Romikgy
Дата 16.3.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



по таймеру их поднимать на самый верх
SetWindowPos


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Sunvas
Дата 17.3.2006, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



А без таймера?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Yanis
Дата 17.3.2006, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Если форма с обычным стилем - "поверх всех окон", то всё равно она будет располагаться по правилам Z order (как это по русски?). Поэтому, что бы она была такая как ты хочешь, то её нужно постоянно "подталкивать наверх". Поэтому и в таймере.

Цитата(Sunvas @ 17.3.2006, 08:27 Найти цитируемый пост)
А без таймера?
Делай, кто тебе мешает?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Sunvas
Дата 18.3.2006, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Цитата(Yanis @ 17.3.2006, 08:49 Найти цитируемый пост)
Если форма с обычным стилем - "поверх всех окон", то всё равно она будет располагаться по правилам Z order

Тогда почему если видна одна форма приложения с параметром "певерх всех окон", то все работает, а если уже две (моего приложения), то они могут перекрываться другими окнами (любыми), даже теми, которые не "поверх всех окон"?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Yanis
Дата 19.3.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(Sunvas @ 18.3.2006, 08:26 Найти цитируемый пост)
Тогда почему если видна одна форма приложения с параметром "певерх всех окон", то все работает, а если уже две (моего приложения), то они могут перекрываться другими окнами (любыми), даже теми, которые не "поверх всех окон"?

Такая ситуация может быть лишь в том случае, если ты устанавливаешь fsStayOnTop не у главной формы.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Sunvas
Дата 20.3.2006, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Так как мне сделать "поверх всего" не только главную форму? smile


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Демо
Дата 20.3.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Устанавливаем главной форме:
Код

  FormStyle:=fsNormal;


Интервал таймера - 10мс.

Код

procedure RestoreApp;
var
  hWnd, hCurWnd, dwThreadID, dwCurThreadID: THandle;
  OldTimeOut: Cardinal;
  AResult: Boolean;
begin
    hWnd := Application.Handle;
    SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @OldTimeOut, 0);
    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Pointer(0), 0);
    SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
    hCurWnd := GetForegroundWindow;
    AResult := False;
    while not AResult do
    begin
      dwThreadID := GetCurrentThreadId;
      dwCurThreadID := GetWindowThreadProcessId(hCurWnd);
      AttachThreadInput(dwThreadID, dwCurThreadID, True);
      AResult := SetForegroundWindow(hWnd);
      AttachThreadInput(dwThreadID, dwCurThreadID, False);
    end;
    SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
    SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, Pointer(OldTimeOut), 0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  w: THandle;
  i: Integer;
begin
  w := GetForegroundWindow;
  for i := 0 to Screen.FormCount-1 do
  begin
    if w=Screen.Forms[i].Handle then Exit;
  end;
  RestoreApp;
end;



Это сообщение отредактировал(а) Демо - 20.3.2006, 13:05


--------------------
    
PM MAIL ICQ Skype   Вверх
Sunvas
Дата 21.3.2006, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Мда.. Демо, вот запустил твой код и что? Форма попросту всегда атктивна и "забивает" активность других приложений. Мне же нужно чтобы формы попросту были "поверх остальных окон".
Но все-равно спасибо за пример!


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Демо
Дата 21.3.2006, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Цитата(Sunvas @ 21.3.2006, 08:23 Найти цитируемый пост)
Форма попросту всегда атктивна и "забивает" активность других приложений.


В таком случае нпонятно выражение "Всегда поверх других".


--------------------
    
PM MAIL ICQ Skype   Вверх
Sunvas
Дата 23.3.2006, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Цитата(Демо @ 21.3.2006, 09:40 Найти цитируемый пост)
В таком случае нпонятно выражение "Всегда поверх других".

Мда.. Возьмем к примеру пануль задач - она активна не всегда, но отображается поверх любого активного окна. Или старый добрый Винамп, когда в нем жмем Ctrl-A, то он перестает перекрываться другими окнами...
Вот этот эффект мне нужен, но только не одной главной формы, а для всех форм моего приложения.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Rouse_
Дата 24.3.2006, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



WM_WINDOWPOSCHANGING хочешь ты использовать в качестве нотификации ;)


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Sunvas
Дата 24.3.2006, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Цитата(Rouse_ @ 24.3.2006, 00:28 Найти цитируемый пост)
WM_WINDOWPOSCHANGING хочешь ты использовать в качестве нотификации ;)

Это вопрос или предложение? smile


Это сообщение отредактировал(а) Sunvas - 24.3.2006, 08:32


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Ciber SLasH
Дата 24.3.2006, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 1
Всего: 67



А ShowWindowPos, что не помогает?
Код

  SetWindowPos(Handle, HWND_TOPMOST,
               (GetSystemMetrics(SM_CXSCREEN) - Width) div 2,   // координата X
               (GetSystemMetrics(SM_CYSCREEN) - Height) div 2,  // координата Y
               Width,   // ширина окна
               Height,  // высота окна
               SWP_SHOWWINDOW)


PM   Вверх
Winprogrammer
  Дата 24.3.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 23.3.2006
Где: ::Россия.РСО-Алан ия.Владикавка

Репутация: нет
Всего: нет



Поиграй со свойством FormStyle в паспорте свойств обьекта. smile
Добавлено @ 11:42
Код

procedure Form1.timer1timer(...);
var
       wnd_Handle:HWND;

begin 
 wnd_Handle:=GetActiveWindow;
 SwitchToTheseWindow(wnd_Handle);
end;

--------------------
Я не понял Вашего вопроса, но я Вам на него отвечу…-----------
Uploading файлов без гемороя - это просто!!!
Winprogrammer.ifolder.ru
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Winprogrammer
Дата 24.3.2006, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 23.3.2006
Где: ::Россия.РСО-Алан ия.Владикавка

Репутация: нет
Всего: нет



Предыдущий пример не работает. Попробуй так.

Код

var
      wnd_Handle:HWND;

procedure Form1.Create(...);
begin
 wnd_Handle:=GetActiveWindow;
end;

procedure Form1.timer1timer(...);
begin 
 BringWindowToTop(wnd_Handle);
end;

Надеусь будет работать.
--------------------
Я не понял Вашего вопроса, но я Вам на него отвечу…-----------
Uploading файлов без гемороя - это просто!!!
Winprogrammer.ifolder.ru
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Sunvas
Дата 25.3.2006, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Цитата(Ciber SLasH @ 24.3.2006, 08:59 Найти цитируемый пост)
  SetWindowPos(Handle, HWND_TOPMOST,
              (GetSystemMetrics(SM_CXSCREEN) - Width) div 2,  // координата X
              (GetSystemMetrics(SM_CYSCREEN) - Height) div 2,  // координата Y
              Width,  // ширина окна
              Height,  // высота окна
              SWP_SHOWWINDOW)

Повторяю для тех, кто не понял: для одной формы это работает, но вот уже для двух и более форм моего приложения - НЕТ!


Цитата(Winprogrammer @ 24.3.2006, 12:02 Найти цитируемый пост)
Надеусь будет работать.

Надежда умирает последней... Не работает..



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Sunvas
Дата 6.4.2006, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Вопрос снят. smile


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Демо
Дата 29.4.2006, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 6
Всего: 50



Вот решение:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Idle(Sender: TObject; var Done: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Hide;
  FOrm2.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := Idle;
end;

procedure TForm1.Idle(Sender: TObject; var Done: Boolean);
begin
  if Form2.Showing then SetWindowPos(FOrm2.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE    or SWP_NOSIZE);
end;

end.

 


--------------------
    
PM MAIL ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.