Как программно определить активное полноэкранное приложение и активный screen saver

Предыдущая тема Следующая тема Перейти вниз

Как программно определить активное полноэкранное приложение и активный screen saver

Сообщение  electrik в Пн Апр 25, 2011 6:05 pm

у меня есть написанная программа- говорящие часы.
все мы любим смотреть фильмы, но при просмотре фильма, часы могут мешать и раздражать.
задача, определить активное полноэкранное приложение.
ну допустим, с этим мы справимся, но тогда встанет другая проблема.
когда запустится 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
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как программно определить активное полноэкранное приложение и активный screen saver

Сообщение  trew в Пн Апр 25, 2011 7:39 pm

Как один из вариантов отлавливать скринсейвер по его расширению SCR, по таймеру перечисляя запущенные процессы. Если заинтересует, посмотри в сторону функций Process32First, Process32Next

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как программно определить активное полноэкранное приложение и активный screen saver

Сообщение  DEPOzit в Вт Апр 26, 2011 9:31 am

На основании примера с оф.форума ищем в активных процессах *.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   

DEPOzit

Сообщения : 113
Дата регистрации : 2008-05-15
Возраст : 36
Откуда : Смоленская обл.

Посмотреть профиль http://freebasic.ru/

Вернуться к началу Перейти вниз

Re: Как программно определить активное полноэкранное приложение и активный screen saver

Сообщение  electrik в Чт Апр 28, 2011 3:50 pm

спасибо за идеи. вот чего я накатал.
моей целью было отлавливать скрин, если отловился, значит 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
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как программно определить активное полноэкранное приложение и активный screen saver

Сообщение  VerhoLom в Пт Апр 29, 2011 1:19 pm

http://msdn.microsoft.com/en-us/library/ms646360(VS.85).aspx

Особое внимание обратите на SC_SCREENSAVE: можно не передавать его DefWindowProc.

Ну, или на худой конец, вызвать kbd_event или послать какому-то окну сообщение от мышки или mouse_event вызвать...
affraid
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 36

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как программно определить активное полноэкранное приложение и активный screen saver

Сообщение  electrik в Сб Апр 30, 2011 5:00 pm

вот, что у меня получилось.
простая программа, которая завершается в случае срабатывания скрин сейвера, или тогда, когда включается полноэкранный режим- не развернутое окно на весь экран, а именно полноэкранка, как при просмотре видео.
соответственно, сначала идет проверка на скрин, а потом на полноэкранку. то, что мне было нужно, для говорящих часов, проговаривание времени, не работает только в полноэкранке, а при скрине говорят.
программа не сработает, в тех полноэкранках, в которых сделаны не стандартные окна, то есть, окна не имеющие стиль 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
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как программно определить активное полноэкранное приложение и активный screen saver

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения