Как программно определить активное полноэкранное приложение и активный screen saver
Участников: 4
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Как программно определить активное полноэкранное приложение и активный screen saver
у меня есть написанная программа- говорящие часы.
все мы любим смотреть фильмы, но при просмотре фильма, часы могут мешать и раздражать.
задача, определить активное полноэкранное приложение.
ну допустим, с этим мы справимся, но тогда встанет другая проблема.
когда запустится screen saver, программа отловит его как активное полноэкранное окно, и часы будут молчать.
соответственно, надо отлавливать screen saver.
ну с активным приложением, немного понятно, делается вродь того:
короче, знающие, плиз.
все мы любим смотреть фильмы, но при просмотре фильма, часы могут мешать и раздражать.
задача, определить активное полноэкранное приложение.
ну допустим, с этим мы справимся, но тогда встанет другая проблема.
когда запустится screen saver, программа отловит его как активное полноэкранное окно, и часы будут молчать.
соответственно, надо отлавливать screen saver.
ну с активным приложением, немного понятно, делается вродь того:
- Код:
dim WorkArea as trect
dim as integer cx, cy
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 if
короче, знающие, плиз.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Как программно определить активное полноэкранное приложение и активный screen saver
Как один из вариантов отлавливать скринсейвер по его расширению SCR, по таймеру перечисляя запущенные процессы. Если заинтересует, посмотри в сторону функций Process32First, Process32Next
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Как программно определить активное полноэкранное приложение и активный screen saver
На основании примера с оф.форума ищем в активных процессах *.scr:
- Код:
#include once "windows.bi"
#include once "win\tlhelp32.bi"
#Define fmt(t,l) Left(t,l)+Space(l-Len(t))+" "
dim prcinfo as PROCESSENTRY32,snap as Integer
Dim rash As string
Do
snap=CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0)'Take snapshot of running processes
if snap <> INVALID_HANDLE_VALUE then
prcinfo.dwSize=sizeof(PROCESSENTRY32)
' Print "file Process name ID Nthread parent id"
If Process32First (snap,@prcinfo) then
do
Print fmt(prcinfo.szExeFile,20)+fmt(Str(prcinfo.th32ProcessID),5)+fmt(Str(prcinfo.cntThreads),3)+fmt(Str(prcinfo.th32ParentProcessID),5)
rash=""
For rr1 As Integer=Len (fmt(prcinfo.szExeFile,20)) To 1 Step -1
If Not mid(fmt(prcinfo.szExeFile,20),rr1, 1)=" " Then rash=mid(fmt(prcinfo.szExeFile,20),rr1, 1)+rash
If Mid(fmt(prcinfo.szExeFile,20),rr1, 1)="." Then GoTo as1
Next
As1:
Print rash
If Mid(rash,1,1)="." And (Mid(rash,2,1)="s" Or Mid(rash,2,1)="S") And (Mid(rash,3,1)="c" Or Mid(rash,3,1)="C") And (Mid(rash,4,1)="r" Or Mid(rash,4,1)="R") Then Beep: Print "Opa! Screensaver!": Sleep: End
loop while Process32Next (snap,@prcinfo)
Else
Print "Process list error","Failed to create process list!"
End If
CloseHandle (snap)
End If
Sleep 1000
Loop
Re: Как программно определить активное полноэкранное приложение и активный screen saver
спасибо за идеи. вот чего я накатал.
моей целью было отлавливать скрин, если отловился, значит TRUE, если нет, то FALSE.
вот простая програмка. она закроется после того, когда сработает screen saver.
моей целью было отлавливать скрин, если отловился, значит TRUE, если нет, то FALSE.
вот простая програмка. она закроется после того, когда сработает screen saver.
- Код:
#include "windows.bi"
#include "win/tlhelp32.bi"
declare function ScreenSaver() as BOOL
declare function GetProcessExtension naked (byval s as zString PTR) as zString ptr
do
sleep 50
loop until screensaver() = TRUE
function ScreenSaver() as BOOL
dim prcinfo as PROCESSENTRY32 ' структура из которой будем получать имя процесса
dim snap as HANDLE ' хэндл снимка процессов
prcinfo.dwSize = sizeof(PROCESSENTRY32 )
snap=CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) ' сделаем снимок процессов
if snap <> INVALID_HANDLE_VALUE then
If Process32First (snap,@prcinfo) then 'получаем первый процесс
do
if lstrcmp(GetProcessExtension(@prcinfo.szExeFile),".scr") = 0 or lstrcmp(GetProcessExtension(@prcinfo.szExeFile),".SCR") = 0 then ' сравниваем строки расширений, как заглавные так и строчные буквы
return TRUE
end if
loop while Process32Next (snap,@prcinfo)
end if
end if
return FALSE
end function
function GetProcessExtension naked (byval s as zString PTR) as zString ptr ' функция возвращает расширение процесса с точкой
asm
mov edi, dword ptr[esp+4] ' запишем в регистр еди, указатель на строку, передаваемый в параметре s
cld ' сбросим флаг направления. движение в перед
xor eax,eax ' обнулим регистр eax
mov ecx,260 ' длина строки, соответственно количество циклов.
repne scasb ' циклично ищем, пока не встретится 0. сравнивается с регистром al.
sub edi,5 ' отнимем от edi 5, в нашем случае, расширение в месте с точкой 4 знака.
mov eax,edi ' запишем в регистр eax, указатель на расширение. через eax, наша функция вернет указатель.
ret 4
end asm
end function
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Как программно определить активное полноэкранное приложение и активный screen saver
http://msdn.microsoft.com/en-us/library/ms646360(VS.85).aspx
Особое внимание обратите на SC_SCREENSAVE: можно не передавать его DefWindowProc.
Ну, или на худой конец, вызвать kbd_event или послать какому-то окну сообщение от мышки или mouse_event вызвать...
Особое внимание обратите на SC_SCREENSAVE: можно не передавать его DefWindowProc.
Ну, или на худой конец, вызвать kbd_event или послать какому-то окну сообщение от мышки или mouse_event вызвать...
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
Re: Как программно определить активное полноэкранное приложение и активный screen saver
вот, что у меня получилось.
простая программа, которая завершается в случае срабатывания скрин сейвера, или тогда, когда включается полноэкранный режим- не развернутое окно на весь экран, а именно полноэкранка, как при просмотре видео.
соответственно, сначала идет проверка на скрин, а потом на полноэкранку. то, что мне было нужно, для говорящих часов, проговаривание времени, не работает только в полноэкранке, а при скрине говорят.
программа не сработает, в тех полноэкранках, в которых сделаны не стандартные окна, то есть, окна не имеющие стиль WS_EX_TOPMOST- поверх всех окон.
если кто сможет придумать лучше, пишите, исправляйте, хочется, как можно лучшую оптимизацию.
да и этот WS_EX_TOPMOST, как-то странен, может еще как-то можно определить полноэкранку.
простая программа, которая завершается в случае срабатывания скрин сейвера, или тогда, когда включается полноэкранный режим- не развернутое окно на весь экран, а именно полноэкранка, как при просмотре видео.
соответственно, сначала идет проверка на скрин, а потом на полноэкранку. то, что мне было нужно, для говорящих часов, проговаривание времени, не работает только в полноэкранке, а при скрине говорят.
программа не сработает, в тех полноэкранках, в которых сделаны не стандартные окна, то есть, окна не имеющие стиль WS_EX_TOPMOST- поверх всех окон.
если кто сможет придумать лучше, пишите, исправляйте, хочется, как можно лучшую оптимизацию.
да и этот WS_EX_TOPMOST, как-то странен, может еще как-то можно определить полноэкранку.
- Код:
#include "windows.bi"
#include "win/mmsystem.bi"
#include "win/tlhelp32.bi"
declare function ScreenSaver() as BOOL
declare function GetProcessExtension naked (byval s as zString PTR) as zString ptr
declare function FullScreen() as BOOL
do
sleep 40
if screensaver() = TRUE then exit do ' если сработал скрин, выходим из проги
if FullScreen() = TRUE then exit do ' если полноэкранка, выходим из проги
loop until inkey = chr(27)
playsound("c:\windows\media\chimes.wav",0,0)
function ScreenSaver() as BOOL
dim prcinfo as PROCESSENTRY32 ' структура из которой будем получать имя процесса
dim snap as HANDLE ' хэндл снимка процессов
prcinfo.dwSize = sizeof(PROCESSENTRY32 )
snap=CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0) ' сделаем снимок процессов
if snap <> INVALID_HANDLE_VALUE then
If Process32First (snap,@prcinfo) then 'получаем первый процесс
do
if lstrcmp(GetProcessExtension(@prcinfo.szExeFile),".scr") = 0 or lstrcmp(GetProcessExtension(@prcinfo.szExeFile),".SCR") = 0 then
return TRUE
end if
loop while Process32Next (snap,@prcinfo)
end if
end if
return FALSE
end function
function GetProcessExtension naked (byval s as zString PTR) as zString ptr
asm
mov edi, dword ptr[esp+4] ' запишем в регистр еди, указатель на строку, передаdаемый в параметре s
cld ' сбросим флаг направления. движение в перед
xor eax,eax ' обнулим регистр eax
mov ecx,260 ' длина строки, соответственно количество циклов.
repne scasb ' циклично ищем, пока не встретится 0. сравнивается с регистром al.
sub edi,5 ' отнимем от edi 5, в нашем случае, расширение в месте с точкой 4 знака.
mov eax,edi ' запишем в регистр eax, указатель на расширение. через eax, наша функция вернет указатель.
ret 4
end asm
end function
function FullScreen() as BOOL
dim WorkArea as rect ' структура в которую получим размеры окна
dim as integer cx, cy ' переменные в которые получим разрешение осей x y
dim as HANDLE hWindow ' хэндл активного окна
cx= GetSystemMetrics(SM_CXSCREEN) ' получим у системы разрешение оси x
cy= GetSystemMetrics(SM_CYSCREEN) ' получим у системы разрешение оси y
hWindow = GetForegroundWindow() ' получим хэндл активного окна. окна переднего плана.
GetClientRect(hWindow,@WorkArea) ' получим размеры клиентской области
if (cx = WorkArea.right-WorkArea .left) and (cy= WorkArea.bottom-WorkArea.top) then ' если равны
if (GetWindowLong(hWindow, GWL_EXSTYLE) and WS_EX_TOPMOST) then ' проверяем окно, отображается ли оно поверх всех окон
return true
end if
end if
return FALSE
end function
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|