![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Детектор полноэкранных окон
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]
> если можно перед выводом этого окошка проверить размеры
> рабочей зоны.
Какой еще рабочей зоны размеры ты хочешь проверить?