windows - Hooking ExtTextOut (GDI API)

Indlæg af Hanne Mølgaard Plasc

Problem



Hej,



Jeg henter ExtTextOut API for at hente tekst i en bestemt position fra et hvilket som helst applikationsvindue (for eksempel teksten under markøren/caret i MS Word).
I de fleste tilfælde er jeg i stand til at hente teksten fra ExtTextOut-funktionen og også dens placering.


BOOL ExtTextOut(
  \_\_in  HDC hdc,
  \_\_in  int X,
  \_\_in  int Y,
  \_\_in  UINT fuOptions,
  \_\_in  const RECT *lprc,
  \_\_in  LPCTSTR lpString,
  \_\_in  UINT cbCount,
  \_\_in  const INT *lpDx
);


Placeringen af ​​teksten hentes på et af følgende måder:



  1. Det er angivet i ExtTextOut-funktionen i klipningsrektionen
    parameter (const RECT * lprc - det er en valgfri parameter)

  2. Det er angivet som parametrene X, Y strengposition ExtTextOut (i forhold til vindueklientrektangel).

  3. Retretér rektanglet omkring teksten fra enhedens kontekst ved hjælp af et af de medfølgende API'er til klipningsområder/-stier, for eksempel GetClipBox/GetClipRgn API.


    int GetClipBox (
      \_\_ i HDC hdc,
      \_\_out LPRECT lprc
    );
    int GetClipRgn (
      \_\_ i HDC hdc,
      \_\_in HRGN hrgn
    );



(Http://msdn.microsoft.com/en-us/library/dd183435(v=VS.85).aspx)[2]


Problemet er, at ingen af ​​disse metoder til at hente tekstens placering virker i nogle applikationer. Desuden er det mere frustrerende, at når du bruger nogle af API'erne til at hente regionen/stien fra enhedens kontekst, returnerer den med succes og angiver, at der ikke er nogen region/sti til den pågældende enhedskontekst.


Mine spørgsmål:



  1. Hvordan kunne det være, at der ikke er nogen region/vej til en enhedskontekst?

  2. Er der nogen anden måde at hente tekstens position (eller rektangel) på, da jeg forstår, at positionen skal specificeres et sted for at tegne det endelig på skærmen?



Enhver hjælp vil blive værdsat.


Tak,


Momico.

Bedste reference


Hvis en applikation opretter en hukommelse DC og bruger disse funktioner, kan du ikke se x, y af den skrevne tekst.
Derefter vil du se en bitblt dumping hukommelsesbufferen til vinduet DC. Det er mere kompliceret, men du kan koble bitblt for at se den relative position af hukommelsen DC i vinduet, og du vil være i stand til at beregne positionen af ​​teksten i bitblt operationen.

Andre referencer 1


Kan problemet skyldes programmer, der bruger dobbeltbuffet maleri?


dvs. Teksten kan blive gjort til en eller flere midlertidige DC'er, som derefter blitteres til den 'rigtige' DC.


Med dem du får koordinater, men de vil ikke altid matche de endelige koordinater, og de involverede HDC'er kan kun eksistere i et kort øjeblik og ikke være dem, der ses i vinduet/på skærmen.