информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
Погорячился 12.12.06 17:47  Число просмотров: 3970
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Масса полезных сведений, может всетаки вы дочитали бы пост
> до конца и так же обстоятельно ответили и на
> мой вопрос. Не могли бы вы поискать и по

Еще раз почитал документацию, способов 100% вытащить свое окно наверх не так уж много. И как по мне это правильно.

> SystemInfoParametrs и дать такой же блестящий и
> исчерпывающий ответ. Я уверен что с вашим уровнем знаний вы
> мне таки поможете.

Скорее всего из-за того, что устанавливать таймаут может только процесс, который может устанавливать foreground ("The calling thread must be able to change the foreground window, otherwise the call fails."). Если процесс и так может поставить foreground window, то ему и SPI_SETFOREGROUNDLOCKTIMEOUT не нужен, если же не может, то поставить таймаут он тоже не может. Во втором случае (с закомментированным восстановлением) работает потому, что первый вызов скорее всего происходит как раз тогда, когда окно процесса - фореграундовое и соответственно процесс может устанавливать фореграундовые окна.

В общем как по мне, если так уж необходимо немедленно донести чего нибудь до пользователя, то лучше использовать topmost попапы, если же просто сказать, что в окне что то происходит, то лучше положиться на виндовое поведение (помигать попапом): к примеру меня очень раздражает, когда какое нибудь окно выскакивает наверх когда я скажем набираю текст.

Для верности SystemParametersInfo первый раз лучше вызывать прямо при создании процесса (в этот момент процесс чаще всего фореграундовый и имеет право ставить таймаут). Восстанавливать при выходе - уродство, но что поделаешь?

Кроме того можно воспользоваться чуть менее уродским, но требующим бОльших прав вызвовом CreateRemoteThread: найти фореграундовый процесс, открыть его, выделить в его адресном пространстве памяти (VirtualAllocEx), записать туда кусок кода для вывода своего окна в фореграунд (WriteProcessMemory), вызвать CreateRemoteThread, подождать окончания работы потока, освободить память, закрыть процесс.
<beginners>
Корявая-корявая SetForegroundWindow 27.11.06 09:33  
Автор: Мак1 Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Вероятно, каждый, кто хотел воспользоваться этой функцией получал не совсем тот результат, на который он рассчитывал. Под вин2000/ХР она не перемещает указанное окно на верх, а лишь заставляет его мигать на панели задач. На нескольких форумах уже обсуждалась эта проблема и даже было найдено решение(довольно страшное, но, как пишут, вполне эффективное). По идее идеальным решением является использование функции SystemParametrsInfo вызываемой с параметрами SPI_GETFOREGROUNDLOCKTIMEOUT и SPI_SETFOREGROUNDLOCKTIMEOUT, однако ее применение не решает всех проблем. У других. У меня все нормально, с одним маааленьким упущением.
Правила хорошего тона требуют: наследил - убери. В принципе я согласен. И люди, которые до меня решали проблему с поднятием окна думали также. Применение SystemParametrsInfo выглядело так:
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT,0,&timeout,0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,0,0);
SetForegroundWindow(Window);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,(void *)timeout,0);
И это работало довольно странным образом. Через раз. Это вселило в меня такое отчаяние, что я решил пойти напролом и закомментил последнюю строку. То есть я сбрасывал таймаут и не восстанавливал его.
Вы не поверите, но все стало работать на ура. Красота. Проблема решена, но мрачные мысли обуревают меня. Возможно ли всетаки восстанавливать значения по умолчанию? Но так чтоб и функция оставалась работоспособной. А с чем связано такое поведение функций? Может на установку системного параметра требуется время? Если у кого есть умные мысли на этот счет не смог бы он ими поделиться?
А документацию читать? 27.11.06 15:21  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Вероятно, каждый, кто хотел воспользоваться этой функцией
> получал не совсем тот результат, на который он рассчитывал.

Вероятно, каждый кто читал MSDN перед вызовом этой функции получал именно тот результат, который ожидал:
"The SetForegroundWindow function puts the thread that created the specified window into the foreground and activates the window. Keyboard input is directed to the window, and various visual cues are changed for the user. The system assigns a slightly higher priority to the thread that created the foreground window than it does to other threads."

> Под вин2000/ХР она не перемещает указанное окно на верх, а
> лишь заставляет его мигать на панели задач. На нескольких

