AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Markierten Text aus einer anderen Anwendung einlesen
Thema durchsuchen
Ansicht
Themen-Optionen

Markierten Text aus einer anderen Anwendung einlesen

Ein Thema von jensw_2000 · begonnen am 18. Aug 2004 · letzter Beitrag vom 19. Aug 2004
Antwort Antwort
jensw_2000
(Gast)

n/a Beiträge
 
#1

Markierten Text aus einer anderen Anwendung einlesen

  Alt 18. Aug 2004, 21:41
Hallo zusammen,

möchte ein kleines Programm basteln, das wie folgt funktioniert:

Ich markiere einen beliebigen Text in einer beliebigen Anwendung.
Beim Klicken auf das Trayicon meines "imaginären" Programms soll dann der selektierte Text der anderen Anwendung als String in meine Anwendung übernommen werden.

Bis hier hin habe ich keinen blassen Schimmer wie ich das realisieren soll ...
den Rest kann ich dann glaube ich selber

- prüfen ob es sich bei dem Text um eine Telefonnummer handeln könnte und diese Nummer dann per TAPI wählen lassen ...

So kann man auch "nicht CTI fähige Programme" dazu überreden eine Nummer zu wählen ...


Habt ihr ein paar Tips um mir den komplizierten API Part etwas zu erleichtern ?


Wäre echt Klasse.
Allein packe ich das nie ...

Danke im Voraus,
Jens
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Markierten Text aus einer anderen Anwendung einlesen

  Alt 18. Aug 2004, 22:07
Hallo Jens!

Erstmal herzlich willkommen in der DP!

Den Text herauskriegen könntest z.B. mit einer simulation der Tastenkombination Strg+C was den text in die zwischenablage bringt, nur dabei wirst du auf ein problem stoßen, denn sobald du das tbna-symbol anklickst wird der windows-explorer zum aktiven fenster, womit das falsche fenster die tasten empfangen würde. Daher würde ich dir zu einem anderen lösungsweg raten, wie z.B. kopieren auf tastendruck/tastenkombination.

Allerdings könntest du natürlich auch immer loggen, was das letzte aktive fenster war, und dann speziell zu ihm per windowmessages die tasten zusenden.

Eine Simulation von strg+c wäre meineserachtens nach die einfachste und effektivste lösung, solange du das mit dem tbna-icon weglässt.

Ctrl+C kannst du z.B. mit keybd_event simulieren, suche dazu einfach mal hier in der dp.
Das ganze aus der zwischenablage zu holen sollte auch kein problem sein, dazu findest du bestimmt hier auch etwas.

ciao, Philipp
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Markierten Text aus einer anderen Anwendung einlesen

  Alt 18. Aug 2004, 22:12
Hallo

Delphi-Quellcode:
function GetActiveControl: THandle;
var
  ThreadID: Integer;
begin
  ThreadID:= GetWindowThreadProcessID(GetForegroundWindow, nil);
  if AttachThreadInput(GetCurrentThreadID, ThreadID, True) then begin
    Result:= GetFocus; // Control in fremden Thread
    AttachThreadInput(GetCurrentThreadID, ThreadID, False);
  end else
    Result:= GetFocus; // Control in eigenem Thread
end;

function GetWindowText(const Handle: THandle): string;
var
  Len: Integer;
  Text: PChar;
begin
  Result:= '';
  Len:= SendMessage(Handle, WM_GETTEXTLENGTH, 0, 0);
  if Len <> 0 then begin
    GetMem(Text, Len+1);
    if Assigned(Text) then try
      SendMessage(Handle, WM_GETTEXT, Len+1, Integer(Text));
      Result:= Text;
    finally
      FreeMem(Text);
    end;
  end;
end;

function GetSelText(const Handle: THandle): string;
var
  SelStart, SelEnd: Integer;
begin
  SendMessage(Handle, EM_GETSEL, Integer(@SelStart), Integer(@SelEnd));
  Result:= Copy(GetWindowText(Handle), SelStart+1, SelEnd - SelStart);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Caption:= GetSelText(GetActiveControl);
end;
Geht leider nur für Edits, Memos, etc... Aber vielleicht kannst Du was draus machen.

Gruss
Shaman
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#4

Re: Markierten Text aus einer anderen Anwendung einlesen

  Alt 18. Aug 2004, 22:36
Danke...

wie lernt man sowas ?

Ich werde mal so anfangen, dass ich beim drücken des Hotkeys erst GetSelText aufrufe und falls der String leer ist ahschliessend CTRL+C an das aktive Fenster sende ...

Wie leicht das ist wenn man sich auskennt ...

Ich habe schon seit 2 Tagen nach einer Freeware OCR Komponente gesucht, wollte nen Screenshot vom aktiven Fenster machen und den "weißen Text auf blauem Grund" auslesen ....
und das war nur eine der Lösungen die ich verfolgt habe ...


Besten Dank...
werde gleich mal lostippen ....

Gruss, Jens
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#5

Re: Markierten Text aus einer anderen Anwendung einlesen

  Alt 19. Aug 2004, 18:04
Als aller Erstes, vielen Dank an c113plpbr und Shaman.
Mit euren Vorschlägen bekomme ich jede selektierbare Telefonnummer in mein Programm.

Nur bei Internet Explorer Fenstern geht es mit beiden Varianten nicht ...

Ich habe bei Torry eine Lösung gefunden, um den selektierten Text eines TWebbrowser Dokuments in die Zwischenablage zu kopieren. Das nützt mir aber in diesem speziellen Fall nicht viel, weil ich den User nicht zwingen kann in meinem TWebbrowser zu surfen anstatt im Internet Explorer....

Gibt es eine Möglichkeit zu erkennen, ob es sich bei dem aktiven Fenster um ein IE Fenster handelt um dann so irgendwie an das "IE-Fenster".document heranzukommen ?
Würde es bei z.B. NetScape auch nicht funktionieren ?


Danke und schöne Grüße,
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Markierten Text aus einer anderen Anwendung einlesen

  Alt 19. Aug 2004, 19:11
Hallo

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  keybd_event(VK_CONTROL, 0, 0, 0);
  keybd_event(Ord('C'), 0, 0, 0);
  keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
  Sleep(10);
  if Clipboard.HasFormat(CF_TEXT) then Caption:= Clipboard.AsText;
end;
Ist zwar grausig, aber so gehts überall. Solltest nur schauen, dass Du den vorherigen Inhalt der Zwischenablage irgendwie sichern kannst, damits wenigstens ein bisschen sauberer ist.

Gruss
Shaman
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

Registriert seit: 25. Jun 2003
Ort: AC
740 Beiträge
 
Delphi 7 Professional
 
#7

Re: Markierten Text aus einer anderen Anwendung einlesen

  Alt 19. Aug 2004, 19:20


Also ich würd ein bissl sauer werden, wenn mir son Programm ständig die Zwischenablage überschreibt. Das macht die Zwischenablage zur Laufzeit des Programms ja quasi unbrauchbar.
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Markierten Text aus einer anderen Anwendung einlesen

  Alt 19. Aug 2004, 19:26
Ich weiss, wollte nur zeigen, dass es geht
Man muss vielleicht noch genauere Bedingungen finden, wenn das ausgeführt werden soll.
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz