Image
7.6.2016 0 Comments

ASSEMBLER pod Windows: Minimalizovanie aplikácie do System Icon Tray (23. časť)

Späť na úvod >> Späť na programovanie >> Späť na seriál

Dnes dokončíme opis API funkcií na prácu s INI súbormi a pustíme sa do novej témy.

GetPrivateProfileString

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

kernel32.lib

kernel32.inc

Funkcia GetPrivateProfileString vráti hodnotu reťazca spojenú s kľúčom zo špecifikovanej sekcie súboru privátneho profilu.

Syntax: DWORD GetPrivateProfileString, LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName           

LPCTSTR lpAppName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno sekcie. Ak je tento parameter NULL,  skopírujú sa do lpReturnedString všetky mená sekcií nájdené v INI súbore.

LPCTSTR lpKeyName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno kľúča. Ak je tento parameter NULL, skopírujú sa do lpReturnedString všetky mená kľúčov zo špecifikovanej sekcie.

LPCTSTR lpDefault: Ukazovateľ na reťazec zakončený nulou - obsahujúci implicitnú hodnotu, ktorá sa vráti v prípade, že sa kľúč v špecifikovanej sekcii nenájde.

LPTSTR lpReturnedString: Ukazovateľ na buffer. V bežnom prípade buffer obsahuje jeden reťazec zakončený nulou. Ak buffer obsahuje zoznam reťazcov zakončených nulou, potom posledný reťazec, je zakončený dvoma nulovými znakmi. 

DWORD nSize: Veľkosť buffera lpReturnedString, do ktorého sa uložia dáta.

LPCTSTR lpFileName: Ukazovateľ na reťazec zakončený nulou, ktorý je menom súboru privátneho profilu. Ak parameter lpFileName neobsahuje úplne špecifikované meno cesty INI súboru, bude Windows hľadať tento súbor v adresári Windows.

Výsledok funkcie: DWORD: Ak funkcia skončila úspešne, návratovou hodnotou je počet znakov kopírovaných do bufferu. Do počtu nie je zahrnutá zakončovania nula. Ak je buffer príliš malý pre hodnotu kľúča, je návratová hodnota nSize – 1. Ak je buffer príliš malý pre hodnoty ktoré sa majú získať, je návratová hodnota nSize – 2.

 

GetProfileInt

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

kernel32.lib

kernel32.inc

Funkcia GetProfileInt vráti hodnotu Integer spojenú s kľúčom zo špecifikovanej sekcie súboru WIN.INI.

Syntax: UINT GetProfileInt, LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault           

LPCTSTR lpAppName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno sekcie.

LPCTSTR lpKeyName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno kľúča.

INT nDefault: Hodnota, ktorá sa vráti v prípade, ak sa daný kľúč nenachádza v špecifikovanej sekcii súboru WIN.INI.

Výsledok funkcie: UINT: Pokiaľ sa kľúč nachádza v špecifikovanej sekcii súboru WIN.INI vráti sa jeho hodnota. Ak kľúč nebol nájdený, vráti sa implicitná hodnota nDefault. V prípade, že je hodnota kľúča menšia než nula, vráti sa nula. Ak by kľúč obsahoval iné znaky ako čísla napríklad: KeyName=102abc. Funkcia v takomto prípade vráti hodnotu 102.

 

GetProfileSection

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

kernel32.lib

kernel32.inc

Funkcia GetProfileSection vyplní buffer menami a hodnotami kľúčov zo špecifikovanej sekcie súboru WIN.INI. Buffer sa bude skladať z množiny sekvenčných reťazcov zakončených nulou. Posledný reťazec bude zakončený dvoma nulami. Vo Win32s a Win95 nesmie veľkosť sekcie, ktorá sa má čítať, presiahnuť 32 KB.

Syntax: DWORD GetProfileSection, LPCTSTR lpAppName, LPTSTR lpReturnedString, DWORD nSize

LPCTSTR lpAppName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno sekcie.

LPTSTR lpReturnedString: Ukazovateľ na buffer, do ktorého sa zapíše obsah sekcie.

DWORD nSize: Veľkosť buffera.

Výsledok funkcie: DWORD: Funkcia vráti počet znakov skopírovaných do pamäti. Tento počet nezahŕňa zakončovaciu nulu. Ak nie je k dispozícii dostatok priestoru pre uloženie všetkých mien kľúčov zo sekcie, je návratová hodnota nSize – 2.

 

GetProfileString

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

kernel32.lib

kernel32.inc

Funkcia GetProfileString vráti hodnotu kľúča zo špecifikovanej sekcie súboru WIN.INI.

Syntax: DWORD GetProfileString, LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize

LPCTSTR lpAppName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno sekcie. Ak je tento parameter NULL, skopírujú sa do pamäti všetky mená sekcií INI súboru.

LPCTSTR lpKeyName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno kľúča. Ak je tento parameter NULL, skopírujú sa do pamäti všetky mená kľúčov zo špecifikovanej sekcie.

LPCTSTR lpDefault: Ukazovateľ na reťazec zakončený nulou, obsahujúci hodnotu, ktorú vráti systém, ak nenájde kľúč v špecifikovanej sekcii. 

LPTSTR lpReturnedString: Ukazovateľ na pamäťový buffer.

DWORD nSize: Veľkosť bufferu lpReturnedString, do ktorého sa uložia dáta.

Výsledok funkcie: DWORD: Po úspešnom vykonaní funkcie sa vráti počet znakov skopírovaných do pamäti. Tento počet nezahŕňa zakončovaciu nulu. Pokiaľ je buffer príliš malý pre hodnotu kľúča, je návratovou hodnotou nSize-1. V prípade, že je buffer príliš malý pre všetky mená sekcií alebo mená kľúčov, je návratovou hodnotou nSize-2.

 

WritePrivateProfileSection

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

kernel32.lib

kernel32.inc

Funkcia WritePrivateProfileSection uloží množinu kľúčov do špecifikovanej sekcie súboru privátneho profilu. Tieto kľúče nahradia pôvodný obsah danej sekcie. Hodnoty kľúčov, ktoré existujú v sekcii, ale nie sú v zozname zapisovaných položiek sa jednoducho vymažú.

Syntax: BOOL WritePrivateProfileSection, LPCTSTR lpAppName, LPCTSTR lpString, LPCTSTR lpFileName

LPCTSTR lpAppName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno sekcie. Ak meno sekcie v špecifikovanom súbore INI neexistuje, bude automaticky vytvorené.

LPCTSTR lpString: Ukazovateľ na pamäťový buffer obsahujúci kľúče a hodnoty sekcie, ktoré sa majú uložiť. Buffer obsahuje zoznam reťazcov zakončených nulou vo tvare: kľúč=hodnota, pričom posledný reťazec je ukončený dvoma nulovými znakmi.

LPCTSTR lpFileName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno súboru privátneho profilu. Ak lpFileName neobsahuje plný tvar cesty k špecifikovanému súboru, bude Windows hľadať tento súbor v adresári Windows. Ak súbor neexistuje a cesta nemá platný tvar, vytvorí Windows súbor profilu v adresári Windows. Windows však nevytvorí súbor privátneho profilu, ak bola zadaná platná cesta a súbor neexistuje.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak sa vráti hodnota FALSE. Na bližšie určenie chyby môžete použiť funkciu GetLastError.

 

WriteProfileSection

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

kernel32.lib

kernel32.inc

Funkcia WriteProfileSection uloží množinu kľúčov do špecifikovanej sekcie súboru WIN.INI. Tieto kľúče nahradia pôvodný obsah danej sekcie. Hodnoty kľúčov, ktoré existujú v sekcii, ale nie sú v zozname zapisovaných položiek sa jednoducho vymažú. V čase, kedy sa vykonáva táto funkcia, nie sú povolené žiadne iné aktualizácie súboru WIN.INI

Syntax: BOOL WriteProfileSection, LPCTSTR lpAppName, LPCTSTR lpString

LPCTSTR lpAppName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno sekcie. V prípade, že sekcia v zadanom INI súbore neexistuje, bude vytvorená.

LPCTSTR lpString: Ukazovateľ na pamäťový buffer obsahujúci kľúče a hodnoty sekcie, ktoré sa majú uložiť do WIN.INI súboru. Buffer obsahuje zoznam reťazcov zakončených nulou vo tvare: kľúč=hodnota, pričom posledný reťazec je ukončený dvoma nulovými znakmi.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak sa vráti hodnota FALSE. Na bližšie určenie chyby môžete použiť funkciu GetLastError.

 

WriteProfileString

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

kernel32.lib

kernel32.inc

Funkcia WriteProfileString uloží hodnotu kľúča do špecifikovanej sekcie súboru WIN.INI.

Syntax: BOOL WriteProfileString, LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString      

LPCTSTR lpAppName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno sekcie. Ak sekcia neexistujem bude vytvorená. Meno sekcie nie je case-sensitive; to znamená, že môže obsahovať ľubovoľnú kombináciu malých a veľkých písmen.

LPCTSTR lpKeyName: Ukazovateľ na reťazec zakončený nulou, ktorý obsahuje meno kľúča. Ak kľúč v danej sekcii neexistuje, bude vytvorený. V prípade, že je tento parameter NULL, zmažú sa všetky mená kľúčov špecifikovanej sekcie, vrátane samotného záhlavia sekcie.

LPCTSTR lpString: Ukazovateľ na reťazec zakončený nulou, obsahujúci hodnotu, ktorá má byť zapísaná do špecifikovaného kľúča lpKeyName v sekcii lpAppName WIN.INI súboru. Ak je tento parameter NULL, odstráni sa daný kľúč zo sekcie.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak sa vráti hodnota FALSE. Na bližšie určenie chyby môžete použiť funkciu GetLastError.

 

System Icon Tray

Windows od verzie 95 obsahuje tzv. system icon tray. Ide o relatívne malú oblasť, ktorá sa nachádza vedľa hodín v pravom dolnom rohu. Zobrazujú sa v nej malé ikony 16x16 bodov, ktoré charakterizujú konkrétnu aplikáciu, prípadne len jej stav. Príkladom využitia tray je napríklad indikátor klávesnice, reproduktor, ukazovateľ stavu batérie a pod. Našim cieľom bude vytvoriť jednoduchý program, ktorý sa vie skryť do system tray. Po kliknutí a tlačidlo minimalizovať sa okno skryje do system tray a vyvolá sa buď ľavým dvojklikom na ikonu v tray alebo pomocou menu. Menu bude obsahovať dve položky: Exit Program a položku Restore. Na pridanie ikony do tray slúži API funkcia Shell_NotifyIcon. Pre zobrazenie menu použijeme API funkciu TrackPopupMenu, jej opis nájdete v niektorom z predchádzajúcich čísel. Príklad nájdete opäť na stránke www.pcrevue.sk, sekcia Programujeme – Assembler pod Windows. Keď už spomíname tray ukážeme si ako ho možno využiť napríklad na otvorenie resp. zatvorenie dvierok CD-ROM mechaniky. Na „ovládanie dvierok“ CD-ROM mechaniky možno použiť funkciu mciSendString. Funkcia sa nachádza v knižnici winmm.dll. Pred použitím v MASM assembleri jej funkcie musíte sprístupniť pomocou definície include \masm32\include\winmm.inc a includelib \masm32\lib\winmm.lib.

 

Shell_NotifyIcon

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Nie

shell32.lib

shell32.inc

Funkcia Shell_NotifyIcon pošle systému správu pridať, modifikovať alebo zmazať ikonu zo system tray.

Syntax: WINSHELLAPI BOOL WINAPI Shell_NotifyIcon, DWORD dwMessage, PNOTIFYICONDATA pnid

DWORD dwMessage: Typ správy.  Môže to byť jeden z nasledujúcich parametrov:

NIM_ADD - pridá ikonu do system tray.

NIM_DELETE - odstráni ikonu zo system tray.

NIM_MODIFY - zmení ikonu v system tray.