Нигде в MSDN не сказано о "перемещении наверх", не совсем понятно, что заставило Вас ожидать такого от этой функции, ведь в user32 есть еще много замечательных функций для работы с окнами: SetWindowPos, SetActiveWindow и многие другие.
Масса полезных сведений, может всетаки вы дочитали бы пост... 12.12.06 10:24  
Автор: Мак1 Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Масса полезных сведений, может всетаки вы дочитали бы пост до конца и так же обстоятельно ответили и на
мой вопрос. Не могли бы вы поискать и по SystemInfoParametrs и дать такой же блестящий и исчерпывающий ответ. Я уверен что с вашим уровнем знаний вы мне таки поможете.
Погорячился 12.12.06 17:47  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Масса полезных сведений, может всетаки вы дочитали бы пост
> до конца и так же обстоятельно ответили и на
> мой вопрос. Не могли бы вы поискать и по

Еще раз почитал документацию, способов 100% вытащить свое окно наверх не так уж много. И как по мне это правильно.

> SystemInfoParametrs и дать такой же блестящий и
> исчерпывающий ответ. Я уверен что с вашим уровнем знаний вы
> мне таки поможете.

Скорее всего из-за того, что устанавливать таймаут может только процесс, который может устанавливать foreground ("The calling thread must be able to change the foreground window, otherwise the call fails."). Если процесс и так может поставить foreground window, то ему и SPI_SETFOREGROUNDLOCKTIMEOUT не нужен, если же не может, то поставить таймаут он тоже не может. Во втором случае (с закомментированным восстановлением) работает потому, что первый вызов скорее всего происходит как раз тогда, когда окно процесса - фореграундовое и соответственно процесс может устанавливать фореграундовые окна.

В общем как по мне, если так уж необходимо немедленно донести чего нибудь до пользователя, то лучше использовать topmost попапы, если же просто сказать, что в окне что то происходит, то лучше положиться на виндовое поведение (помигать попапом): к примеру меня очень раздражает, когда какое нибудь окно выскакивает наверх когда я скажем набираю текст.

Для верности SystemParametersInfo первый раз лучше вызывать прямо при создании процесса (в этот момент процесс чаще всего фореграундовый и имеет право ставить таймаут). Восстанавливать при выходе - уродство, но что поделаешь?

Кроме того можно воспользоваться чуть менее уродским, но требующим бОльших прав вызвовом CreateRemoteThread: найти фореграундовый процесс, открыть его, выделить в его адресном пространстве памяти (VirtualAllocEx), записать туда кусок кода для вывода своего окна в фореграунд (WriteProcessMemory), вызвать CreateRemoteThread, подождать окончания работы потока, освободить память, закрыть процесс.
офф 12.12.06 17:52  
Автор: ZloyShaman <ZloyShaman> Статус: Elderman
<"чистая" ссылка>
> к примеру меня очень раздражает, когда
> какое нибудь окно выскакивает наверх когда я скажем набираю
> текст.
Меня тоже. Может можно чего-нибудь в реестре поменять, чтобы все окна, которые так делают, они бы выскакивали, но фокус не принимали. Не хочется для этого ставить каких-нибудь десктоп-менеджеров.
Я вообще ковырял не только доки, но и исходники 12.12.06 20:21  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> > к примеру меня очень раздражает, когда
> > какое нибудь окно выскакивает наверх когда я скажем
> набираю
> > текст.
> Меня тоже. Может можно чего-нибудь в реестре поменять,
> чтобы все окна, которые так делают, они бы выскакивали, но

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

Есть всякие фрические методы, которые тут приведены. Есть еще позиционирование окна над HWND_TOPMOST, но за такое я скорее вообще откажусь от приложения, чем буду пробовать научить его хорошим манерам. Кстати, я раньше не задумывался, но чаще всего левое окно выскакиевает, когда я работаю с многооконным приложением: процесс один, а окон куча.

Процесс, которому принадлежит фореграундовое окно сам считается фореграундовым и может тащить свои (прошу отметить: только свои) окна наверх из любого своего треда. По идее это недоделки самого приложения. В том же explorer-е можно настроить открытие новых окон в новом процессе. В опере - не нашел.

> фокус не принимали. Не хочется для этого ставить
> каких-нибудь десктоп-менеджеров.
А вот к примеру 28.12.06 18:24  
Автор: ZloyShaman <ZloyShaman> Статус: Elderman
<"чистая" ссылка>
У меня открыт (и активвен) файрфокс. Вылетает окно виндоус апдтей "Перезагрузить компьютер". И это окно активным становится, принимает ввод. Т.е. если я нажму Alt+L или Alt+N, то действие выполнится.
Я вот об этом.
Про оперу: по умолчанию фоновое открытие навешено на среднюю кнопку мыши. 13.12.06 01:10  
Автор: Fighter <Vladimir> Статус: Elderman
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach