Форум: "Основная";
Текущий архив: 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