PNOTIFYICONDATA pnid: Ukazovateľ na štruktúru NOTIFYICONDATA. Štruktúra má tvar:

 

ICONDATAA STRUCT

  cbSize            DWORD      ?

  hwnd              DWORD      ?

  uID               DWORD      ?

  uFlags            DWORD      ?

  uCallbackMessage  DWORD      ?

  hIcon             DWORD      ?

  szTip             BYTE 64 dup (?)

NOTIFYICONDATAA ENDS

 

Jednotlivé položky štruktúry majú nasledujúci význam:

cbSize – Veľkosť štruktúry NOTIFYICONDATA.

hwnd – Handle okna, ktoré bude prijímať správy súvisiace s ikonou v system tray.

uID – Identifikátor ikony v rámci aplikácie (tento parameter je dôležitý ak jedna aplikácia pridáva do system tray viacej ikon).

uFlags – určuje, ktoré z nasledujúcich položiek štruktúry NOTIFYICONDATA (teda uCallbackMessage, hIcon, szTip) budú obsahovať platné dáta. Tento parameter môže byť kombináciou nasledujúcich hodnôt: NIF_ICON, NIF_MESSAGE a NIF_TIP.

uCallbackMessage – Identifikátor aplikáciou definovanej správy. Systém používa tento identifikátor pre notifikáciu (oznámenie) správ posielaných oknu, ktoré je identifikované parametrom hwnd vždy keď je zaznamenaná nejaká akcia na ikonou v system tray.

hIcon – Handle ikony, ktorá sa zobrazí v system tray.

szTip - Tooltip text, ktorý sa zobrazí nad ikonou. Bežne obsahuje napríklad: názov aplikácie, verziu, prípadne jej aktuálny stav (ak ide o proces kopírovania, komprimovania súborov a pod.). 

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak sa vráti hodnota FALSE.

 

SetForegroundWindow

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Nie

user32.lib

user32.inc

Funkcia SetForegroundWindow presunie vlákno, ktoré dané okno vytvorilo do popredia a aktivuje okno, pričom mu dá zvýraznenie pre vstup. Vstup z klávesnice bude odteraz smerovaný do daného okna.

Syntax: BOOL SetForegroundWindow, HWND hWnd  

HWND hWnd: Handle okna, ktoré chceme aktivovať a presunúť do popredia.

Výsledok funkcie: BOOL: Po úspešnom vykonaní funkcie sa vráti hodnota TRUE, inak sa vráti hodnota FALSE.

 

mciSendString

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Nie

winmm.lib

winmm.inc

Funkcia mciSendString pošle textový príkaz na MCI zariadenie. Druh zariadenia, ktorému je príkaz určený, je definované v samotnom príkaze. MCI (Media Control Interface) je vysoko-úrovňový príkazový interface pre multimediálne zariadenia a resource súbory. MCI poskytuje aplikáciám na zariadení nezávislú schopnosť pre ovládanie resp. kontrolovanie zvukových a vizuálnych periférií. Vaša aplikácia môže použiť MCI (Media Control Interface) na ovládanie resp. kontrolovanie ľubovoľných podporovaných multimediálnych zariadení, vrátane waveform-audio, MIDI sekvencií, CD audio, a digital -video (video playback) zariadení. MCI štandardne poskytuje príkazy pre  prehrávanie a nahrávanie multimediálnych súborov. Tieto príkazy sú spoločným interface-om k v skutočnosti každému druhu multimediálneho zariadenia.

Syntax: MCIERROR mciSendString, LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback

LPCTSTR lpszCommand: Ukazovateľ na nulou zakončený reťazec obsahujúci MCI príkaz. Príkaz môže byť jeden z nasledujúcich: break, capability, capture, close, configure, copy, cue, cut, delete, escape, freeze, index, info, list, load, mark, monitor, open, paste, pause, play, put, quality, realize, record, reserve, restore, resume, save, seek, set, setaudio, settimecode, settuner, setvideo, signal, spin, status, step, stop, sysinfo, undo, unfreeze, update, where, window. Nás bude zaujímať spomedzi všetkých týchto príkazov - príkaz set. Za príkazom set nasledujú tri parametre lpszDeviceID, lpszSetting, lpszFlags.

