Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Text aus verschiedenen Anwendungen auslesen

76 views
Skip to first unread message

Dominik Amon

unread,
Aug 12, 2008, 10:10:28 AM8/12/08
to
Hallo

Ich stelle eine generelle Frage in den Raum: Ich soll heraus finden, wie
schwer/leicht es möglich ist, aus Anwendungen wie Word, Excel, dem Internet
Explorer, Adobe PDF Dokumenten, einen selektierten Text zu ermitteln (und
danach auszuwerten)

Ähnlich macht das zb Skype im Internet Explorer, welches Telefonnummern
erkennt, die man dann auch gleich direkt anwählen kann.

Die Anforderungen die ich habe sind noch recht "schwammig", es hängt auch
ganz davon ab, wie schwer es ist, es umzusetzen.
Zur Umsetzung könnte ich mir vorstellen, dass man einen Text markiert und
man sich bei oben genannten Anwendungen in das Kontextmenü reinsetzt (wenn
das leicht möglich ist) oder - weil das wahrscheinlich einfacher ist - zb
durch eine globale Tastenkombination den gewählten Text verarbeitet.

Welche Erfahrungen habt ihr auf diesem Gebiet da schon gemacht? Was schlagt
ihr vor? Gibt es dafür vielleicht schon sogar fertigen Code?? Gibt es
bessere Alternativen?

Vielen Dank,
Dominik


Harald M. Genauck

unread,
Aug 12, 2008, 10:57:21 AM8/12/08
to
Hallo Dominik,

Skype macht das wohl nur, wenn man die/eine Skype-Toolbar installiert
hat? Ich habe Skype und auch den IE - und sehe da jedenfalls kein
derartiges Angebot.

Im IE geht das jedenfalls nur, wenn man sich auf irgendeine Weise in
das DOM-Modell einklinkt.

Bei anderen Anwendungen kann das sehr schwierig bis unmöglich werden.
Wenn der Text nicht markierbar ist, geht erst einmal gar nichts - außer
über irgendwelche ausgeklügelten eigene Markierungstechniken und
OCR-Verfahren.

Selbst bei Standard-Textboxen kann die Anwendung ein eigenes
Kontextmenü implementiert haben, so dass man da nicht auf eine
standardisierte Weis hineinkommen kann.

Und bei Anwendungen wie etwa Word oder Excel dürfte es auch schwierig
sein, einfach so von außen an den markierten Text heranzukommen.

Der letztlich praktikabelste Weg dürfte sein, per globaler
Tastenkombination oder per eigenem Kontextmenü (globaler Maus-Hook etwa
auf rechte Maustaste + Zusatztaste) den markierten Text in die
Zwischenablage einzufügen und von dort zu holen und zu verarbeiten.


Viele Grüße

Harald M. Genauck

"VISUAL STUDIO one" - http://www.visualstudio1.de (Chefredakteur)
"ABOUT Visual Basic" - http://www.aboutvb.de (Herausgeber)


Dominik Amon

unread,
Aug 12, 2008, 11:29:16 AM8/12/08
to
Hallo Harald,

> Der letztlich praktikabelste Weg dürfte sein, per globaler
> Tastenkombination oder per eigenem Kontextmenü (globaler Maus-Hook etwa
> auf rechte Maustaste + Zusatztaste) den markierten Text in die
> Zwischenablage einzufügen und von dort zu holen und zu verarbeiten.

das klingt ja gar nicht mal so schlecht eigentlich, kann man leicht auf den
markierten Text in den verschiedenen Anwendungen zugreifen?
Die Zwischenablage möchte ich dabei jedoch nicht übersschreiben!

Würde dass dann so aussehen [Psyeudo-Code]

Processes.ActiveProcess.ActiveWindow.SelectedText ?

Danke,
dominik


Herfried K. Wagner [MVP]

unread,
Aug 12, 2008, 1:05:26 PM8/12/08
to
"Dominik Amon" <dominik_...@linuxmail.org> schrieb:

>> Der letztlich praktikabelste Weg dürfte sein, per globaler
>> Tastenkombination oder per eigenem Kontextmenü (globaler Maus-Hook etwa
>> auf rechte Maustaste + Zusatztaste) den markierten Text in die
>> Zwischenablage einzufügen und von dort zu holen und zu verarbeiten.
>
> das klingt ja gar nicht mal so schlecht eigentlich, kann man leicht auf
> den markierten Text in den verschiedenen Anwendungen zugreifen?
> Die Zwischenablage möchte ich dabei jedoch nicht übersschreiben!
>
> Würde dass dann so aussehen [Psyeudo-Code]

Dazu gibt es leider keine einheitliche Möglichkeit. Bei normalen Textfeldern
kannst Du über PInvoke das aktive Steuerelement oder jenes unter der Maus
herausfinden, dann den Fensterklassennamen prüfen und anschließend, wenn es
sich um ein Textfeld handelt (Fensterklassenname "EDIT" oder viele andere,
benutzerdefinierte Namen) mit 'SendMessage' + 'EM_*' arbeiten, um den
gesamten Text oder die Auswahl in Deine Anwendung zu bekommen. Das .NET
Framework bietet hierzu keine vordefinierten Methoden.

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

G. Helbig

unread,
Aug 12, 2008, 4:28:00 PM8/12/08
to
ich denke, die beste Möglichkeit geht über die Zwischenablage +
Tastenkombi.
Du brauchst ja die Zwischenablage nicht überschreiben, merke dir was
drinne steht, lade deine Daten rein, speichere diese dann woanders ab und
lade die original Daten wieder. Bzw fällt mir gerade ein, über eine
globale Tastenkombi lädst du den selektierten Text in dein Tastenkombi
Programm und verarbeitest ihn dort.

Am 12.08.2008, 17:29 Uhr, schrieb Dominik Amon
<dominik_...@linuxmail.org>:

Harald M. Genauck

unread,
Aug 12, 2008, 4:40:08 PM8/12/08
to
Hallo Herfried,

