Zobrazujeme názvy všetkých aktívnych okien vo Windowse.

 


V tomto článku si popíšeme možnosti zobrazenia názvov aktívnych okien.

Aktívne okno je okno, ktoré je buď otvorené alebo zminimalizované. Ku príkladu si môžeme uviesť okná aplikácií ako napríklad skype, icq, ktoré sú spúšťané aicky po prihlásení do Windowsu. Aktívne okno je inštanciou procesu spusteného pod spomínaným desktopom. Aktívne okná máme napríklad aj po spustení poznámkového bloku, skicára alebo okno prehliadača, ktoré máme aktuálne otvorené.

Ak sa pýtate k čomu je nám dobré vedieť názvy otvorených okien, musím podotknúť, že je nutné sa zamyslieť nad faktom, že názov okna je niekedy jediná možnosť ako detekovať bežiacu aplikáciu.
Tento fakt sa dá uplatniť pri detekovaní bežiacích aplikáciách, kedy nevieme názov súboru, ale vieme, že sa jedná o nástroj, napríklad skenovaciu aplikáciu či bezpečnostnú utilitu.
Po vylistovaní názvoch okien môžeme na zhodu detekcie patrične reagovať, a to odmazaním častí operačného systému, zhodením partíc, atď.

Na začiatok si popíšeme funkciu, ktorú použijeme, a to EnumWindows.
Ide o funkciu, ktorá nám enumeratívne prejde všetky aktívne okná desktopu, pričom každej interácií pridá funkcionalitu, a to funkcie označenou ako CallBack alebo definovanou kľúčovým direktívom preprocesoru __stdcall
Enumerácia končí posledným aktívnym oknom, inak funkcia vracia hodnotu spätného volania.


Funkcia je definovaná ako:


BOOL EnumWindows( __IN__ WNDENUMPROC lpEnumFunc, __IN__ LPARAM lParam )

lpEnumFunc je parameter odkazujúci na funkciu spätného volania a lParam je hodnota atribútu prenášaná ako hodnota do funkcie spätného volania.

 


Ako ďalšiu funkciu volanú z funkcie spätného volania použijeme ::GetWindowText.
Funkcia z daného aktívneho okna v interácií skopíruje názov okna aplikácie do dátového bufferu. Jej použitie bude následovné:

::GetWindowText(d_hwnd, WindowTitleBuffer, 900)

Poslednou funkciou, ktorú si popíšeme je funkcia IsWindowVisible
Táto funkcia kontroluje či dané okno je spustené pod desktopom alebo, či beží ako okno procesu na pozadí. Ak chceme zobraziť len okná desktopu, tak ju v podmienke použijeme ako filter zobrazovania len aktívných okien, a to:


                            (::IsWindowVisible(d_hwnd) --> return true) .


V opačnom prípade, ak chceme zobraziť aj neaktívne okná, použijeme funkciu ako:


                            (!::IsWindowVisible(d_hwnd) --> return true) .


Pri implementácií by mohol kód vypadať neako takto:

  

#include <iostream>
#include "Convert.h" //https://www.netbot.sk/sk/14-blog-headers/84-convert-h
#include "WinAPI.h" //https://www.netbot.sk/sk/14-blog-headers/31-winapi
BOOL __stdcall FindActiveWindowTitle(__IN__ HWND d_hwnd, __IN__ LPARAM lparam) { ::TCHAR WindowTitleBuffer[900]; ::GetWindowText(d_hwnd, WindowTitleBuffer, 900);
int d_size = ::GetWindowTextLength(d_hwnd); ::wstring d_tmp(&WindowTitleBuffer[0]);
::string windowtitle(d_tmp.begin(), d_tmp.end());
if ( d_size == 0 || !::IsWindowVisible(d_hwnd)) { return true; }
cout << lparam << " -- " << windowtitle << endl; }

int _cdecl main (void) { EnumWindows(FindActiveWindowTitle, 45); return 0; }

 

 

 

-----------------------------------------------------------------

Celá funkcia je zakonpovaná do headeru WinAPI.h WinAPI.h


#include "WinAPI.h" //https://www.diallix.net/programing/163-module

int _cdecl main (void) 
{
  ::Diall_WinApi::WinApi::GetInstance()->SystemIntegrity(::Diall_WinApi::Privilege::ENABLE); 
::EnumWindows(::Diall_WinApi::FindActiveWindowTitle,null);

return 0; }