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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SetForegroundWindow неправильно раб. в W7 
V
    Опции темы
Alexeyt
Дата 14.10.2010, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SetForеgroundWindow(Self.HAndle) - при работе в W7 пара раз работает
(окно появляется), потом перестает (окно мигает в taskbar, но
не появляется). что можно сделать? В XP - работает нормально.
PM WWW   Вверх
CodeMonkey
Дата 14.10.2010, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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





--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Illusion Dolphin
Дата 25.10.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

procedure ActivateBackgroundApplication(hWnd : THandle);
var
  hCurWnd, dwThreadID, dwCurThreadID: THandle;
  OldTimeOut: Cardinal;
  AResult: Boolean;
begin
  Application.Restore;
  ShowWindow(hWnd,SW_RESTORE);
  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);
  ShowWindow(Application.MainForm.Handle,SW_HIDE);
  ShowWindow(Application.Handle,SW_HIDE);
end;


CodeMonkey, иногда это всё же надо smile Пример - программа уже запущена, свёрнута. Пользователь берёт и нажимает на раб. столе на иконку и запускает вторую копию. А хорошо бы старую развернуть. 
P.S. Главное - не злоупотреблять!



--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Alexeyt
Дата 25.10.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно и так, но я через Application.Minimize/Restore сделал.


PM WWW   Вверх
CodeMonkey
Дата 26.10.2010, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Illusion Dolphin @  25.10.2010,  18:06 Найти цитируемый пост)
иногда это всё же надо


И для указанного вами случая есть волшебная функция AllowSetForegroundWindowЗапускаемый процесс имеет право на SetForegroundWindow и он может передать это право своей предыдущей копии (кроме того, право на SetForegroundWindow даётся нажатием горячей клавиши).

Всё. Одна функция - и никаких хаков, полностью документированное и работоспособное решение.

Добавлено @ 00:31
В коде 

Код
AttachThreadInput(dwCurrentThread, dwFGThread, TRUE);
SetForegroundWindow(hwnd); 
AttachThreadInput(dwCurrentThread, dwFGThread, FALSE);


Вызов SetForegroundWindow может иногда зависать. Ваше домашнее задание - объяснить почему.

Это сообщение отредактировал(а) CodeMonkey - 1.12.2010, 06:26


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
robt
Дата 26.10.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



кстати в винде есть опция которая включает именно мигание кнопки а не всплывание окна
и тогда "иногда это всё же надо" уже идет лесом
PM MAIL   Вверх
Illusion Dolphin
Дата 28.10.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



CodeMonkey, Очень элегантное решение! Странно, что функция не определена в делфи (видимо это связано с совместимостью?). Кстати, обе ссылки идут за 2009\2010 год, а решения с "хаками" датируются на несколькими годами раньше. 

На счёт "домешнего задания" smile Предположу что дело в потенциальном несоответствии потоков (вызывающего процедуру и foreground - как пример - http://www.codeproject.com/Tips/76427/How-...roundWindo.aspx ). Если это не так - буду рад хотя бы за ссылкус разъяснением  smile 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Alexeyt
Дата 28.10.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(robt @  26.10.2010,  12:47 Найти цитируемый пост)
кстати в винде есть опция которая включает именно мигание кнопки а не всплывание окна


Просьба пользовать запятые. если опция включена, то поль-ль сам так захотел, и ничего тут делать не надо.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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