> Dazu gibt es leider keine einheitliche Möglichkeit. Bei normalen
> Textfeldern kannst Du über PInvoke das aktive Steuerelement oder
> jenes unter der Maus herausfinden, dann den Fensterklassennamen
> prüfen und anschließend, wenn es sich um ein Textfeld handelt
> (Fensterklassenname "EDIT" oder viele andere, benutzerdefinierte
> Namen)

Eben... da fängt das Problem schon an - eine anwendungsneutrale Lösung
kann sicher nicht alle Varianten von TextBox-Klassennamen kennen.

> mit 'SendMessage' + 'EM_*' arbeiten, um den gesamten Text oder die
> Auswahl in Deine Anwendung zu bekommen. Das .NET Framework bietet
> hierzu keine vordefinierten Methoden.

Viele Grüße

Harald M. Genauck

unread,
Aug 12, 2008, 4:41:51 PM8/12/08
to
Hallo G.,

> ich denke, die beste Möglichkeit geht über die Zwischenablage +
> Tastenkombi.
> Du brauchst ja die Zwischenablage nicht überschreiben, merke dir was
> drinne steht, lade deine Daten rein, speichere diese dann woanders ab
> und lade die original Daten wieder.

Das könnte aber auch recht aufwändig werden, wenn andere Formate als
nur die Standard-Clipboard-Formate im aktuellen Zwischenablageinhalt
liegen.

Harald M. Genauck

unread,
Aug 12, 2008, 4:45:14 PM8/12/08
to
Hallo Dominik,

>> Der letztlich praktikabelste Weg dürfte sein, per globaler
>> Tastenkombination oder per eigenem Kontextmenü (globaler Maus-Hook
>> etwa auf rechte Maustaste + Zusatztaste) den markierten Text in die
>> Zwischenablage einzufügen und von dort zu holen und zu verarbeiten.

> das klingt ja gar nicht mal so schlecht eigentlich, kann man leicht
> auf den markierten Text in den verschiedenen Anwendungen zugreifen?
> Die Zwischenablage möchte ich dabei jedoch nicht übersschreiben!

Darum wirst Du nicht umhin kommen, wenn Du reguläre Textmarkierungen
verarbeiten möchtest.

Alles andere, was völlig eigenständig operieren soll, geht nur über
OCR-Techniken.

> Würde dass dann so aussehen [Psyeudo-Code]
>
> Processes.ActiveProcess.ActiveWindow.SelectedText ?

Wie Herfried schon meinte - da gibt es nix im Framework.

Frank Dzaebel

unread,
Aug 13, 2008, 2:38:35 AM8/13/08
to
Hallo Harald,

ich muss mal etwas die überzogenen Ausdrücke wie
"unmöglich", "schwierig", etc. relativieren.


> Und bei Anwendungen wie etwa Word oder Excel dürfte es auch schwierig
> sein, einfach so von außen an den markierten Text heranzukommen.

Zum Beispiel Excel (ganz grob!) :

MessageBox.Show(((Range)app.Selection).Value2.ToString());

> Im IE geht das jedenfalls nur, wenn man sich auf irgendeine Weise in das
> DOM-Modell einklinkt.

Muss nicht, es ginge auch etwa über: SendKeys.SendWait("^C");
oder SendMessage DTM_COPYSELECTIONTONEWISTREAM, etc..

Bei Vista können Schwierigkeiten bzgl. UIPI hinzukommen.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Dominik Amon

unread,
Aug 13, 2008, 3:54:17 AM8/13/08
to
Hallo Harald

> Alles andere, was völlig eigenständig operieren soll, geht nur über
> OCR-Techniken.
>
>> Würde dass dann so aussehen [Psyeudo-Code]
>>
>> Processes.ActiveProcess.ActiveWindow.SelectedText ?

Und was bedeutet das konkret? Ich mach einen Screenshot und werte den aus??
Ich hoffe es ist nicht ganz so kompilziert :-)

lg,
dominik


Dominik Amon

unread,
Aug 13, 2008, 3:53:02 AM8/13/08
to
hallo

> Bei Vista können Schwierigkeiten bzgl. UIPI hinzukommen.

Das Zielsystem wird Windows Vista sein - Was bedeutet "UIPI" - Nie gehört?

lg.
dominik


Frank Dzaebel

unread,
Aug 13, 2008, 4:12:19 AM8/13/08
to
Hallo Dominik,

>> Bei Vista können Schwierigkeiten bzgl. UIPI hinzukommen.
>
> Das Zielsystem wird Windows Vista sein - Was bedeutet "UIPI" - Nie
> gehört?

Vista ist ja auf einem höheren Sicherheitsstandard.

UIPI (User Interface Privilege Isolation) ist einer der
Verfahren, die helfen, Admin-Prozesse von tiefer berechtigten
Prozessen auf dem gleichen Desktop zu isolieren.

[Windows Vista Application Development Requirements for User Account Control
(UAC)]
http://msdn.microsoft.com/en-us/library/aa905330.aspx

Ein Prozess mit weniger Rechten kann also u.a. nicht:
ein SendMessage oder PostMessage auf höher berechtigte
Applikations-Fenster ausführen. "Kann" heisst da, es wird
"Erfolg" zurückgemeldet, aber im Hintergrund die Meldung
ggf. einfach unterdrückt. Das gleiche passiert mit Hooks, oder
DLL Injection. Allerdings können Anwendungen höherer
Berechtigungsstufen dies ggf. ausdrücklich z.B. durch Aufruf
von ChangeWindowMessageFilter() erlauben.

Es gibt noch ein paar mehr Dinge, die man als
Entwickler für Vista (zumindest oberflächlich) im
Hinterkopf haben sollte.

[Windows Vista Application Development Requirements for User Account Control
(UAC)]
http://msdn.microsoft.com/en-us/library/aa905330.aspx

Dominik Amon

unread,
Aug 13, 2008, 4:34:19 AM8/13/08
to
hallo Frank

ok danke für die Info, was schlägst du vor, wenn die Anforderung "markierten
Text" auslesen (innerhalb verschiedener Applikationen) und das auch unter
Vista (und dann später verarbeiten)?

danke!
dominik


Frank Dzaebel

unread,
Aug 13, 2008, 5:16:14 AM8/13/08
to
Hallo Dominik,

> ok danke für die Info, was schlägst du vor, wenn die Anforderung
> "markierten Text" auslesen (innerhalb verschiedener Applikationen) und das
> auch unter Vista (und dann später verarbeiten)?

Im Prinzip das, was ich angemerkt hatte.
Normal werden die Apps ja unter Vista dann auch unter
dem User laufen. Insofern wäre die App dann nicht
unbedingt höher berechtigt, also z-B. ein SendMessage noch
möglich. Bei Admin-Prozessen ist es die Frage,
ob Du es da auch benötigst. Wenn ja, müsste Deine
App eigentlich auch unter Admin-Berechtigungen laufen.

Für einige definierte Prozess-Typen bleibt der Aufwand
z.T. in Grenzen.
Es für *alle* Prozesse zu schaffen, wäre
IMHO aufwändig (Monate), das ist wohl auch das, was auch
von anderen hier in der Tendenz zum Ausdruck gebracht
werden sollte.

Dominik Amon

unread,
Aug 13, 2008, 5:59:25 AM8/13/08
to
Hallo

Ich habe gerade ein Mini Programm geschrieben, welches STRG+C sendet und den
Text in die Zwischenablage setzt. Das funktioniert soweit gar nicht mal so
schlecht bei Notepad, normalen Eingabefeldern. Habe ich aber jetzt einen
Text im Winword, Excel, IE oder Adobe Acrobat, funktionierts leider nicht.

Wenn ich in der Anwendung manuell "STRG+C" mache und dann in meinem Programm
"GetText" mache, funktioniert es allerdings, hast du eine Ahnung, was das
Problem sein könnte? Gibts einen Unterschied zwischen STRG+C programmatisch
und STRG+C vom User (laufe noch unter WindowsXP)

lg,
dominik

"Frank Dzaebel" <Po...@FranksSeite.de> schrieb im Newsbeitrag
news:853D4395-C4FC-4B24...@microsoft.com...

Herfried K. Wagner [MVP]

unread,
Aug 13, 2008, 9:05:26 AM8/13/08
to
Hallo Dominik!

"Dominik Amon" <dominik_...@linuxmail.org> schrieb:


>> Alles andere, was völlig eigenständig operieren soll, geht nur über
>> OCR-Techniken.
>>
>>> Würde dass dann so aussehen [Psyeudo-Code]
>>>
>>> Processes.ActiveProcess.ActiveWindow.SelectedText ?
>
> Und was bedeutet das konkret? Ich mach einen Screenshot und werte den
> aus??

Ja, das bedeutet es. Mit 'Graphics.CopyFromScreen' kannst Du zumindest das
Kopieren des Bildschirmausschnitts mit dem .NET Framework erledigen ;-).

Harald M. Genauck

unread,
Aug 13, 2008, 9:00:41 AM8/13/08
to
Hallo Frank,

> ich muss mal etwas die überzogenen Ausdrücke wie
> "unmöglich", "schwierig", etc. relativieren.

>> Und bei Anwendungen wie etwa Word oder Excel dürfte es auch
>> schwierig sein, einfach so von außen an den markierten Text
>> heranzukommen.

> Zum Beispiel Excel (ganz grob!) :
>
> MessageBox.Show(((Range)app.Selection).Value2.ToString());

Dazu müsste die Anwendung einen Verweis auf Excel haben.

>> Im IE geht das jedenfalls nur, wenn man sich auf irgendeine Weise in
>> das DOM-Modell einklinkt.

> Muss nicht, es ginge auch etwa über: SendKeys.SendWait("^C");
> oder SendMessage DTM_COPYSELECTIONTONEWISTREAM, etc..

etc.?

> Bei Vista können Schwierigkeiten bzgl. UIPI hinzukommen.

Eben...

Das Problem ist ja offensichtlich nicht, aus einer spezifizierbaren
Anwendung gezielt etwas auszulesen, sondern für ein universelles Tool
alle nur erdenklichen Fälle zu berücksichtigen.

Das ist wohl ähnlich dem Abkürzungen-Problem dieser Tage in dieser NG -
so ein Tool lässt sich einfach nicht auf alle Möglichkeiten
vorbereiten.

Entweder bei markierbaren Texten über die Zwischenablage, oder, wenn
auch nicht normal Markierbares ausgelesen werden soll, über OCR -
andere Möglichkeiten sehe ich definitiv nicht.

Harald M. Genauck

unread,
Aug 13, 2008, 9:10:05 AM8/13/08
to
Hallo Dominik,

>> Alles andere, was völlig eigenständig operieren soll, geht nur über
>> OCR-Techniken.

> Und was bedeutet das konkret? Ich mach einen Screenshot und werte den

> aus?? Ich hoffe es ist nicht ganz so kompilziert :-)

Im einfachsten Fall: Ja. Aber... ;-)

Ich hatte vor ewigen Zeiten mal so ein geniales Tool (leider war das
nur für Win9x, unter NT/2000... ließ sich das leider nicht mehr
installieren), das genau das im Prinzip konnte. Sobald man es
aufgerufen hatte (Tray-Icon, Hotkey), konnte man beliebigen Text auf
dem Bildschirm markieren, sogar in Bildern, und die Markierung dann in
die Zwischenablage übernehmen. Das Tool hat "on-the-fly" versucht zu
erkennen, ob sich unter dem Mauszeiger (bei gedrückter Maustaste) eine
Textzeile befindet, und dann in einen Markierungsmodus umgeschaltet
(einfaches Markierungsrechteck, vermutlich) - nur der markierte Bereich
wurde dann per OCR als Text ausgewertet.

Herfried K. Wagner [MVP]

unread,
Aug 13, 2008, 9:11:26 AM8/13/08
to
Hallo Frank!

"Frank Dzaebel" <Po...@FranksSeite.de> schrieb:


