02. august 2008 - 18:27Der er
13 kommentarer og 2 løsninger
Læse tekst fra andre vinduer?
Hej eksperter,
Hvordan kan man lettest læse tekst fra andre vinduer med C#? Hvis jeg f.eks. har behov for at finde tegnet efter første forekomst af strengen "Spørgsmål & Sva" (skulle gerne give 'r' for en browser med Eksperten åbnet). Kan man hente indholdet af Labels, noget lignende, eller skal man analysere skærmbilledet pixel for pixel? Vejledning søges!
Et top-level vindue i Windows består af flere små undervinduer, og hver control i Win32 eller Windows Forms er et vindue. Disse har alle en text og er unikt identificeret ved et window handle (hWnd). Der findes en Win32 funktion, GetWindowText, som returnerer texten for et vindue, som du kan bruge i C# vha. DllImport.
Dvs. teoretisk er din opgave blot at finde det rigtige hWnd, og bruge GetWindowText. Det svære er selvfølgelig at finde det rigtige hWnd, da der typisk vil være rigtig mange forskellige (idet alle visuelle elementer typisk har et hWnd). Prøv at starte Spy++ (er en del af Visual Studio, mener den kommer med per default hvis du har installeret C++ compileren); så kan du se hvilke vinduer der findes på dit system netop nu.
NB! Ovenstående gælder i øvrigt ikke for WPF programmer ;-)
Synes godt om
Slettet bruger
02. august 2008 - 19:47#3
Det lyder avanceret. Lad mig lige se, om jeg har forstået det: Jeg skal finde det specifikke handle til det ønskede vindue, hvorefter jeg har direkte adgang til al tekst i vinduet? Hvordan virker det mere præcist? Jeg kikker lige på Spy++.
Windows Programmer: Du skal finde dit vindue ud fra en overskrift eller dit handle (søg på C# og FindWindow) så har du adgang til alle top level vinduer i det andet program. Der er andre vinduer i et program, fx knapper, tekstbokse mv. men det er lidt mere specielt da de er ejet af processen og alle top level vinduer. For at komme til dem skal du injecte en dll ind i processen og subclasse det vindue du vil have, så kan du komme til dets funktionalitet. Hvis det er en mere speciel kontrol du subclasser er det ikke sikkert du kan komme til dets skrive metoder. I det til fælde skal du have overstyret funktionerne "GdiDrawText, DrawText, DrawTextEx" og ti ldette formål skal du bruge Detours biblioteket fra Microsft...
Web: Brug en WebClient eller lignende klasse og parse HTML
Synes godt om
Slettet bruger
04. august 2008 - 08:55#5
Hmm... Faktisk tror jeg, jeg kan klare mig med læsning af kildekoder til HTML-sider. Lige te øjeblik.
Synes godt om
Slettet bruger
04. august 2008 - 09:13#6
Ok. Hvordan kan jeg så med C# "besøge" en hjemmeside? Altså f.eks. bede om at få Eksperten.dk (som I en browser) og få en streng med den kildekode, serveren ville have sendt, hvis klienten havde været en browser? Dvs. lade server tolke serverside scripts osv. inden afsending.
Uhh, nu begynder jeg snart at savle :) Det lyder sgu lækkert! Jeg kikker lige på det om snart.
Synes godt om
Slettet bruger
05. august 2008 - 16:49#9
Duh, duh, duh... Nu bliver det spændende. Hvad gør jeg med sessions og simulerede klik på links? Jeg ved godt, det kommer langt fra det oprindelige spørgsmål, så du siger bare til, hvis jeg skal oprette et nyt :P
Synes godt om
Slettet bruger
14. august 2008 - 10:40#10
Nå. Det sagde I slet ikke noget til overhovedet. Kunne I ikke smide nogle svar så?
Ang. de simulerede links, så er det jo ikke andet end at tage den URL der måtte stå i href på a tags du kan finde i markuppen, og rette et HttpWebRequest mod den. Så kan du få fat i det information der linkes til. Du kan sikkert bruge en regular expression til at finde de links du måtte være interesseret i.
Synes godt om
Slettet bruger
18. august 2008 - 20:10#15
Mange tak :) Jeg kikker muligvis på det, når jeg får rystet nogle af mine andre projekter af mig.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.