Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.11;
Скачать: CL | DM;

Вниз

Детектор полноэкранных окон   Найти похожие ветки 

 
demon ©   (2008-08-17 18:55) [0]

Как отследить что какое-небудь чужое приложени перешло в полноэкранный режим?
Узнавать какое именно приложение не нужно.


 
Anatoly Podgoretsky ©   (2008-08-17 19:30) [1]

> demon  (17.08.2008 18:55:00)  [0]

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


 
DVM ©   (2008-08-17 19:43) [2]


> Как отследить что какое-небудь чужое приложени перешло в
> полноэкранный режим?

поставить ловшку WH_SHELL, HSHELL_WINDOWSACTIVATED + lParam = fFullScreen


 
demon ©   (2008-08-17 19:49) [3]

Так... Попытаюсь обяснить на конкретных примерах:
- Когда запускаеться видеоплеер (любой) и пользователь переводит его в полноэкранный режим.
- Когда запускаеться Haда Life2.
- ACDSee в режиме просмотра, если нажать F (тоже полноэкранный режим)
Не ужели эти события разные, и отлавливать их нужно по разному?


 
DVM ©   (2008-08-17 20:01) [4]


> Не ужели эти события разные, и отлавливать их нужно по разному?

все эти события приводят к появлению на экране окна размерами с десктоп, без бордюра и возможно TOPMOST. Все прекрасно отлавливается и детектируется самой системой, надо лишь вклиниться в этот процесс с помощью ловушки WH_SHELL, как это делают все нормальные приложения в частности Windows Explorer.


 
demon ©   (2008-08-18 00:51) [5]

Miranda IM (точнее плагин popup.dll) умеет детектировать полноэкранные окна не внедряя библиотеки...

Может поставить таймер и сравнивать рабочую зону с размерами экрана через определенный промежуток времени?


 
Германн ©   (2008-08-18 01:30) [6]

Хм.
> Miranda IM (точнее плагин popup.dll) умеет детектировать
> полноэкранные окна не внедряя библиотеки...
>


 
Игорь Шевченко ©   (2008-08-18 10:17) [7]

Я всю сознательную жизнь считал, что полноэкранный режим - это то, что происходит с консольным окном по Alt+Enter


 
Smile   (2008-08-18 11:11) [8]

> Я всю сознательную жизнь считал, что полноэкранный режим
> - это то, что происходит с консольным окном по Alt+Enter


Alt+Enter работает в обе стороны, а не только в сторону полноэкранного режима


 
oldman ©   (2008-08-18 17:01) [9]

А если я не даблкликнул по заголовку, а мышкой растащил за бордер - это полноэкранный режим?

Я понимаю, что при полноэкранном сам бордер пропадает, но "растащенное мышью" окно все равно во весь экран...


 
DVM ©   (2008-08-18 17:12) [10]


> а мышкой растащил за бордер - это полноэкранный режим?

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


 
DVM ©   (2008-08-18 17:16) [11]


> demon ©   (18.08.08 00:51) [5]
>
> Miranda IM (точнее плагин popup.dll) умеет детектировать
> полноэкранные окна не внедряя библиотеки...

Кстати, ты на основании чего такой вывод сделал? Дело в том, что ловушку аналогичную WH_SHELL можно задействовать и без своей dll.


 
oldman ©   (2008-08-18 17:18) [12]

А эмуляция текстового DOS режима (Norton Commander) - полноэкранка?
А эмуляция DOS игр (DOOM-2) - полноэкранка?
А включение ScreenSaver - полноэкранка?
etc.


> Как отследить что какое-небудь чужое приложени перешло в
> полноэкранный режим?
> Узнавать какое именно приложение не нужно.


визуально, блин...


 
DVM ©   (2008-08-18 17:23) [13]


> А эмуляция текстового DOS режима (Norton Commander) - полноэкранка?
>
> А эмуляция DOS игр (DOOM-2) - полноэкранка?
> А включение ScreenSaver - полноэкранка?

Да, да и да.


 
demon ©   (2008-08-19 01:05) [14]