> ich muss mal etwas die überzogenen Ausdrücke wie
> "unmöglich", "schwierig", etc. relativieren.
>
>> Und bei Anwendungen wie etwa Word oder Excel dürfte es auch schwierig
>> sein, einfach so von außen an den markierten Text heranzukommen.
>
> Zum Beispiel Excel (ganz grob!) :
>
> MessageBox.Show(((Range)app.Selection).Value2.ToString());

... und genau das ist wieder Beweis dafür, wie schwierig es ist, eine
*allgemeine* Lösung zu finden, bei der man nicht verschiedenste Anwendungen
separat berücksichtigen muß.

>> Im IE geht das jedenfalls nur, wenn man sich auf irgendeine Weise in das
>> DOM-Modell einklinkt.
>
> Muss nicht, es ginge auch etwa über: SendKeys.SendWait("^C");
> oder SendMessage DTM_COPYSELECTIONTONEWISTREAM, etc..

Gibt es die Nachricht 'DTM_COPYSELECTIONTONEWISTREAM' überhaupt? Sie läßt
sich in der MSDN nicht finden und mit Live Search und Google Web findet man
nur ein paar Hinweise auf Anwendungsentwicklung für mobile Geräte.

Frank Dzaebel

unread,
Aug 13, 2008, 10:30:09 AM8/13/08
to
Harald,

>> Zum Beispiel Excel (ganz grob!) :
>>
>> MessageBox.Show(((Range)app.Selection).Value2.ToString());
>
> Dazu müsste die Anwendung einen Verweis auf Excel haben.

Ist erlaubt unter C#. Man kann das in C# aber auch
latebind ohne Verweis implementieren. Über "Marshal.GetActiveObject"
erhältst Du bei Bedarf übrigens das aktive Excel-Application-Object.

>> Bei Vista können Schwierigkeiten bzgl. UIPI hinzukommen.
>
> Eben...

das ist wohldefiniert, man muss es nur bei
der Installation wissen, mit welchen Rechten die
App implementiert wird. Die Hinweise, wie das
zu machen ist, wurden ja schon verlinkt.


> alle nur erdenklichen Fälle zu berücksichtigen.

für alle "erdenklichen" Fälle finde ich das
- und da wiederhole ich - aufwendig (Monate),
das habe ich ja bereits gepostet.
Für definierte Anwendungsstypen ist teilweise
nicht besonders aufwendig.

> Das ist wohl ähnlich dem Abkürzungen-Problem

naja ;-) du hättest bei den *konkreten* Anwendungs-
Typen vielleicht - wie dort auch - "vermutlich" schreiben
sollen.


> so ein Tool lässt sich einfach nicht auf alle Möglichkeiten vorbereiten.

ACK, da sind wir denke ich alle der gleichen Meinung.
Nur bei konkreten App-Typen gibt es z.T.
einfache Lösungen.

Harald M. Genauck

unread,
Aug 13, 2008, 11:12:45 AM8/13/08
to
Hallo Frank,

>>> Zum Beispiel Excel (ganz grob!) :
>>>
>>> MessageBox.Show(((Range)app.Selection).Value2.ToString());
>>
>> Dazu müsste die Anwendung einen Verweis auf Excel haben.

> Ist erlaubt unter C#. Man kann das in C# aber auch
> latebind ohne Verweis implementieren. Über "Marshal.GetActiveObject"
> erhältst Du bei Bedarf übrigens das aktive Excel-Application-Object.

Klar ist das erlaubt... Aber wie, zum Henker, nimmt man einen Verweis
auf eine Anwendung auf, die man gar nicht kennt? Oder auf eine, die es
sogar noch gar nicht gibt?

>> alle nur erdenklichen Fälle zu berücksichtigen.

> für alle "erdenklichen" Fälle finde ich das
> - und da wiederhole ich - aufwendig (Monate),
> das habe ich ja bereits gepostet.
> Für definierte Anwendungsstypen ist teilweise
> nicht besonders aufwendig.

Ich stelle mir gerade vor, ein Tool mit einem universellen
Nutzenanspruch wie die Zwischenablage wäre nur für "definierte
Anwendungstypen" implementiert worden...
:-)

>> so ein Tool lässt sich einfach nicht auf alle Möglichkeiten
>> vorbereiten.
>
> ACK, da sind wir denke ich alle der gleichen Meinung.
> Nur bei konkreten App-Typen gibt es z.T.
> einfache Lösungen.

Aber um konkrete App-Typen geht es ja in diesem Thread nicht.

Frank Dzaebel

unread,
Aug 13, 2008, 11:28:32 AM8/13/08
to
Hallo Harald,

Harald wrote:
>>> Und bei Anwendungen wie etwa Word oder Excel dürfte es auch schwierig
>>> sein, einfach so von außen an den markierten Text heranzukommen.
>>

>> [...] ist erlaubt [...] ist auch ohne Verweis möglich [...]


>>
> Klar ist das erlaubt... Aber wie, zum Henker, nimmt man einen Verweis auf
> eine Anwendung auf, die man gar nicht kennt? Oder auf eine, die es sogar
> noch gar nicht gibt?

Wie gesagt, man braucht keinen Verweis.
Es geht nur um Deinen Satz da ganz oben.
Bei Word oder Excel geht das einfach, den
markierten Text zu bekommen.

>> ACK, da sind wir denke ich alle der gleichen Meinung.
>> Nur bei konkreten App-Typen gibt es z.T.
>> einfache Lösungen.
>
> Aber um konkrete App-Typen geht es ja in diesem Thread nicht.

Eigentlich schon "auch". Der OP fragt nach: z.B.
"Word, Excel, IE, Adobe PDF". Vielleicht meint er
es auch *ganz* allgemein. In diesem Punkt sind
sich aber alle einig, dass dies sehr aufwendig wäre.

Da wir mal wieder wenig über C# reden, schlage ich ein EOT vor.

Dominik Amon