LpszDeviceID – Identifikátor MCI zariadenia.

LpszSetting – Nasledujúca tabuľka obsahuje zoznam typov zariadení, ktoré možno použiť za príkazom set.

Hodnota

Význam

Význam

cdaudio

audio all off
audio all on
audio left off
audio left on
audio right off
audio right on

door closed
door open
time format milliseconds
time format msf
time format tmsf

digitalvideo

audio all off
audio all on
audio left off
audio left on
audio right off
audio right on
door closed
door open

file format format
seek exactly on
seek exactly off
speed factor
still file format format
time format frames
time format milliseconds
video off
video on

overlay

audio all off
audio all on
audio left off
audio left on
audio right off

audio right on

door closed
door open
video off
video on

sequencer

audio all off
audio all on
audio left off
audio left on
audio right off
audio right on
door closed
door open
master MIDI
master none
master SMPTE
offset time

port mapper
port none
port port_number
slave file
slave MIDI
slave none
slave SMPTE
tempo tempo_value
time format milliseconds
time format SMPTE fps
time format SMPTE 30 drop
time format song pointer

vcr

assemble record on
assemble record off
audio all off
audio all on
audio left off
audio left on
audio right off
audio right on
clock time
counter format
counter value
door closed
door open
index counter
index date
index time
index timecode
length duration
pause timeout
postroll duration - duration

power on
power off
preroll duration duration
record format SP
record format LP
record format EP
speed factor
time format frames
time format hms
time format milliseconds
time format msf
time format SMPTE fps
time format SMPTE 30 drop
time format tmsf
time mode counter
time mode detect
time mode timecode
tracking plus
tracking minus
tracking reset

videodisc

audio all off
audio all on
audio left off
audio left on
audio right off
audio right on
door closed

door open
time format frames
time format hms
time format milliseconds
time format track
video off
video on

waveaudio

alignment integer
any input
any output
audio all off
audio all on
audio left off
audio left on
audio right off
audio right on
bitspersample bit_count
bytespersec byte_rate

channels channel_count
door closed
door open
format tag pcm
format tag tag
input integer
output integer
samplespersec integer
time format bytes
time format milliseconds
time format samples

lpszFlags – Tento parameter môže nadobúdať hodnoty  "wait", "notify", alebo obidve.

Tvar príkazu set v našom prípade teda bude:

OpenCD db "Set CDAudio Door Open Wait",0

a

CloseCD db "Set CDAudio Door Closed Wait",0

LPTSTR lpszReturnString: Ukazovateľ na buffer kam uloží získaná návratová informácia. Ak návratovú informáciu nepotrebujete, tento parameter môže byť NULL.

UINT cchReturn: Veľkosť buffra lpszReturnString. Ak parameter lpszReturnString je rovný NULL potom aj veľkosť buffra cchReturn nastavte na NULL.

HANDLE hwndCallback: Handle pre spätné volanie window, ak bol "notify" flag špecifikovaný v príkazovom reťazci.

Výsledok funkcie: MCIERROR: Po úspešnom vykonaní funkcie sa vráti nula, inak sa vráti hodnota rôzna od nuly. Pre bližšie určenie prípadnej chyby použite funkciu mciGetErrorString.

Literatúra

  1. Simon: R. J.:  Gouker: M.:  Barnes: B. C.: Win32 API zväzok 1: 2: 3: UNIS publishing: Brno: 1997
  2. Richter: J.: Windows pro pokročilé a experty: Computer Press: Praha: 1997
  3. Petzold: Ch.: Programovaní ve Windows – Win32 API: Computer Press: Praha: 1999

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Ako funguje sandbox?

08.12.2016 15:36

Každá aplikácia môže pre operačný systém počítača či mobilného zariadenia predstavovať potenciálnu hrozbu, a to aj v prípade, ak neobsahuje žiadne bloky škodlivého kódu. Murphyho zákony neúprosne defi ...

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá