Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Детектор полноэкранных окон


Страницы:   1 2

demon ©   (2008-08-17 18:55:00) 

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


GrayFace   (2008-08-22 15:50:00) [1]

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

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


DVM   (2008-08-21 21:49:00) [2]


> если ставиться ловушка, то внедряеться 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.


demon   (2008-08-21 16:54:00) [3]

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


DVM   (2008-08-20 21:34:00) [4]


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


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

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


DVM   (2008-08-20 21:31:00) [5]


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


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

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


{RASkov}   (2008-08-20 19:27:00) [6]

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

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


demon   (2008-08-20 19:04:00) [7]


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


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


DVM   (2008-08-20 10:42:00) [8]


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

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


brother   (2008-08-20 04:33:00) [9]

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

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


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


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

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


demon   (2008-08-19 23:58:00) [11]

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


DVM   (2008-08-19 14:45:00) [12]


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

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


demon   (2008-08-19 14:11:00) [13]

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

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;


brother   (2008-08-19 13:01:00) [14]

> Кроме DirectX

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


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

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

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


DVM   (2008-08-19 12:58:00) [16]


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

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


brother   (2008-08-19 12:51:00) [17]

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

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


DVM   (2008-08-19 12:50:00) [18]


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

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


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

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


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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо