c # - GetWindowText vs Process.MainWindowTitle

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at få procesoplysninger til den aktuelle aktive applikation (eller vindue) ved hjælp af .Net/C #.


I øjeblikket bruger jeg


[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();


For at få det aktuelle aktive vindue.
Jeg forstår der er ingen indfødt måde at gøre dette på end at bruge denne API-funktion.


Derefter bruger jeg:


[DllImport("user32")]
private static extern UInt32 GetWindowThreadProcessId(IntPtr hWnd, out Int32 lpdwProcessId);


For at få det procesnavn, der tilhører vinduet, og så får jeg yderligere procesoplysninger.


Jeg bruger også


[DllImport("user32.dll")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);


For at få den aktuelle Window Text eller billedtekst.


Nu kan jeg bruge procesklassen
    MainWindowTitle
for at få hovedvinduets titel også.


Sagen er, MainWindowTitle og GetWindowText returnerer ikke de samme oplysninger.


Lad os f.eks. Sige, at hovedapplikationen åbnet er 'Toad' med en forbindelse og en editor åben.
Så får jeg med GetWindowText:


"Toad for Oracle - myConnection - Somequery.sql".


og Process.MainWindowTitle returnerer


"myConnection".


Så spørgsmålet er, hvordan får jeg nøjagtig samme tekst som jeg bruger GetWindowText, men bruger bare .Net-klasser?


Redigere:
Jeg fandt ud af, at egentlig årsagen er simpelthen fordi begge funktioner ikke spørger det samme vindueshåndtag.
Vinduet håndtaget returneres i GetForegroundWindow, er nummeret 198982.
Og MainWindowHandle-ejendommen, som jeg formoder, er den, der bruges i MainWindowTitle propery, er nummeret 198954.
Ved hjælp af Spy ++ kunne jeg finde og bekræfte, at disse vinduer håndterer billedtekst er den, der returneres af deres tilsvarende funktion.


Så er 'problemet', hvis det er tilfældet, at procesklassen ikke korrekt identificerer det forreste vindue som hovedvinduet.

Bedste reference


GetForegroundWindow giver dig det aktive vindue brugeren arbejder i, og det kan være et ejet vindue eller en modal dialog, ikke nødvendigvis applikationens hoved/rodvindue.


MainWindow er et .NET koncept, native win32 har ikke sådan en ting, og der kan være 0, 1 eller flere 'hovedvinduer' i en applikation.


Nogle Delphi/C ++ Builder applikationer har en HWND til proceslinjeknappen, og hver formular er et ejet vindue tilhørende dette 'usynlige' vindue. Andre brugergrænseflader kan trække lignende stunts, der kan forvirre 'hovedvinduet' detektion.


Du kan bruge UI Automation til at inspicere andre applikationer, hvis du ikke vil bruge p-påkald. Start med forgrundsvinduet og gå op i træet af ejede og barnevinduer ... [7]