|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
![]() |
||||||||||
|
|
|||||||||
Diskuzní forum: DelphiTéma diskuze: Diskuse o vývojářském nástroji DelphiTip: nemáte rádi v textu smajlíky? Ruší vaše zdrojové kody? Vypněte si je! (Moje nastavení / Nastavení soukromí) Odchycení WinApi
Vloženo uživatelem: djgladiator - uživatel již zaslal 28 příspěvků (IP uloženo)
Datum: 01. 02. 2010 16:20
Ahoj všichni,
potřebuji pomoci s odchycením message WinApi. Jde mi o to, že bych chtěl reagovat na nějakou WinApi message (třeba na spuštění nějakého jiného programu.) Třeba zobrazit hlášku, že "Byl spuštěn WinAmp" na základě WinApi message CreateFileW (parametr: lpFileName = 0x16F914 "C:\Program Files\Winamp\Winamp.exe") Tohle jsem odchytil API Monitorem, ale potřebuji to naimplementovat do mého projektu v Delphi a brát to jako událost, na kterou mohu nějak reagovat, třeba právě zobrazením informativní hlášky. Děkuji moc za pomoc. Petr Re: Odchycení WinApi
Vloženo uživatelem: Neregistrovaný uživatel: Napakunk (IP uloženo)
Datum: 01. 02. 2010 22:01
Myslím,že by to mohlo jít hákováním.
Můžeš třeba zkusit kouknout i na madCollection: http://www.madshi.net/ Re: Odchycení WinApi
Vloženo uživatelem: Amper_cz - uživatel již zaslal 68 příspěvků (IP uloženo)
Datum: 02. 02. 2010 08:33
Ahoj
trochu motas vic veci do kupy. CreateFile neni message ale volani funkce. Predpokladam ze driver pro windows psat nechces takze jde o to co presne potrebujes : - chytat vytvareni okna - lze pomoci windows event hooku (vyhoda je ze je to out process) nebo pomoci system hooku - chytat opravdu messages - na to je nejlepsi system hook, tva dll je nainjektovana do exe takze ho muzes pripadne i zabit nebo mu upravovat messages - override funkci se da taky implementovat ale je to o hubu pokud se tam sejde vic veci jako jsi ty a/nebo bezis na 64bitech bud konkretnejsi co chces a na co to chces Re: Odchycení WinApi
Vloženo uživatelem: djgladiator - uživatel již zaslal 28 příspěvků (IP uloženo)
Datum: 02. 02. 2010 10:13
Ahoj,
jde o to, že potřebuji odchytávat spouštění vytipovaných programů (např. WinAmp, BSPlayer, Firefox, Outlook/Thunderbird) na které budu dále reagovat. Potřebuji právě tuto informaci, že byl ten daný program spuštěn a potom podle toho, který program je právě spuštěn, budu zobrazovat potřebné informace na displayi, který mám připojen přes LPT. Zobrazení na display mám už vyřešené, ale potřebuji udělat to odchytávání spouštění. Nejlepší by to bylo udělat to jako Událost, ale není to podmínkou. Díky za radu. Petr Re: Odchycení WinApi
Vloženo uživatelem: JiriValerian (Jiří Valerian) - uživatel již zaslal 12524 příspěvků (IP uloženo)
Datum: 02. 02. 2010 10:59
djgladiator Napsal:
------------------------------------------------------- > Ahoj, > > jde o to, že potřebuji odchytávat spouštění > vytipovaných programů (např. WinAmp, BSPlayer, > Firefox, Outlook/Thunderbird) na které budu dále > reagovat. > > Potřebuji právě tuto informaci, že byl ten daný > program spuštěn a potom podle toho, který program > je právě spuštěn, budu zobrazovat potřebné > informace na displayi, který mám připojen přes LPT. > > Zobrazení na display mám už vyřešené, ale > potřebuji udělat to odchytávání spouštění. > > Nejlepší by to bylo udělat to jako Událost, ale > není to podmínkou. > > Díky za radu. > > Petr Na to získávat jen informaci o tom, že byl nějaký program spuštěn je hákování API doslova šíleně komplikovaným kanónem na vrabce. K tomu co zmiňujete Vám musí stačit v nějakém časovači občas třeba jednou za jednu či několik sekund udělat výčet zrovna běžících procesů přes Win API funkce CreateToolhelp32Snapshot/Process32First/Process32Next/CloseHandle viz odkaz na ukázku výčtu. http://forum.builder.cz/read.php?18,3165835,3165866#msg-3165866 Re: Odchycení WinApi
Vloženo uživatelem: djgladiator - uživatel již zaslal 28 příspěvků (IP uloženo)
Datum: 02. 02. 2010 11:14
JiriValerian Napsal:
------------------------------------------------------- > Na to získávat jen informaci o tom, že byl nějaký > program spuštěn je hákování API doslova šíleně > komplikovaným kanónem na vrabce. K tomu co > zmiňujete Vám musí stačit v nějakém časovači občas > třeba jednou za jednu či několik sekund udělat > výčet zrovna běžících procesů přes Win API funkce > CreateToolhelp32Snapshot/Process32First/Process32N > ext/CloseHandle viz odkaz na ukázku výčtu. > > http://forum.builder.cz/read.php?18,3165835,316586 > 6#msg-3165866 > Díky za nápad, toto řešení mne taky napadlo. Ale nepřijde mi to moc "hezké" řešení. Myslel jsem, že odchycení zavolání přesně definované API funkce nebude tak těžké a přijde mi to správnější reagovat na událost spuštění, než každou vteřinu koukat, jestli už náhodou není spuštěn... Ale je to jen můj názor, který mi možná někdo vyvrátí. Nicméně to vypadá, že mi asi nic jiného nezbyde... Pokud by tedy ještě někdo věděl, jak odchytit zavolání API funkce, budu rád, když mi pomůžete. Petr Re: Odchycení WinApi
Vloženo uživatelem: Amper_cz - uživatel již zaslal 68 příspěvků (IP uloženo)
Datum: 02. 02. 2010 12:43
podivej se na SetWinEventHook s nastavenim napr :
WinHook := SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_SHOW, 0, WinEventHook, 0, 0, WINEVENT_OUTOFCONTEXT or WINEVENT_SKIPOWNPROCESS); kde WinEventHook je funkce procedure WinEventHook(hWinEventHook: THandle; event: DWORD; hwnd: HWND; idObject, idChild: Longint; idEventThread, dwmsEventTime: DWORD); stdcall; dostanes pak tento event pri kazdem vytvoreni okna Pres api si pak zjistis zda je to okno ktere te zajima nebo ne pripadne muzes reagovat tak ze pres toolhelp zjistis procesy resp. zda je najety proces ktery te zajima a odpadne silene scanovani jednou za sekundu Jen pozor ze tech eventu vali docela dost tak to chce trochu pofiltrovat. Od MS se da stahnout (v baliku kolem podpory Accessible) utilitka accevent32.exe ktera ti ukaze to co vsechno windows posilaj timdle zpusobem a muzes si vybrat co budes chytat nebo nebudes Re: Odchycení WinApi
Vloženo uživatelem: djgladiator - uživatel již zaslal 28 příspěvků (IP uloženo)
Datum: 04. 02. 2010 14:07
Amper_cz Napsal:
------------------------------------------------------- > podivej se na SetWinEventHook s nastavenim napr : > > WinHook := > SetWinEventHook(EVENT_OBJECT_CREATE, > EVENT_OBJECT_SHOW, 0, WinEventHook, 0, 0, > WINEVENT_OUTOFCONTEXT or > WINEVENT_SKIPOWNPROCESS); > > > kde WinEventHook je funkce > > procedure WinEventHook(hWinEventHook: THandle; > event: DWORD; hwnd: HWND; idObject, idChild: > Longint; idEventThread, dwmsEventTime: DWORD); > stdcall; > > dostanes pak tento event pri kazdem vytvoreni > okna > > Pres api si pak zjistis zda je to okno ktere te > zajima nebo ne pripadne muzes reagovat tak ze pres > toolhelp zjistis procesy resp. zda je najety > proces ktery te zajima a odpadne silene scanovani > jednou za sekundu > > Jen pozor ze tech eventu vali docela dost tak to > chce trochu pofiltrovat. > > Od MS se da stahnout (v baliku kolem podpory > Accessible) utilitka accevent32.exe ktera ti ukaze > to co vsechno windows posilaj timdle zpusobem a > muzes si vybrat co budes chytat nebo nebudes > > Dobrý den, díky za skvělou radu, přesně toto hledám. Přesto bych Vás rád požádal, zda byste mi nemohl poskytnout třeba část fungujícího kódu... Navím, jestli je WinEventHook funkce dle textu nebo procedura dle kusu kódu a nevím, jak jednotlivé proměnné deklarovat ani nechápu, čím udávám, co chci odchytnout z toku zpráv WinApi.. Díky za pomoc. Petr Re: Odchycení WinApi
Vloženo uživatelem: Amper_cz - uživatel již zaslal 68 příspěvků (IP uloženo)
Datum: 04. 02. 2010 17:35
toto nechyta winapi messages ale accessible messages
Koukal jste na ten accevent32 ? takto vypada ta funkce : procedure WinEventHook(hWinEventHook: THandle; event: DWORD; hwnd: HWND; idObject, idChild: Longint; idEventThread, dwmsEventTime: DWORD); stdcall; var Parent: DWORD; Style: DWord; begin try Log('WinEventHook - event' + inttostr(event) + ' idobject:' + inttostr(idObject) + ' idChild:' + inttostr(idChild) + ' window $:' + inttohex(hwnd, 6) + ' parent $' + inttohex(GetParent(hwnd), 6)); if (idObject = 0) and (idChild = 0) then begin parent := GetParent(hwnd); Style := GetWindowLong(hwnd, GWL_STYLE); if (Parent = 0) or ((style and ws_popup) <> 0) then begin v tomdle pripade by jsme meli mit pouzitelne okno end; end; except end; end; var WinHook: THandle; registrace : WinHook := SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_SHOW, 0, WinEventHook, 0, 0, WINEVENT_OUTOFCONTEXT or WINEVENT_SKIPOWNPROCESS); unregistrace : UnhookWinEvent(WinHook); Toto je podle mne funkcni i kdyz jsem to teda nezkousel R Toto fórum je provozováno také jako emailová konference s e-mailovou adresou delphi [a] builder.cz. Toto je neredigovaná a nemoderovaná diskuse čtenářů serveru Builder.cz. Redakce ani provozovatel serveru za obsah jednotlivých příspěvků nenese zodpovědnost. |