KdokolivTo ti rád pomůžu. Ve windows je okno a aplikace dvě věci. Pokud bys chtěl postupovat od oken, pak možná je lepší hledat podle class než podle titulku (GetClassName).
Můžeš získat daného okna číslo procesu (GetWindowThreadProcessId) a z ID processu můžeš získat pomocí GetProcessPathName (což je ten kus kódu na ruských stránkách), získat jméno aplikace
Druhá varianta je postupovat od procesů, nalézt si svou hledanou aplikaci a k ní najít její okno. Dělá se to takto:
Nejprve si necháš sestavit list aktivních procesů: CreateToolhelp32Snapshot
Pomocí (Process32First) a (Process32Next) najdeš svůj process. Pak ale musíš enumerovat všechny thready procesu (ono možná to jde rovnou, já teď nevím, otázkou je, zda jsi pomocí toolhelpu získat z threadu jméno procesu, ale asi ne). Dělá se to tak, že si zase necháš sestavit list threadů a procházíš je tak dlouho, dokud nenarazíš na thready vyvoleného procesu. No a poté pro každý thread zadaného procesu necháš enumerovat všechny jeho okna (EnumThreadWindows). Pomocí funkce GetWindow(hWnd,GW_OWNER)==NULL najdeš jen ty, co jsou top-level. Jak vidíš, může to být víc oken, takže další identifikaci stejně budeš muset udělat přes titulek nebo class.
Má to pár zádrhelů. Ve Window2000 z nějakých důvodů je jméno procesu useknuto na 12 znaků. Lze to obejit, stačí si od procesu nechat vypsat všechny moduly, a první modul je většinou jméno EXE i s jeho cestou (takhle já hledám okno aplikace, kterou jsem spustil a potřebuji s ní komunikovat).
Co se češtiny týče, tak od Win2000 a výš jsou všechny titulky okna UNICODE. Pokud aplikace není UNICODE, pak používá kódovou stránku CP_THREAD, což je aktuální kódová stránka threadu. Všechny ne-UNICODE příkazy pak text převádí podle CP_THREAD do UNICODE. Tady bych doporučil překládat v UNICODE, vyhneš se problémům. Pokud nic neřekneš, platí, že aplikace má CP nastavenou podle nastavení národního prostředí ve Windows.
A ještě ke konzolím. Konzole má na starost vláštní modul v jádře. Aplikace běžící v konzoli nemá žádná okna, takže ji nemůžeš najít na desktopu. Co najdeš je její konzoli, ale velice záhy zjistíš, že vlastní okno patří jiné aplikaci (jestli to vůbec najdeš). Konzolové okno samozřejmě kontroluje, zda velikost písma a počet znaků konzole odpovídá zadané velikosti a případně upraví velikost tak, aby se dodržel počet řádků a sloupců. Když konzolové okno zavřeš, zavolá funkci definovanou v SetConsoleCtrlHandler. Aplikace na to může reagovat a když neudělá nic, tak to aplikaci ukončí přes ExitProcess.
Muzes zkusit konzolové okno Maximalizovat (ShowWindow). Aby šlo okno libovolně zvětšovat můsí to mít povolené, třeba automatickou volbu velikosti písma. Ale jinak to dělá to co popisuješ. Lze jej zmenšit (objeví se scrollbary), ale přes 80x25 se nedostaneš. O konzolích se dozvíš něco tady, třeba budeš chytřejší |