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

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

Как сделать окно активным. [D7]


Страницы:   1 2 3

Nikfel ©   (2007-06-21 17:28:00) 

Подскажите как вывести на передний план чужое окно, зная его handl c помощью функции FindWindow.


Anatoly Podgoretsky   (2007-06-22 00:11:00) [21]

> Инс  (22.06.2007 00:06:38)  [38]

Те мои пользователи, которые использую ICQ - отключили этот поплавок, поскольку работать не возможно, только начинаешь бить текст как он всплывает и уже дальше бьешь в нем.

Будильник, а кто сказал что он должен всплывать а не сигнализировать другим способом, для этого существует область оповещений и ballon hints, которые как раз и изобрели, что бы избежать проблем поплавка.

Пока ни один приведеный довод не убедил.


Инс   (2007-06-22 00:06:00) [22]


> Ровно 3, считаем:


Хм.. Что ж, тут посыпаю голову пеплом. В этой ситуации действительно отделаемся простым SetForegroundWindow. Но я ведь приводил еще два примера - будильник и ICQ. Комментируйте...


Leonid Troyanovsky   (2007-06-22 00:05:00) [23]


> Инс   (21.06.07 23:46) [33]


> Я Вам Рихтера процитирую, ладно.

Да я с ним и не спорил :)

> А от себя добавлю, что с помощью AttachThreadinput можно
> заставить два потока совместно использовать одну очередь
> ввода.

Ну, хорошо, приаттачься своим потоком, скажем, к Блокноту
и заставь его OnKeyDown ;) на нажатие к-л клавиши в ем.

Можешь и в msdn заглянуть, ради любопытства.

--
Regards, LVT.


Инс   (2007-06-21 23:57:00) [24]


> Давай порассуждаем. Предположим, что некто разработал
> систему, основанную на правилах MS, а некий код пробивает
> в оных брешь. После любого иска к MS (ведь захватом чужого
> фокуса легко нанести этой системе вред) последние эту брешь
> обязательно заткнут, бо такова политика.


Вот в этом фрагменте готов подписаться под каждым словом. Вот только трюк с AttachThreadInput ничему не противоречит, это вполне документированное поведение. Для меня это очевидно. Насчет трюка с SendInput я такого утверждать не могу, пока не разберусь, как это работает. Возможно это "фича", которую скоро заткнут. Нет плохих функций, есть плохие программы и плохие программисты, которые неправильно используют системные механизмы. Нужно править руки тех, кто пишет плохие программы, а не затыкать сомнительные дыры. Я приводил примеры, где эти трюки могут пойти во благо, но если ими злоупотреблять, то это разумеется вред.


Leonid Troyanovsky   (2007-06-21 23:56:00) [25]


> Инс   (21.06.07 23:35) [32]

> второй из первой не писал! Вот только при активации первой
> из второй, как МЫ предлагаем, без дополнительных ухищрений,
>  ни одно условие не соблюдается? Вы не согласны? Если не
> согласны, то какое соблюдается?

Ровно 3, считаем:

Вторая же - является таковой по закону, бо запущена by the foreground
process (Explorer) - раз

который, в свою очередь, был таковым благодаря
received the last input event (меню). - два

и три: запущенная проводником копия, являясь foreground,
может делать SFGW по первому пункту.

--
Regards, LVT.


Leonid Troyanovsky   (2007-06-21 23:47:00) [26]


> DVM ©   (21.06.07 22:59) [28]

> Вот 100% рабочий код.

Любой сегодня работающий код на эту тему
уже завтра станет неработающим.

Давай порассуждаем. Предположим, что некто разработал
систему, основанную на правилах MS, а некий код пробивает
в оных брешь. После любого иска к MS (ведь захватом чужого
фокуса легко нанести этой системе вред) последние эту брешь
обязательно заткнут, бо такова политика. Скорее даже
это произойдет еще до иска, достаточно обсуждений в usenet :)

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

--
Regards, LVT.


Инс   (2007-06-21 23:46:00) [27]

Да, с SendInput возможно погорячился... Что ж, останется пока загадкой. А насчет

> Пусть так, но уж никак не "Процесс подключен (?) к очереди
> ввода"


Я Вам Рихтера процитирую, ладно.

...Чтобы прекратить всю эту неразбериху, Microsoft сделала SetForegroundWindow чуть поумнее. В частности, эта функция срабатывает, только если вызывающий поток уже подключен к RIT или если поток, связанный с RIT R данный момент, не получал ввода на протяжении определенного периода (который задается функцией System ParametersInfo и значением SPI_SETFOREGROUNDLOCKTIMEOUT)

А от себя добавлю, что с помощью AttachThreadinput можно заставить два потока совместно использовать одну очередь ввода.


Инс   (2007-06-21 23:35:00) [28]


> Очевидно, что я читал его более внимательно, чем ты [24].


Тогда чего вы пишите "А не надо пытаться активировать вторую копию из non-foreground первой." Я ничего про активирование второй из первой не писал! Вот только при активации первой из второй, как МЫ предлагаем, без дополнительных ухищрений, ни одно условие не соблюдается? Вы не согласны? Если не согласны, то какое соблюдается?


Leonid Troyanovsky   (2007-06-21 23:35:00) [29]


> Инс   (21.06.07 22:58) [27]

> Хотя вот оно что! Если переводить буквально "процесс получил
> последним событие ввода", то это еще и объясняет трюк с

Пусть так, но уж никак не "Процесс подключен (?) к очереди ввода"

Только ничего это не объясняет, бо SI пошлет ввод foreground
процессу, а не вызывающему SFGW.

Есть на этом пути некое продолжение, но, рассказывать о нем я
не буду (почему аргументировал), могу лишь предложить
в качестве домашнего задания.
Но, в любом случае, оно должно оставаться академическим решением.

--
Regards, LVT.


Leonid Troyanovsky   (2007-06-21 23:26:00) [30]


> Инс   (21.06.07 22:53) [26]

> Я вообще-то говорил наоборот - активировать первую из второй,
>  а вторую - закрывать. Перечитайте мое сообщение [18] еще

Очевидно, что я читал его более внимательно, чем ты [24].
Активировать надо первую, а вторую - закрывать.
Тогда все получится в соответствии с условиями.
Тем более, что такого есть полезного у свежепущенной
копии, кроме, возможно, ее комстроки.

--
Regards, LVT.


Инс   (2007-06-21 23:05:00) [31]


> Основной недостаток сообщения не всплывают, а лазить по
> ним и смотреть не изменились ли нет желания.


Так есть же отслеживание по RSS. В прочем, Вы правы, сами вопросы ничем не отличаются, разве что откровенный мусор, благодаря предмодерации, все же на форум не попадает. Ну да ладно, не это главное. Подобные ресурсы любят за атмосферу, общение с близкими по духу людьми, да за многое!


DVM   (2007-06-21 22:59:00) [32]

Вот 100% рабочий код.


function ForceForegroundWindow(hWnd: HWND): BOOL;
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


Еще есть недокументированная функция SwitchToThisWindow(), которой пользуется сама MS.


Инс   (2007-06-21 22:58:00) [33]

Хотя вот оно что! Если переводить буквально "процесс получил последним событие ввода", то это еще и объясняет трюк с SendInput. Теперь точно все понятно, по крайней мере для меня. Такое поведение документировано, а значит, ничего преступного в трюке нет.


Инс   (2007-06-21 22:53:00) [34]


> А не надо пытаться активировать вторую копию из non-foreground
> первой.


Я вообще-то говорил наоборот - активировать первую из второй, а вторую - закрывать. Перечитайте мое сообщение [18] еще раз.


> Ты привел код, ну и доказывай его работоспособность.


Что ж, еще раз. Перевожу MSDN. Всплыть может только в одном из следующих случаев.
- Окно принадлежит foreground-процессу
- Окно принадлежит процессу, чей родитель foreground-процесс
- Процесс подключен к очереди ввода
- Нет foreground-процесса
- Foreground-процесс отлаживается
- Foreground-процесс не заблокирован с пом.  LockSetForegroundWindow
- Истек таймаут блокировки Foreground
Мой первый код выполняет условие из пункта, выделенного жирным. Что еще объяснить?


Leonid Troyanovsky   (2007-06-21 21:51:00) [35]


> Инс   (21.06.07 20:37) [17]

> > Код нерабочий...

> спора, так как некоторые просто не хотят слушать собеседника,
>  проверять его аргументы

Ты привел код, ну и доказывай его работоспособность.
В качестве контраргумента я привел выдержку из msdn.
Очевидно, что первое противоречит второму.

Про выводы мне судить трудно, хотя, и доказательства
первого представляются мне весьма непростыми, особенно
в условиях  пренебрежения вторым.

--
Regards, LVT.


Leonid Troyanovsky   (2007-06-21 21:38:00) [36]


> Инс   (21.06.07 20:43) [18]

> текст в MS Word. Потом берет - и из меню запускает вторую
> копию MyCoolProg. Теперь нам нужно из второй копии найти
> первую и поместить поверх всего, а вторую - закрыть. Окно
> первой копии будет заблокировано, так как по первым двум
> пунктам - оно не принадлежит foreground-process (вторая
> копия) и процесс первой копии не создан foreground-process-
> ом.

А не надо пытаться активировать вторую копию из non-foreground первой.
Вторая же - является таковой по закону, бо запущена by the foreground
process (Explorer), который, в свою очередь, был таковым благодаря
received the last input event (меню).

>умный не тот, кто много знает, а тот, кто умеет найти информацию и воспользоваться ей.

Изволь :)

--
Regards, LVT.


Anatoly Podgoretsky   (2007-06-21 21:04:00) [37]

> Инс  (21.06.2007 20:55:22)  [22]

Я попробовал в свое время активно там работать - не понравилось. Основной недостаток сообщения не всплывают, а лазить по ним и смотреть не изменились ли нет желания. Это единственная причина. Сами вопросы ничем не отличаются от других форумов - даже пред модерирование не помогает.


Инс   (2007-06-21 20:55:00) [38]

Вижу Вас иногда, по Вашим статьям с Indy знакомился ;)


Anatoly Podgoretsky   (2007-06-21 20:47:00) [39]

> Инс  (21.06.2007 20:45:20)  [20]

Захожу иногда, пишу редко.


Инс   (2007-06-21 20:45:00) [40]


> Пока, пока, передумает - заходите в гости.


Я вообще-то про этот топик говорю. А насчет в гости... вы к нам тоже на delphikingdom чаще заглядывайте ;)


Страницы:   1 2 3

Наверх

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