Potřeboval bych vědět, zda jde ve Windows spustit už vytvořený program tak, aby místo na obrazovku zobrazoval informace do matasouboru ....(nevím, jestli je to vůbec možné) .... a taky jestli jde okno minimalizovat tak, že je vidět jen ta malá ikonka na liště vedle hodin ..................díky za radu
Fórum › C / C++
Metasoubory
nevim jestli chapu presne ale da se udelat presmerovani vystupu... pokud je to konzolovej program...
prog.exe >vystup.txt
pokud je to neco jinyho tak tezko rict...
Ziskat handle sveho okna a schovat ho.A pro vypis pouzit primo nejakou funkci pro zapis do souboru.
Aha,no tim handlem by slo ji schovat,ale jak presmerovat jeji vystup me tedka jaksi moc nenapada.Max ji hooknout funkce,ktere pouziva pro vypis a ziskat z nich data.
To se prave nazvya hookovani.Po provedeni hooku si nastavis,co se ma provest,kdyz se dana funkce vola a nejak ji ovlivnit.Ale neni to nic lehkyho a jestli si chces zaznamenavat samotny vykreslovani,tak teda nevim presne,jaky api odchytavat.A navic,pokud je OS dost chytry,tak to nemusi vykreslovat vubec,pokud rozpoznava,ze je okno skryte.
Tohle uz jsou docela hodne tezke cary mary a vyzadovalo by to hodne studovani.Navic funkci pro GDI kresleni je strasne moc a vsechno odhookovat by byl problem.
Ale mam dojem,ze jsem kdysi videl nejaky zdrojovy kod,ktery dokazal udelat screen nejakeho programu(neco jako hypesnap dx).Ale porad narazim na problem,ze to nic nevykresli,kdyz to okno bude schovane.
To dannyk : Vždyť by nemuselo být schovaný, stačilo by, kdyby se zapisovalo jen do kompatibilního kontextu zařízení, jako třeba když se načítá bitmapa (nevim jak v API ale v MFC nejdřív se ta bitmapa nahraje do kompatibilního kontextu zařízení a až pak ten se pak zkopíruje na obrazovku, takže by stačilo kdyby se na tu obrazovku nezkopíroval, ale třeba uložil)
CBitmap bmp;
void CBlat2View::OnDraw(CDC* pDC)
{
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
// Copy the bits from the in-memory DC into the on-
// screen DC to actually do the painting. Use the centerpoint
// we computed for the target offset.
pDC->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
0, 0, SRCCOPY);
}
takže kdyby se v tej přehookovanej funkci získal normální kontext zařízení, podle něj by se vytvořil kompatibilní, pak by se ten normální smazal a zůstal by jen ten kompatibilní, kterej by se používal, tak by se to teoreticky ani na tu obrazovku zobrazovat nemuselo?
To asi nemuselo,ale tohle je trochu uz mimo me znalosti a musel bych si problem nejak presneji prostudovat.Urcite to bude s tema device contextama a vykreslovanim,ale fakt nevim vsechny potrebne api funkce.Vidim to na jednu krasnou teplou noc stravenou nad MSDN :)
To dannyk : To já jen plácám co mě zrovna napadne, takže jsou nejspíš velký bláboly .... Jen mě ještě zajímá, jak poznám jestli byl ten program napsán ve WinAPI ? (nebo to přehookování těch funkcí pro zisk kontextu platí pro všechny knihovny a tak?)
Tohle uz zavani reverznim inženýrstvím.Pomoci nejakeho nastroje na vypis importovanych metod zjistis,jake funkce dany program pouziva.Zvladne to napriklad PE Explorer:
http://www.heaventools.com/
Tam si nech vypsat list Importu a uvidis,kolik winapi a jakych funkci program pouziva.Jestli je psan "ciste" winapi,tak pak bys mel hledat main funkci pro winapi WinMain,ale ta by mela byt v export listu.
Moc jsem to nečetl, ale nešlo by třeba poslat programu zprávu WM_PAINT a jako DC poskytnout nějaké svoje vlastní (ale asi bude problém s předáváním DC a adresy na něj mezi procesy... takže by možná byl potřeba ten hook.. ale ten by mohl tu zprávu poslat).
A každý program, který ve Windows vytváří okna musí používat WinAPI (a to i když používá nějakou mezivrstvu jako Windows.Forms, wxWidgets, GTK apod.)
No ten hook na WM_PAINT by mohl jit,ale nenapada me tedka,jak by se tam dalo predat ten DC.
Ano,kazdy program pouziva WinAPI,ale nebylo zde nejak receno,jestli to neni konzolový program.
proc nepouzijes sdilenou plochu? samo potrebuje to jeste upravit par veci ve win aby se dalo pripojit na jednom pocitaci vicekrat
ale pod jednim uctem to nechas bezet - v druhem to nebude videt ale muzes se kdykoliv prihlasit na ten prvni a kouknout...
Nj,ale ja mam porad za to,ze pokud system detekuje,ze se to proste nema kreslit na plochu,tak to kresleni preskoci.
S tou dvoji plochou je to zajimavy napad,ale pokud to ma byt univerzalni,tak asi ee.
Vsak ja nemam nic proti,ja jen rikam svoje,co si myslim :) Mozna bude nekdo zkusenejsi a rozvede tvuj napad nebo vyvrati moje pochybnosti ;)
Tak to uz poradne nevim.Nikdy sem nehookoval.Zkusil bych asi google s "winapi hooking" nebo necim podobnym.
Zdravim,
koukam, ze se to tu nejak rozrostlo. No a co se tyka typu haku, tak pokud chces zachytavat i cizi procesy, tak nejlepsi bude asi pouziti globalniho haku(v DLL). Mozna by ti pomohl clanek pana Radka Chalupy
http://www.radekchalupa.cz/clanky/?kod=205&obsah=48
a
ttp://www.radekchalupa.cz/clanky/?kod=205&obsah=47
To MaS : Obávám se, že žádná API funkce na nastavení DC pro okno není a hook na WM_PAINT zde nepomůže. Ten DC zcela jistě není parametrem WM_PAINT a vzniká již s vytvořením okna tak, aby byl kompatibilní s aktuálním zobrazovacím zařízením, na kterém je okno vytvořeno.
Kreslení do neviditelného okna je problémem, protože WM_PAINT vždy kreslí jen do viditelné části, neviditelné jsou při kreslení oříznuty. Sejmutí obsahu může mít potom za následek nekompletní obraz. Více zde:
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/b61cba3e-e83d-45da-8604-6eacff76dd94/
1. Jak už tu zaznělo, výstup v bitmapě by znamenal vytvořit pomocnou funkci, která by kreslila obsah do zadaného DC. Pokud by se zavolala obsluha WM_PAINT, jako vstupní parametr této funkce by se vložila hodnota z GetDC(), v případě "sejmutí" by se funkce zavolala s pomocným DC vytvořeným pomocí CreateMemoryDC a z ní následně uložila do souboru.
2. Další podobná možnost je přes WM_PRINT, který má jako vstupní parametr DC, viz zde:
http://www.fengyuan.com/article/wmprint.html
3. Využití funkce CreateEnhMetaFile pro vektorový výstup a přímo vytvoření .emf souboru. Ta funkce vytvoří nový DC, do kterého je možné nakreslit celý obrázek, podobně jako ve funci WM_PAINT.
Všechny tři možnosti předpokládají, že je potřeba uložit jen to, co se kreslí v obsluze WM_PAINT přes DC získaný přes GetDC(). Nebude fungovat zobrazení prvků a podřízených oken, ty se totiž kreslí samostatně.
To MaS : Okraje oken, ikony a ostatní podobné věci systém obsluhuje ve funkci DefWindowProc, pokud si je aplikace nekreslí sama. To dovoluje nastavit a jednotně měnit vzhled všech oken ve vlastnostech zobrazení.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Moderátoři diskuze