unread,
Aug 14, 2008, 4:26:00 AM8/14/08
to
>> Aber um konkrete App-Typen geht es ja in diesem Thread nicht.
>
> Eigentlich schon "auch". Der OP fragt nach: z.B.
> "Word, Excel, IE, Adobe PDF". Vielleicht meint er
> es auch *ganz* allgemein. In diesem Punkt sind
> sich aber alle einig, dass dies sehr aufwendig wäre.

Ja es geht konkret um diese Applikationen - So habe ich die Anforderungen
bekommen...

> Da wir mal wieder wenig über C# reden, schlage ich ein EOT vor.

Ich würde das Thema noch nicht schließen, weil für das ganze noch nicht
geklärt ist.
Im Word, Excel und meiner Meinung nach im Intenret Explorer könnte ich
vermutlich mit jeweils einem Plugin eine Möglichkeit schaffen den
selektierten Text auszuelesen? Für Word & Excel sollte das kein Problem
sein, glaube ich, für den IE wirds schon schwieriger, weil ich nicht weiß
wie ich in C# ein Plugin schreiben kann

Für Adobe Acrobat [/Reader] habe ich noch keine Ahnung? Hier funktioniert
leider auch der STRG+C Trick nicht :-(

lg,
dominik


Harald M. Genauck

unread,
Aug 14, 2008, 10:13:43 AM8/14/08
to
Hallo Dominik,

>>> Aber um konkrete App-Typen geht es ja in diesem Thread nicht.

>> Eigentlich schon "auch". Der OP fragt nach: z.B.
>> "Word, Excel, IE, Adobe PDF". Vielleicht meint er
>> es auch *ganz* allgemein. In diesem Punkt sind
>> sich aber alle einig, dass dies sehr aufwendig wäre.

> Ja es geht konkret um diese Applikationen - So habe ich die
> Anforderungen bekommen...

Das war wohl etwas missverstndlich bisher - es klang für mich so, als
ob Du ein universelles Tool bauen wolltest...

Aber wenn es um konkret spezifizierte Anwendungen geht, dann wird es
für jede dieser Anwendungen wahrscheinlich einen spezifischen Weg
geben.

Allerdings würde ich die spezifischen Komponenten für jede dieser
Anwendungen in einem modularen Plugin-Konzept realisieren. So können
ggfs. Komponenten für weitere Anwendungen hinzugenommen werden, oder
die Komponenten ausgetauscht werden, falls sich das Verfahren für eine
der Anwendungen intern ändern sollte...

Dominik Amon

unread,
Aug 14, 2008, 10:48:48 AM8/14/08
to
Hallo Harald,

> Das war wohl etwas missverstndlich bisher - es klang für mich so, als ob
> Du ein universelles Tool bauen wolltest...

Ja, sorry. Prinzipiell ist es für die genannten Anwendungen unter Windows
Vista.
Ich dachte einfach, es würde keinen Unterschied machen, wenn man es gleich
für alle Win32/64 Applikationen schreibt.

> Aber wenn es um konkret spezifizierte Anwendungen geht, dann wird es für
> jede dieser Anwendungen wahrscheinlich einen spezifischen Weg geben.
>
> Allerdings würde ich die spezifischen Komponenten für jede dieser
> Anwendungen in einem modularen Plugin-Konzept realisieren. So können ggfs.
> Komponenten für weitere Anwendungen hinzugenommen werden, oder die
> Komponenten ausgetauscht werden, falls sich das Verfahren für eine der
> Anwendungen intern ändern sollte...

Gut zu wissen. Ich werde es auch so modular gestallten wie möglich.
Die Logik selbst möchte ich in einem WebService im internen Intranet
realiseren, lediglich der markierte Text soll übergeben werden.

Für Word und Excel mache ich mir weniger Sorgen, aber wie komme ich mit C#
in den IE rein bzw. in den Adobe Acrobat reader?

lg,
dominik


Frank Dzaebel

unread,
Aug 14, 2008, 11:35:25 AM8/14/08
to
Hallo Dominik.

> Ja es geht konkret um diese Applikationen - So habe ich die Anforderungen
> bekommen...

ja, so habe ich das auch verstanden.


> im Intenret Explorer könnte ich vermutlich mit jeweils einem Plugin eine
> Möglichkeit schaffen

Muss nicht. Es ginge auch "ganz" grob (übrigens
auch im Adobe PDF) :

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);

private void button1_Click(object sender, EventArgs e)
{
IntPtr ie = new IntPtr(0x00290134); // hier FindWindow etc.
// Window-Klasse für:
// IE: "Internet Explorer_Server" // andere Versionen prüfen
// Adobe PDF: "AVL_AVView"

if (ie == IntPtr.Zero)
{ MessageBox.Show("IE läuft nicht."); return;
}
SetForegroundWindow(ie);
SendKeys.SendWait("^{Insert}");
string text = Clipboard.GetText();
MessageBox.Show(text);
}

> Für Word & Excel sollte das kein Problem sein,

ja. Wurde ja bereits erläutert ..

Cadburry

unread,
Aug 19, 2008, 6:11:09 AM8/19/08
to

"Dominik Amon" wrote:

> Hallo


>
> Ich stelle eine generelle Frage in den Raum: Ich soll heraus finden, wie
> schwer/leicht es möglich ist, aus Anwendungen wie Word, Excel, dem Internet
> Explorer, Adobe PDF Dokumenten, einen selektierten Text zu ermitteln (und
> danach auszuwerten)
>
> Ähnlich macht das zb Skype im Internet Explorer, welches Telefonnummern
> erkennt, die man dann auch gleich direkt anwählen kann.
>
> Die Anforderungen die ich habe sind noch recht "schwammig", es hängt auch
> ganz davon ab, wie schwer es ist, es umzusetzen.
> Zur Umsetzung könnte ich mir vorstellen, dass man einen Text markiert und
> man sich bei oben genannten Anwendungen in das Kontextmenü reinsetzt (wenn
> das leicht möglich ist) oder - weil das wahrscheinlich einfacher ist - zb
> durch eine globale Tastenkombination den gewählten Text verarbeitet.
>
> Welche Erfahrungen habt ihr auf diesem Gebiet da schon gemacht? Was schlagt
> ihr vor? Gibt es dafür vielleicht schon sogar fertigen Code?? Gibt es
> bessere Alternativen?
>