Ушли от сути. Ваши мысли, как лучше определить что на экране полноэкранное окно?
Простой способ проверять по таймеру рабоую зону и сравнивать её с размкрами десктопа, или делать лавушку (правда, нипонятно как это дез длл сделать)?


 
Renegat ©   (2008-08-19 01:12) [15]

ИМХО, в данном случае (в случае плеера) вывод окна сообщения является довольно индусским подходом к уведомлению юзера о чём-либо.
Лучше уж не искать по форумам, как построить антигравитатор для крыши дома, который Вы решили строить с крыши, а просто пересмотреть логику работы GUI Вашей проги =)


 
Германн ©   (2008-08-19 01:21) [16]


> demon ©   (19.08.08 01:05) [14]
>
> Ушли от сути. Ваши мысли, как лучше определить что на экране
> полноэкранное окно?
> Простой способ проверять по таймеру рабоую зону и сравнивать
> её с размкрами десктопа, или делать лавушку (правда, нипонятно
> как это дез длл сделать)?
>

А тут и сути нибыло ни разу.. Только "демонически безсвязное" описание "бреда сивой кобылы", плюс
> Renegat ©   (19.08.08 01:12) [15]


 
Германн ©   (2008-08-19 01:34) [17]

Блин, очепятка. не было.


 
demon ©   (2008-08-19 02:14) [18]

Человеки, ведь некоторые плееры выдают такое окошко, например Aimp, или специальные плагины к винампу. Оно еще полупрозрачное в большинстве случаев.

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


 
DVM ©   (2008-08-19 11:36) [19]


> если можно перед выводом этого окошка проверить размеры
> рабочей зоны.

Какой еще рабочей зоны размеры ты хочешь проверить?


 
brother ©   (2008-08-19 11:45) [20]

кажись он хочет проверить размеры рабочего стола без меню пуск?)


 
DVM ©   (2008-08-19 12:50) [21]


> brother ©   (19.08.08 11:45) [20]

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


 
brother ©   (2008-08-19 12:51) [22]

> размеры рабочей области не меняются при старте полноэкранных
> приложений,

ну да? даже когда приложение меняет разрешение экрана?


 
DVM ©   (2008-08-19 12:58) [23]


> ну да? даже когда приложение меняет разрешение экрана?

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


 
Anatoly Podgoretsky ©   (2008-08-19 13:00) [24]

> brother  (19.08.2008 12:51:22)  [22]

Если приложение меняет разрешение, то убивать не приложение, а автора. Кроме DirectX


 
brother ©   (2008-08-19 13:01) [25]

> Кроме DirectX

про него и речь ;) а иначе - к стенке автора)


 
demon ©   (2008-08-19 14:11) [26]

всё прекрасно работает, вот код

procedure TForm1.Timer1Timer(Sender: TObject);
var
 WorkArea: trect;
 cx, cy:integer;
begin
 SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
 cx:= GetSystemMetrics(SM_CXSCREEN);
 cy:= GetSystemMetrics(SM_CYSCREEN);

 if (cx=WorkArea.Right - WorkArea.Left) and (cy=WorkArea.Bottom - WorkArea.Top)  then
   sndPlaySound("hit.WAV", SND_ASYNC);
end;


 
DVM ©   (2008-08-19 14:45) [27]


> demon ©   (19.08.08 14:11) [26]

ну ну, тебе виднее. Чукча не читатель, чукча писатель.


 
demon ©   (2008-08-19 23:58) [28]

DVM, а у вас есть лучшее решение этого вопроса?


 
Германн ©   (2008-08-20 00:11) [29]


> demon ©   (19.08.08 23:58) [28]

А так ли уж нужно этот вопрос решать? Или это из любви к "искусству ради искусства"?


 
brother ©   (2008-08-20 04:33) [30]

> [28] demon ©   (19.08.08 23:58)
> DVM, а у вас есть лучшее решение этого вопроса?

это твоя проблемма, тебе ее и решать, мы подсказываем ;)


 
DVM ©   (2008-08-20 10:42) [31]


> DVM, а у вас есть лучшее решение этого вопроса?

