Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить полноэкранный режим, Полноэкранный режим в системе 
V
    Опции темы
MadCoder
Дата 29.9.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Приветствую!

Как определить, что система (не обязательно моя программа) находится в полноэкранном режиме - например, пользователь смотрит фильм или играет во что-то...
PM WWW ICQ   Вверх
Alix
Дата 29.9.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

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



Имхо отлавливать изменение размеров окон приложений и если равны размеру экрана, то значит полноэкранный.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
BaD_SeCt0R
Дата 29.9.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


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

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



Цитата(Alix @  29.9.2007,  18:39 Найти цитируемый пост)
Имхо отлавливать изменение размеров окон приложений и если равны размеру экрана, то значит полноэкранный. 

Не полноэкранный, а максимизированный.


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
MadCoder
Дата 30.9.2007, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не, мне именно полноэкранный нужен, чтобы отлавливать игры и проигрывание видео... По идее просто, взять активное окно и проверить его статус, кто нить писал подобное?
PM WWW ICQ   Вверх
Alix
Дата 30.9.2007, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

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



Цитата
Не полноэкранный, а максимизированный. 

я имел в виду client area окна, значит полноэкранный. 
полноэкранный режим это не какое-то особое состояние окна, а просто когда оно распахнуто на весь экран.

Цитата
10. Как переключиться в OpenGL в полноэкранный режим?

В самом OpenGL такая возможность отсутствует. В качестве решения проблемы можно порекомендовать смену разрешения рабочего стола или/и его глубины функцей ChangeDisplaySettings(), а затем создание окна на весь экран с флагом WS_EX_TOPMOST функцией CreateWindowEx().


Это сообщение отредактировал(а) Alix - 30.9.2007, 07:41


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
BaD_SeCt0R
Дата 30.9.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


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

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



Цитата(Alix @  30.9.2007,  07:32 Найти цитируемый пост)
я имел в виду client area окна, значит полноэкранный. 

Код

BorderStyle:=bsNone;
WindowState:=wsMaximized;


Добавлено через 1 минуту и 21 секунду
Тут уж нужно, наверно CreateDevice отлавливать...


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
Snowy
Дата 1.10.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Нужно просто взять ForegroundWindow, взять его размеры и сравнить с размерами экрана.
PM MAIL   Вверх
MadCoder
  Дата 9.10.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашел рабочий код:
Код

function IsFullScreenMode: Boolean;
var
 w, h : Integer; 
 Hndl : HWND; 
 rcWindow: TRect; 
begin 
 w := GetSystemMetrics(SM_CXSCREEN);
 h := GetSystemMetrics(SM_CYSCREEN); 
 Hndl := 0;  
 Hndl := FindWindowEx(0, Hndl, nil, nil); 
 while (Hndl>0) do begin 
   if (GetWindowLong(Hndl, GWL_EXSTYLE) AND WS_EX_TOPMOST)>0 then begin 
    GetWindowRect(Hndl, rcWindow); 
    if ((w = (rcWindow.right - rcWindow.left)) AND 
     (h = (rcWindow.bottom - rcWindow.top))) then begin 
       Result:= true; 
       Exit; 
     end; 
   end; 
   Hndl := FindWindowEx(0, Hndl, nil, nil) 
 end; 
 Result := false; 
end;

PM WWW ICQ   Вверх
Snowy
Дата 9.10.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Ну об этом я и говорил.
Только брать нужно не через FindWindowEx, а, как я указал ранее, GetForegroundWindow и сравнивать его не с GetSystemMetrics, а с размерами экрана, на котором оно запущено.
Ибо данный пример написан для систем только с одним монитором. А таких с каждым днём становится меньше...
PM MAIL   Вверх
MadCoder
Дата 9.10.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

function IsFullScreenMode: Boolean;
var
 Hndl : HWND;
 rcWindow: TRect;
begin
 Hndl := 0;
 Hndl := GetForegroundWindow;
 while (Hndl>0) do begin
   if (GetWindowLong(Hndl, GWL_EXSTYLE) AND WS_EX_TOPMOST)>0 then begin
    GetWindowRect(Hndl, rcWindow);
    if ((Screen.Width = (rcWindow.right - rcWindow.left)) AND
     (Screen.Height = (rcWindow.bottom - rcWindow.top))) then begin
       Result:= true;
       Exit;
     end;
   end;
   Hndl := FindWindowEx(0, Hndl, nil, nil)
 end;
 Result := false;
end;


Второй вопрос: а как сделать так, чтобы не отлавливало, если это скринсейвер?
PM WWW ICQ   Вверх
Snowy
Дата 9.10.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Код

function ScreenSaverRunning: Boolean;
var
  status: Bool;
begin
  SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, @status, 0);
  Result := status = True;
end;

PM MAIL   Вверх
Alix
Дата 9.10.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

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



Цитата
Result := status = True;

так ли это необходимо?

MadCoder, имхо ты делаешь не так, как сказал Snowy. Надо так:
1. берешь его код для определения мониторов
2. получаешь окно с помощью GetForegroundWindow
3. сравниваешь его размеры и координаты со всеми мониторами в списке
не надо FindWindowEx(0, Hndl, nil, nil), и все делать в цикле, foreground window только одно может быть. Хотя, кстати, может и не быть, так что неплохо бы сделать проверку возвращаемого GetForegroundWindow значения на nil. 

Вот только есть один момент. Если на одном мониторе что-то работает в полноэкранном режиме, а на другом открыт, скажем, блокнот и он активен, то такой вариант ведь не покатит. Получается что надо все-таки проходится по всем окнам. Или нет?


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

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


 




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


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

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