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-21 20:43:00) [41]

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

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


Инс   (2007-06-21 20:43:00) [42]


> см. [13] первые два пункта ограничений.


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


Инс   (2007-06-21 20:37:00) [43]


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


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


Leonid Troyanovsky   (2007-06-21 20:32:00) [44]


> Инс   (21.06.07 19:39) [12]

> О! Еще пример, когда можно воспользоваться этим способом:
>  запускается второй экземпляр приложения, при этом нужно
> не допустить повторного запуска, а найти окно предыдущего
> экземпляра и поместить его наверх.

Эта другая песня, здесь ничего нарушать не надо,
см. [13] первые два пункта ограничений.

--
Regards, LVT.


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

Я это читал :) И? На что я должен обратить внимание? И почему? Что из написанного в MSDN противоречит моим словам?
Кстати,

> которые некоторым следовало бы выучить наизусть

Наизусть учить SDK - бред (Вы первые начали употребление таких слов). Но я этим не ограничусь, а приведу аргумент, который и так, думаю, Вам известен. Умный не тот, кто много знает, а тот, кто умеет найти информацию и воспользоваться ей.


Leonid Troyanovsky   (2007-06-21 20:29:00) [46]


> Инс   (21.06.07 19:37) [11]

> не рабочий? Если да, то вы объективно неправы. Жаль что
> не хотите проверять, ну да ладно, это Ваше дело, я не буду
> настаивать ;) А если вы утверждаете, что код рабочий, но
> вот делать так категорически не надо, то тут частично соглашусь.

Код нерабочий, а методы бесполезные (вредные).
Ранее здесь уже частично объяснял.

--
Regards, LVT.


Leonid Troyanovsky   (2007-06-21 20:25:00) [47]


> Инс   (21.06.07 19:13) [8]

> Хм, о чем это Вы? Даже специально залез в MSDN, ничего особенного
> в remarks не нашел.

Remarks

Starting with Microsoft Windows 98 and Windows 2000, the system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:

The process is the foreground process.
The process was started by the foreground process.
The process received the last input event.
There is no foreground process.
The foreground process is being debugged.
The foreground is not locked (see LockSetForegroundWindow).
The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).

--
Regards, LVT.


Инс   (2007-06-21 19:39:00) [48]

О! Еще пример, когда можно воспользоваться этим способом: запускается второй экземпляр приложения, при этом нужно не допустить повторного запуска, а найти окно предыдущего экземпляра и поместить его наверх.


Инс   (2007-06-21 19:37:00) [49]

Вообще, не понимаю, о чем мы спорим? Вы считаете, что код не рабочий? Если да, то вы объективно неправы. Жаль что не хотите проверять, ну да ладно, это Ваше дело, я не буду настаивать ;) А если вы утверждаете, что код рабочий, но вот делать так категорически не надо, то тут частично соглашусь. Почему частично, я уже объяснял в [9]


Nikfel   (2007-06-21 19:33:00) [50]

Спасибо функция SetForegroundWindow работает. Остольное пока не проверял.


Инс   (2007-06-21 19:17:00) [51]


> Как, впрочем, и нет пользы в подобных методах


Не скажите. Ни кому не нравится просыпаться утром от звука будильника, но тем не менее, все понимают, что он нужен ;) Это я к чему. В каких-нибудь органайзерах-будильниках, порой нужно, чтобы окно нагло влезло несмотря ни на что, иначе пользователь может его просто не заметить. Или, например, ICQ пользуетесь? Там окошки с сообщением тоже всплывают, когда ICQ неактивно.


Инс   (2007-06-21 19:13:00) [52]


> Во-первых, не надо на меня кричать


Да я не на Вас кричу, Вы мне ничего плохого не сделали. Если у Вас сложилось такое впечатление, то искренне прошу прощения. Это крик души ;)


> Во-вторых, AFGW здесь причем только поскольку
> в msdn в статье ей посвященной есть перечень ограничений,
> которые некоторым следовало бы выучить наизусть.


Хм, о чем это Вы? Даже специально залез в MSDN, ничего особенного в remarks не нашел.


> Рихтер-то тут причем? Он подобным всплытием, слава Богу,
>
> не страдает


Там достаточно подробно описано работы всплывающих окон.


> Возможно, что SFGW просто спутана, скажем, с SetFocus.


Брр. Не понял, что с чем спутано? В первом коде мы получаем foreground-окно, идентификатор потока, который его создал, и подключаем нашу очередь виртуального ввода к нему. Таким образом, наш поток становится подключенным к очереди виртуального ввода. Она только одна, и ей обладает поток верхнего уровня (Foreground Thread). Теперь всплывающие окна нашего потока не будут заблокированы. А причем тут SetFocus? Он фокусом ввода управляет, а фокус у каждого потока свой (в отличие от очереди виртуального ввода, которая только одна)