> Vielen Dank,
> Dominik
>
>
>

OK OK OK! :)

Hallo erstmal!
Ich bin eigentlich in de VB welt daheim, hatte aber vor kurzem die selbe
anforderung (IPPhone Client - markierten text=rufnummer über taste F8 wählen)

Alle probleme die hier in den ganzen Posts auftauchen hatte ich auch!
Erstmal brauchst du kein plugin für den IE zu schreiben! Skype macht das,
aber nur aus dem grund da es den HTML text durchsucht und wenn rufnummern
gefunden werden es diese direkt im quellcode zu links mit callto:+4xxxxblabla
versucht zu ändern!

Das Probelm mit der STRG+C geschichte hatte ich auch (Text aus
Terminalfenster einlesen) (citrix usw)! Denn über die Sendkeys methode wird
dies nicht in den tastaturbuffer geschrieben sondern irgendwie anders und
erreicht daher keine terminalanwendungen (frag mich nicht :) - es ist aber
möglich suche nach "push mehtode alternative sendkeys" !! dann wirst du
fündig!!

Markierten text auslesen habe ich über ein von mir geschriebene OCX DLL (in
VB6) gelöst! welche das handle des fensters ausliest und mir den markierten
text zurück gibt!- leider habe ich es noch nicht geschafft diese in .net zu
übersetzten - bekomme irgendwelche konfusen speicherzugriffsfehler (??) daher
hab ich einfach meine "alte" OCX im .net verwendet! (kann auch an meinem
vista liegen)
>Das ganze funktioniert prima in applikationen wie IE usw. - auch auf Vista läuft das ganze (mit der vb6ocx. Bin lokaler admin aber habe UAC aktiviert!!)
Ich hatte jedoch das selbe problem mit Word usw.- hier wird es dann etwas
komplizierter - ich versuche immer zuerst über die OCX-DLL den markierten
Text zu lesen - bekomme ich hier nichts zurück "pushe" ich STRG+C merke mir
natürlich vorher die zwischenablage und schreibe sie dann zurück, bis jetzt
nur text da ich an dieser appikation noch am entickeln bin... (VB.net)

gruß Cadburry

PS: habe überhaupt nicht , aber auch überhaupt NICHT, auf die RS geachtet ;)

Frank Dzaebel

unread,
Aug 19, 2008, 9:38:20 AM8/19/08
to
Hallo Cadburry,

wir benutzen hier gerne den vollen Vor- und Zunamen als Usernamen.


> Das Probelm mit der STRG+C geschichte hatte ich auch (Text aus
> Terminalfenster einlesen) (citrix usw)! Denn über die Sendkeys methode
> wird
> dies nicht in den tastaturbuffer geschrieben sondern irgendwie anders und
> erreicht daher keine terminalanwendungen (frag mich nicht :) - es ist aber
> möglich suche nach "push mehtode alternative sendkeys" !! dann wirst du
> fündig!!

Nein, Du hast nur nicht die Postings genau gelesen, folgendes
funktioniert im IE und anderen Anwendungen (auch UAC Vista etc.),
da brauchst Du keine Zusatzsoftware:

SendKeys.SendWait("^{Insert}");

http://groups.google.com/group/microsoft.public.de.german.entwickler.dotnet.csharp/msg/ef8fc31a539a7ee2

Johannes Fankhauser

unread,
Aug 19, 2008, 10:23:04 AM8/19/08
to

"Frank Dzaebel" wrote:

Johannes Fankhauser alias Cadburry :)

Also ich hoffe wir reden hier nicht aneinander vorbei
Was bewirkt ....("^{Insert}") ?
Denn sendkeys verwende ich gar nicht mehr (in der aktuellen applikation!)

Gruß Johannes

Frank Dzaebel

unread,
Aug 19, 2008, 11:18:44 AM8/19/08
to
Hallo Johannes,

> Johannes Fankhauser alias Cadburry :)

danke für die Namens-Anpassung :)


> Also ich hoffe wir reden hier nicht aneinander vorbei
> Was bewirkt ....("^{Insert}") ?

Das bewirkt genauso wie [Strg-C] ein Kopieren in
die Zwischenablage. Das "^" steht bei SendKeys für
"STRG". Im Gegensatz zum [Strg-C] funktioniert das aber.

[Schnelltaste "Insert+Strg"]
http://www.georgscheidel.de/html/deu/0000e122.htm

[SendKeys.Send-Methode (System.Windows.Forms)]
http://msdn.microsoft.com/de-de/library/system.windows.forms.sendkeys.send.aspx

Wenn Du bereits ein PlugIn im IE hast, oder andere
Software benutzt, die das innerhalb des IE-DOMs
macht (PDF war hier ja aber auch gefragt), ist das
ggf. für den IE-Spezialfall sogar sauberer. Nur
halt ggf. nicht so allgemein gültig und an Zusatz-
Software gebunden.

Johannes Fankhauser

unread,
Aug 19, 2008, 12:15:02 PM8/19/08
to

"Frank Dzaebel" wrote:

> Hallo Johannes,
>
> > Johannes Fankhauser alias Cadburry :)
>
> danke für die Namens-Anpassung :)
>

Gerne! ;)


Ahh das bewirkt STRG+C ...aber leider nicht "wirklich" ..klingt jetzt komisch
aber eventuell hast du die möglichkeit es zu testen:
Wenn du an deinem rechner ein terminalfenster (citrix-ica od. ms-rdp) offen
hast und darin eine anwendung läuft kann man am rechner STRG+C an der
tastatur drücken und der jeweilige text wird ins clipboard des lokalen
rechners kopiert... jedoch funktioniert das in einem terminalfenster nicht
wenn du über deine Applikation sendkeys machst.
dafür must du die "PUSH key methode" verwenden (API befehle) damit das
STRG+C auch im terminalfenster wahrgenommen werdne kann!