Ты отметаешь те решения, которые ты не знаешь как реализовать, как я посмотрю.
Лучшее решение я уже написал в [2]. Но если тебя так пугают ловушки, то хотя бы в своем этом таймере ты не размеры рабочей области проверял (что вообще то, по-моему, глупо), а перебрал все топ-левел окна и проверил нет ли среди них видимых, без бордюра и полностью перекрывающих десктоп. Хотя и это решение не лучшее.


 
demon ©   (2008-08-20 19:04) [32]


> Но если тебя так пугают ловушки
Ну вот нафига в плеере эти ловушки и внедрение библиотек, я еще ни в одном такого не замечал...


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


 
{RASkov} ©   (2008-08-20 19:27) [33]

> [32] demon ©   (20.08.08 19:04)

Ты не исправим)


 
DVM ©   (2008-08-20 21:31) [34]


> demon ©   (20.08.08 19:04) [32]


> Это будет куда тяжеловеснее чем мой вариант, согласитесь?

Только в отличие от твоего варианта, это будет хотя бы работать. Твой же вариант работает избирательно, неужели ты не видишь? Если стартует полноэкранное приложение, которое не нуждается в смене разрешения экрана, то размеры рабочей области не изменятся и соответственно такое окно не будет определено твоим кодом как fullscreen.


 
DVM ©   (2008-08-20 21:34) [35]


> demon ©   (20.08.08 19:04) [32]


> Ну вот нафига в плеере эти ловушки и внедрение библиотек,
>  я еще ни в одном такого не замечал...

Я тебя уже спрашивал в [11], но ты так и не ответил. Как ты определяешь, какие из приложений имеющихся у тебя на компьютере ставят какие-либо ловушки или нет?


 
demon ©   (2008-08-21 16:54) [36]

ИМХО, если ставиться ловушка, то внедряеться dll, это можно увидеть с помощью утилит работающих с процесами.


 
DVM ©   (2008-08-21 21:49) [37]


> если ставиться ловушка, то внедряеться dll

Какая dll внедряется тут:


{******************************************************************************}
{* Демонстрация работы SHELL HOOK и создания окна на WinApi                   *}
{* (c)2003 Дмитрий Муратов                                                    *}
{* e-mail: dvmuratov@yandex.ru                                                *}
{* Данный код создан исключительно в демонстрационных целях                   *}
{******************************************************************************}

program ShellHookDemo;

uses
 windows, messages, sysutils;

const
 RSH_DEREGISTER = 0;
 RSH_REGISTER = 1;
 RSH_REGISTER_PROGMAN = 2;
 RSH_REGISTER_TASKMAN = 3;

 HSHELL_ACTIVATESHELLWINDOW = 3;
 HSHELL_WINDOWCREATED = 1;
 HSHELL_WINDOWDESTROYED = 2;
 HSHELL_WINDOWACTIVATED = 4;
 HSHELL_GETMINRECT = 5;
 HSHELL_REDRAW = 6;
 HSHELL_TASKMAN = 7;
 HSHELL_LANGUAGE = 8;

var
 wc : TWndClassEx;
 MainWnd : HWND;
 Mesg : TMsg;
 WndListBox:hWnd;
 WM_ShellHook:Integer;
 xPos,yPos,nWidth,nHeight : Integer;
 osInfo:OSVERSIONINFO;

Procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall;external "shell32.dll" index 181;

//------------------------------------------------------------------------------

function GetTextFromWindow(Wnd: HWND): string;
var
 TextLength: Integer;
 Text: PChar;
begin
 TextLength := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
 if TextLength = 0 then Result := ""
 else
 begin
   GetMem(Text, TextLength + 1);
   SendMessage(Wnd, WM_GETTEXT, TextLength + 1, Integer(Text));
   Result := Text;
   FreeMem(Text);
 end;
end;

//------------------------------------------------------------------------------

function ListBox_AddString(lb : THandle; txt : String) : integer;
begin
 Result := SendMessage(lb, lb_addString, 0, integer(pchar(@txt[1])));
end;

//------------------------------------------------------------------------------

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
begin
 if msg=wm_shellhook then
   begin
     case wparam of
       HSHELL_WINDOWCREATED: ListBox_AddString(WndListBox,"Создано окно: HWND="
                    +inttostr(lparam)+" Text=""+GetTextFromWindow(lparam)+""");
       HSHELL_WINDOWDESTROYED: ListBox_AddString(WndListBox,
                                    "Уничтожено окно: HWND="+inttostr(lparam));
       HSHELL_WINDOWACTIVATED: ListBox_AddString(WndListBox,
                          "Активируется окно: HWND="+inttostr(lparam)+" Text=""
                                               +GetTextFromWindow(lparam)+""");
     end;
   end;
 case msg of
   wm_destroy :
     Begin
       postquitmessage(0);
       Result:=0;
       exit;
     End;
 else Result:=DefWindowProc(wnd,msg,wparam,lparam);
 end;
End;

//------------------------------------------------------------------------------

begin
 wc.cbSize:=sizeof(wc);
 wc.style:=cs_hredraw or cs_vredraw;
 wc.lpfnWndProc:=@WindowProc;
 wc.cbClsExtra:=0;
 wc.cbWndExtra:=0;
 wc.hInstance:=HInstance;
 wc.hIcon:=LoadIcon(0,idi_application);
 wc.hCursor:=LoadCursor(0,idc_arrow);
 wc.hbrBackground:=COLOR_BTNFACE+1;
 wc.lpszMenuName:=nil;
 wc.lpszClassName:="ShellHookDemo";
 if RegisterClassEx (wc) = 0 then
   MessageBox (0, "Invalid class registration", "Error", MB_OK)
 else
   begin
     xPos:=100; yPos:=150;
     nWidth:=430; nHeight:=250;
     MainWnd:=CreateWindowEx(
       0,
       "ShellHookDemo",
       "ShellHookDemo",
       ws_overlappedwindow,
       xPos,
       yPos,
       nWidth,
       nHeight,
       0,
       0,
       Hinstance,
       nil
       );
     if MainWnd = 0 then
       MessageBox (0, "Window not created", "Error", MB_OK)
     else
       begin
         ShowWindow(MainWnd,CmdShow);
         WM_ShellHook := RegisterWindowMessage("SHELLHOOK");
         if WM_ShellHook<>0 then
           begin
             osInfo.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
             GetVersionEx(osInfo);
             RegisterShellHook(0, 1);
             if(osInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) then
               RegisterShellHook(MainWnd, RSH_REGISTER)
             else
              RegisterShellHook(MainWnd, RSH_REGISTER_TASKMAN);
           end;
         SendMessage(GetDesktopWindow, $400, 0, 0);
         WndListbox:=CreateWindowEx(
                                    ws_ex_clientedge,
                                    "listbox",
                                    "",
                                    lbs_notify
                                    or ws_visible
                                    or ws_child
                                    or ws_vscroll,
                                    10,
                                    10,
                                    400,
                                    200,
                                    MainWnd,
                                    0,
                                    hInstance,
                                    nil
                                    );
         SendMessage(WndListBox,wm_setfont,GetStockObject(ansi_var_font),0);
       end;
   end;

 While GetMessage(Mesg,0,0,0) do
   begin
     TranslateMessage(Mesg);
     DispatchMessage(Mesg);
   end;
end.



 
GrayFace ©   (2008-08-22 15:50) [38]

Можно проверять окно, взятое с помощью WindowFromPoint, на растянутость на весь экран и отсутствие бордюра. Только надо игнорировать Desktop.

demon ©   (19.08.08 14:11) [26]
Включи "Автоматически скрывать панель задач".



Страницы: 1 вся ветка

Текущий архив: 2009.10.11;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.012 c
1-1218792099
Dr.Andrew
2008-08-15 13:21
2009.10.11
Как изменить вид ползунка у компонента таскбара (TTackBar)?


2-1249359922
Maxx
2009-08-04 08:25
2009.10.11
DBF и BDE


2-1249914741
Putnik
2009-08-10 18:32
2009.10.11
Название элемента интерфейса


1-1218827308
Дед
2008-08-15 23:08
2009.10.11
Добавление нового элемента в меню


15-1250078881
young delphi master
2009-08-12 16:08
2009.10.11
Текстовый редактор