Leonid Troyanovsky   (2007-06-21 18:54:00) [53]


> Инс   (21.06.07 18:21) [4]

> Тыщу раз использовал! Не верите - проверьте.

Даже пробывать не буду, бо бред.

Вот, допустим, я узнал некий бронебойный метод.
Но, если я про него буду везде рассказывать, то стану
нарушителем конвенции, и, кроме того, вынужу
MS залатать оную дыру.
Т.е., никакой пользы в расспространении подобных знаний нет.
Как, впрочем, и нет пользы в подобных методах :)

--
Regards, LVT.


Leonid Troyanovsky   (2007-06-21 18:47:00) [54]


> Инс   (21.06.07 18:21) [4]

> ПРИЛОЖЕНИЕ ДОЛЖНО ВЫЗЫВАТЬ ALLOWFOREGROUNDWINDOW!!!

Во-первых, не надо на меня кричать, я и не собирался
преступным путем вытаскивать левые окна foreground.

Во-вторых, AFGW здесь причем только поскольку
в msdn в статье ей посвященной есть перечень ограничений,
которые некоторым следовало бы выучить наизусть.

> Рихтера почитайте, тогда ясно будет. Всплывать может только

Рихтер-то тут причем? Он подобным всплытием, слава Богу,
не страдает.

>  А в первом коде мы искуственно подключам наш поток к нему.

Возможно, что SFGW просто спутана, скажем, с SetFocus.

--
Regards, LVT.


Инс   (2007-06-21 18:30:00) [55]


> окно потока, подключенного к очереди клавиатурного ввода


Иногда можно еще встретить термин Foreground Thread


Инс   (2007-06-21 18:21:00) [56]


> В печь ее

Десятый раз отвечаю на подобный вопрос, и всегда говорил, что это не хорошо. Повторю еще раз: ПО ХОРОШЕМУ, ЧУЖОЕ ПРИЛОЖЕНИЕ ДОЛЖНО ВЫЗЫВАТЬ ALLOWFOREGROUNDWINDOW!!!


> Во-первых, не ясно и с первым


Рихтера почитайте, тогда ясно будет. Всплывать может только окно потока, подключенного к очереди клавиатурного ввода. А в первом коде мы искуственно подключам наш поток к нему.


> непонятно, почему известно, что он работает

Тыщу раз использовал! Не верите - проверьте.


Leonid Troyanovsky   (2007-06-21 18:13:00) [57]


> Инс   (21.06.07 17:34) [2]

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

В печь ее [проф. Преображенский].

> И даже такой, хотя если с предыдущим все ясно, то с этим
> непонятно, почему он работает.

Во-первых, не ясно и с первым, а,  во-вторых,
непонятно, почему известно, что он работает.

--
Regards, LVT.


Инс   (2007-06-21 17:34:00) [58]

В дополнение. Начиная с Windows 2000 введена блокировка всплывающих окон. Если пользователь работает с чужим приложением, то ваше не всплывет, а будет мигать на панели задачь. если несмотря ни на что вы хотите, чтобы ваше окно всплыло поверх других, то есть пару трюков. По хорошему, нужно, чтобы чужое приложение вызывало AllowForegroundWindows, но сработает и такой код:
function ForceForegroundWindow(Wnd:HWND):Boolean;
var
 ForegroundWnd:HWND;
 ActiveThread,WndThread:DWORD;
 Attached:Boolean;
begin
 ForegroundWnd:=GetForegroundWindow;
 Attached:=False;
 if ForegroundWnd<>0 then begin
   ActiveThread:=GetWindowThreadProcessId(ForegroundWnd,nil);
   WndThread:=GetWindowThreadProcessId(Wnd,nil);
   if ActiveThread<>WndThread then
     Attached:=AttachThreadInput(WndThread,ActiveThread,True)
 end;
 Result:=SetForegroundWindow(Wnd);
 if Attached then AttachThreadInput(WndThread,ActiveThread,False);
end;


И даже такой, хотя если с предыдущим все ясно, то с этим непонятно, почему он работает.

function ForceForegroundWindow(Wnd:HWND):Boolean;
var
 Input:TInput;
begin
 FillChar(Input,SizeOf(Input),0);
 SendInput(1,Input,SizeOf(TInput));
 Result:=SetForegroundWindow(Wnd);
end;


Инс   (2007-06-21 17:29:00) [59]

SetForegroundWindow


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

Наверх

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