beste grüße! und einen schönen Abend!

Frank Dzaebel

unread,
Aug 19, 2008, 2:54:06 PM8/19/08
to
Hallo Johannes,

> Ahh das bewirkt STRG+C ...aber leider nicht "wirklich"

doch ganz wirklich, für die Szenarien, die wir
hier besprechen. Und - wie gesagt - ich spreche
über [STRG-INSERT] nicht [STRG-C].

> Wenn du an deinem rechner ein terminalfenster (citrix-ica od. ms-rdp)

in rdp (und anderen TSPs, u.a.) gelten teilweise ganz
andere Tastatur-Shortcuts. Generell kann jede App eigene
Shortcuts überschreiben. Diese Terminalfenster sind solche
Apps. Aber im Prinzip kann dort bei TS nicht einfach so
ein SendKeys machen, was aber für viele andere Apps
auch gilt, bei TS ist noch zusätzlich höherer Aufwand, das
richtige Window-Handle zu finden.

Das Thema ist hier aber nicht Terminalfenster!

Eigentlich nur erstmal die Apps [PDF, IE, Word, Excel].
TS gehört eher schon zu den "anderen" Programmen.
Also um Dir das nochmal zu wiederholen, es
gibt keine Lösung für alle erdenklichen Programme,
(bzw. das würde auch viel Zeit kosten).
Wenn der Weg für Dich in Deiner App (mit begrenzten
Anforderungen) zum Ziel geführt hat, ist es doch gut.
Bzgl. Citrix kommt noch ein Bug hinzu, der ab der 9er Version
durch einen neuen Keyboard Hook Driver beseitigt wurde.
Ich würde wohl bei TS eher die direkte TS API
(WtsApi32) anprogrammieren, aber:

das finde ich in diesem Thread nicht so besonders wichtig,
da es nicht das Thema ist. Sollten wir also eher beenden.

Dominik Amon

unread,
Aug 20, 2008, 9:59:54 AM8/20/08
to
Hallo Franz,

> [DllImport("user32.dll")]
> static extern bool SetForegroundWindow(IntPtr hWnd);
>
> private void button1_Click(object sender, EventArgs e)
> {
> IntPtr ie = new IntPtr(0x00290134); // hier FindWindow etc.
> // Window-Klasse für:
> // IE: "Internet Explorer_Server" // andere Versionen prüfen
> // Adobe PDF: "AVL_AVView"
>
> if (ie == IntPtr.Zero)
> { MessageBox.Show("IE läuft nicht."); return;
> }
> SetForegroundWindow(ie);
> SendKeys.SendWait("^{Insert}");
> string text = Clipboard.GetText();
> MessageBox.Show(text);
> }

Danke für das Code Schnippsel. Das schaut schon sehr viel versprechend aus!
Aber wenn ich das richtig verstehe, muss ich mir in dem Fall das richtige
Fenster erst suchen, in dem die Markierung zu finden ist (klar irgendwie).

Ich habe vom CodeProject die Global Mouse and Keyboard Library [1]. Hier
kann ich auf bestimmte Tastenkombinationen lauschen und das funktioniert
soweit ganz gut.
Ich müsste jetzt im Prinzip, wenn ein solches Keyboard Event auftritt, noch
das richtige Fenster finden.
Ich habe bis jetzt einfach gleich nach dem Event
SendKeys.SendWait("^{Insert}") geschickt und hatte nichts in der
Zwischenablage.

Wie komme ich dann auf das richtige Fenster, um das Copy-Command abzusenden?

danke,
dominik

[1] http://www.codeproject.com/KB/system/globalmousekeyboardlib.aspx

Frank Dzaebel

unread,
Aug 20, 2008, 10:33:19 AM8/20/08
to
Hallo Dominik,

> Danke für das Code Schnippsel. Das schaut schon sehr viel versprechend
> aus!

ja, funktioniert auch auf Vista u.a..
Du kannst Dir mal eben zum Test mit Spy++
das Handle hartcodiert setzen ...

> Aber wenn ich das richtig verstehe, muss ich mir in dem Fall das richtige
> Fenster erst suchen, in dem die Markierung zu finden ist (klar irgendwie).

Korrekt, das musst Du normal schon. Du kannst die
Fensterklasse (bei IE): "Internet Explorer_Server"
suchen.
Dabei sind u. a. PInvokes von FindWindow und
EnumChildWindows, SendMessage, etc. hilfreich:

[pinvoke. net: EnumChildWindows (user32)]
http://pinvoke.net/default.aspx/user32/EnumChildWindows.html

[vbAccelerator - Enumerating Windows]
http://www.vbaccelerator.com/home/net/code/Libraries/Windows/Enumerating_Windows/article.asp

Dominik Amon

unread,
Aug 20, 2008, 10:48:02 AM8/20/08
to
> Danke für das Code Schnippsel. Das schaut schon sehr viel versprechend
> aus!

PS: Ich habe den Code einfach mal auf einen Button gebunden und den Pointer
des IE's jetzt mal mit dem Microsoft Spy ++ hardcoded eingetragen.
Da bekomme ich den markierten Text problemlos! So weit, so gut :-)

Es funktioniert aber zb nicht, wenn ich aus dem KeyBord Event [KeyUp]
heraus, das SendKeys sende. Ich habe auch eine Zeitverzögerung eingebaut,
weil ich mir gedacht habe, dass hier vielleicht Probleme mit dem Event
auftreten)

Ganz klar ist mir das nicht, auch noch nicht, wie auf das derzeit fokusierte
Fenster rankomme?

lg,
dominik

Dominik Amon

unread,
Aug 20, 2008, 10:52:37 AM8/20/08
to
hallo

Das mit dem Spy++ hab ich in meinem anderen Posting gerade verfasst, hab ich
quasi gleichzeitg zu diesem Posting hier geschrieben :-)

