Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.10.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.01 c
2-1249455497
niel
2009-08-05 10:58
2009.10.11
CharPrev


15-1249993837
77
2009-08-11 16:30
2009.10.11
СУБД


15-1249457425
@!!ex
2009-08-05 11:30
2009.10.11
Напишите прокси за денежку.


2-1249581672
AndrewG
2009-08-06 22:01
2009.10.11
Добрый вечеч. RichEdit


15-1249919788
@!!ex
2009-08-10 19:56
2009.10.11
Еще одна игра-головоломка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский