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

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

GetWindow [D7, WinXP]


Хам ©   (2006-08-15 09:51:00) 

Мне нужно что бы из моей програмы при определёной ситуации, другой програме посылался сигнал о том что програму надо вывести на поверх всех окон. Делаю так
dwin:=GetWindow(dwin,GW_HWNDNEXT);
dwin - дескриптор приложения которое надо вывести по верх всех окон
Дело в том что приложение выводиться по верх всех окон, только в том случае если оно минимизировано, а если оно просто закрыто другой формой то данная функция не работает.

Как сделать так что бы приложени выходило на передней план в любом случае ?


Rater1   (2006-10-02 15:52:00) [1]

если родитель - рабочий стол, то окно и вывалится поверх всех!
Вот так:

private
   { Private declarations }
   procedure CreateParams(var Params: TCreateParams); override;

//.....

procedure TfrmMsg.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.WndParent := GetDesktopWindow;
end;


PC Maniac   (2006-09-29 17:37:00) [2]


> еще во всех версиях Win есть функция SwitchToThisWindow()
> правда недокументированная.

А стоит ли пользоваться недокументированными функциями? Особенно, если разрабатывается коммерческое приложение? Ведь никто не сможет поручится, что все эти функции будут в следующих версиях операционной системы. Следовательно, использование недокументированных функций жестко привязывает Ваше приложение к конкретной платформе, что в большинстве случаев является отрицательным фактором.


DVM   (2006-09-29 17:09:00) [3]


> Однако, можно все же в Win2k и выше заставить эту функцию
> работать как и в Win9x.

еще во всех версиях Win есть функция SwitchToThisWindow() правда недокументированная.


PC Maniac   (2006-09-29 17:05:00) [4]


> GrayFace ©   (08.09.06 19:03) [7]
> За собой прибирать надобно. В начале помощью GET запоминать,
>  в конце восстанавливать.

Данные функции я использовал при написании POS-терминала, на котором физически отсутствовала мышь и стояла программируемая клавиатура с отсутствующими системными клавишами Windows, так что потеря фокуса была равнозначна остановке терминала и, следовательно, прекращению продаж. В данном случае, мне было важнее обеспечить постоянность фокуса на необходимом элементе управления. Так что "прибирать за собой" надобно далеко не всегда. Кроме того, те три строчки кода, которые я вставил в предыдущий комментарий показывают лишь пример возможного использования данных функций и не претендуют на что-либо большее. Писать за автора вопроса код я не собираюсь. Так что столь категоричное высказывание с Вашей стороны было опрометчивым.

> Вообще, SetForegroundWindow работает по старому, если вызвана
> из потока активного окна.

Что касается использования API для управления фокусом ввода (либо чем-то подобным) в пределах своего приложения, мне кажется, что, в ряде случаев, использовать стандартные методы Delphi (SetFocus, например) правильнее. Хотя бы с точки зрения возможной кросс-платформенности.


GrayFace   (2006-09-08 19:03:00) [5]

PC Maniac   (06.09.06 14:24) [6]
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDWININICHANGE and SPIF_UPDATEINIFILE);
AHwnd := Screen.ActiveForm.Handle;
SetForegroundWindow(AHwnd);

За собой прибирать надобно. В начале помощью GET запоминать, в конце восстанавливать.
Вообще, SetForegroundWindow работает по старому, если вызвана из потока активного окна.

Хам
Дак как ты GetWindow используешь? Его хотя бы имеет смысл заменить на EnumWindows.


PC Maniac   (2006-09-06 14:24:00) [6]

Есть такая функция SetForegroundWindow. Ей можно пользоваться, если известен хэндл окна. В Win9х она выводит окно на передний план и передает ему фокус ввода. В Win2k и выше эта функция приводит только к миганию заголовка приложения, содержащего окно в панели задач. Однако, можно все же в Win2k и выше заставить эту функцию работать как и в Win9x. Для этого следует воспользоваться функцией SystemParametersInfo.
Более подробную информацию Вы сможете получить в MSDN, сделав поиск по ключевым словам SystemParametersInfo, SetForegroundWindow, FindWindow, GetForegroundWindow

Вот пример кода:
 SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, SPIF_SENDWININICHANGE and SPIF_UPDATEINIFILE);
 AHwnd := Screen.ActiveForm.Handle;
 SetForegroundWindow(AHwnd);


Хам   (2006-08-16 09:23:00) [7]

Ой извените не то я написал )) Вот код вывода приложения

ShowWindow(dwin, SW_SHOWNORMAL);
BringWindowToTop(dwin);


DeadMeat   (2006-08-16 08:46:00) [8]

Шота я не сообразил, как ты его выводишь на передний план.
Через GetWindow ?


Хам   (2006-08-16 08:00:00) [9]

что никто не знает ?


Хам   (2006-08-15 10:46:00) [10]

Мне нужно что бы приложение активировалось именно с определённым хендлом, по названию не получиться, так как может возникнуть ситуация что в системе может быть запущено несколько приложений с одинаковым названием.


Чапаев   (2006-08-15 10:05:00) [11]

findwindow используй


Наверх

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