>> Aber wenn ich das richtig verstehe, muss ich mir in dem Fall das richtige
>> Fenster erst suchen, in dem die Markierung zu finden ist (klar
>> irgendwie).
>
> Korrekt, das musst Du normal schon. Du kannst die
> Fensterklasse (bei IE): "Internet Explorer_Server"
> suchen.
>
> Dabei sind u. a. PInvokes von FindWindow und
> EnumChildWindows, SendMessage, etc. hilfreich:

> [pinvoke. net: EnumChildWindows (user32)]
> http://pinvoke.net/default.aspx/user32/EnumChildWindows.html

Soweit klar, ich habe gerade gesehen, dass ich gar nicht das SubWindow
benötige, es reicht den übergeordneten Prozess zu fokusieren. An diese
IntPtr komme ich mit Process.GetProcesses() ran - Funktioniert soweit ganz
gut. Rausgefunden, welches Fenster aber gerade gewählt ist, weiß ich nicht,
die Leute könnten ja mehrere Fenster offen haben, Word, Excel, IE alles
gleichzeitig, benötigen würde ich den Text dann nur aus dem grade
fokusiertem...

Ich spiele mich derzeit gerade, warum das STRG+INSERT nicht funktioniert,
wenn ich es aus dem KeyCode Event heraus starte...

lg,
dominik


Dominik Amon

unread,
Aug 20, 2008, 11:09:43 AM8/20/08
to
hallo

> Ich spiele mich derzeit gerade, warum das STRG+INSERT nicht funktioniert,
> wenn ich es aus dem KeyCode Event heraus starte...

--> Nun ich konnte dieses Problem zumindest soweit runterbrechen, in dem ich
sagen kann, dass das Codeskript [1], dann nicht funktioniert, wenn es aus
einem eigenen Thread heraus gestartet wird? Ich sehe, dass er das Fenster
zwar fokusiert, dann jedoch nicht mehr den Text in die Zwischenablage
bekommt.
Woran liegt denn das wieder? :-(

lg,
dominik


Dominik Amon

unread,
Aug 20, 2008, 11:16:55 AM8/20/08
to
> --> Nun ich konnte dieses Problem zumindest soweit runterbrechen, in dem
> ich sagen kann, dass das Codeskript [1], dann nicht funktioniert, wenn es
> aus einem eigenen Thread heraus gestartet wird? Ich sehe, dass er das
> Fenster zwar fokusiert, dann jedoch nicht mehr den Text in die
> Zwischenablage bekommt.
> Woran liegt denn das wieder? :-(

hier fehlte das Skript:


TestClass testClass = new TestClass();
ThreadStart start = new ThreadStart(testClass.CopyText);
Thread _thread = new Thread(start);
_thread.Start();

class TestClass
{


[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);

public void CopyText()
{
IntPtr pointer = new IntPtr(0x000E0AB2); //0x002C057E INNERES
FENSTER: 0x000E0AB2

if (pointer == IntPtr.Zero)
{
return;
}
if (SetForegroundWindow(pointer))
{

Dominik Amon

unread,
Aug 21, 2008, 5:44:08 AM8/21/08
to
Hallo

> Ganz klar ist mir das nicht, auch noch nicht, wie auf das derzeit
> fokusierte Fenster rankomme?

Habe gerade in der Doku gesehen, das ist relativ leicht
"GetForegroundWindow" sollte die richtige Methode sein.

Offen ist für mich nur mehr, warum SendKeys in einem separtem Thread nicht
funktioniert

lg,
dominik


Frank Dzaebel

unread,
Aug 21, 2008, 7:02:45 AM8/21/08
to
Hallo Dominik,

> Offen ist für mich nur mehr, warum SendKeys in einem separtem Thread nicht
> funktioniert

Es ist nicht SendKeys, sondern das GetText, denn
die Clipboard-Klasse kann nur in Threads verwendet
werden, die auf den STA-Modus (Singlethread-Apartment)
festgelegt sind. Füge also z.B. vor thread.Start()
folgende Zeile ein:

thread.SetApartmentState(ApartmentState.STA);

Auch müsste eigentlich über Thread.Sleep(...) nach dem
SendWait noch die tatsächliche Persistierung in
die Zwischenablage abgewartet werden.

Frank Dzaebel

unread,
Aug 21, 2008, 7:12:06 AM8/21/08
to
Hallo Dominik,

>> dann nicht funktioniert, wenn es aus einem eigenen Thread heraus
>> gestartet
>> wird? Ich sehe, dass er das Fenster zwar fokusiert, dann jedoch
>> nicht mehr den Text in die Zwischenablage bekommt.
>> Woran liegt denn das wieder? :-(

http://groups.google.com/group/microsoft.public.de.german.entwickler.dotnet.csharp/msg/dd3e7838f02fafd7

Dominik Amon

unread,
Aug 21, 2008, 11:12:50 AM8/21/08
to
Hallo Frank

> Es ist nicht SendKeys, sondern das GetText, denn
> die Clipboard-Klasse kann nur in Threads verwendet
> werden, die auf den STA-Modus (Singlethread-Apartment)
> festgelegt sind. Füge also z.B. vor thread.Start()
> folgende Zeile ein:
>
> thread.SetApartmentState(ApartmentState.STA);
>
> Auch müsste eigentlich über Thread.Sleep(...) nach dem
> SendWait noch die tatsächliche Persistierung in
> die Zwischenablage abgewartet werden.

Danke für den Hinweis! Es funktioniert jetzt bei mir, es waren zwei Dinge:
1) Thread konnte nicht zugriffen, dürfte durch STA behoben worden sein
2) Die Art des Aufrufs war auch ein Problem, da ich ja ein Globals Tastatur
Kürzel hatte und ich manchesmal noch das Tastaturkürzel gedrückt hatte, hat
auch das STRG+C nicht funktionert, weil eben auch die anderen Tasten
gedrückt waren.

Ich hoffe, wenn ich das in ein Windows Service packe, dass es dann keine
neuen Überraschungen gibt :-)

Vielen Dank!!!

lg,
dominik


0 new messages