Announcement

Collapse
No announcement yet.

Markierten Text aus einer gerade aktiven Anwendung in die Zwischenablage schreiben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Markierten Text aus einer gerade aktiven Anwendung in die Zwischenablage schreiben

    Hi,
    weiß jemand wie man markierten Text aus beliebigen Anwendungen mittels Hotkey in die Zwischenablage einfügt und dabei gleichzeitig eine andere Anwendung starten kann?

    Das Hauptproblem ist dabei das Ermitteln von markiertem Text in einer gerade aktiven Anwendung und das Übertragen in die Zwischenablage.

    Hat jemand eine Idee?

    Gruß

    Michael

  • #2
    Hi

    Normalerweise "Strg+C" drücken . Würden sich alle Anwendungen an solche Standards halten gebe es Dein Problem nicht. Standardmäßig bekommt das markiert/fokusierte Textfenster immer das "Strg+C". Es gäbe aber für Dich die Möglichkeit an das Fokusierte Fenster eine wm_Copy Message zu senden oder aber mit wm_GetText selber den Text zu holen.

    Gruß Hage

    Comment


    • #3
      Hi,
      danke für deine Antwort. Mit wm_GetText den Text holen, das hört sich gut an.
      Hättest du vielleicht ein Beispiel, wie man das fokusierte Fenster einer Anwendung ermittelt und diesem dann eine wm_GetText Botschaft schickt?

      Gruß

      Michae

      Comment


      • #4
        <PRE><TT>
        <p>
        <B>procedure</B> TForm1.Timer1Timer(Sender: TObject);
        <B>var</B>
        SelfId : DWord;
        ThreadId: DWord;
        Attached: Boolean;
        Fokus : HWnd;
        TextLen : LResult;
        Text : PChar;
        <B>begin</B>
        Timer1.Enabled := False;
        <FONT COLOR="#000080"><I>// die eigene Thread-Id holen</I></FONT>
        SelfId := GetCurrentThreadId;
        <FONT COLOR="#000080"><I>// die Thread-Id des Hauptfensters mit dem eingabefokus holen</I></FONT>
        ThreadId := GetWindowThreadProcessId(GetForegroundWindow, <B>nil</B>);
        <FONT COLOR="#000080"><I>// Flag initialisieren</I></FONT>
        Attached := False;
        <FONT COLOR="#000080"><I>// prüfen, ob die Ziel-Thread-Id gültig und nicht die eigene ist</I></FONT>
        <B>if</B> (ThreadId <> 0) <B>and</B> (ThreadId <> SelfId) <B>then</B>
        <FONT COLOR="#000080"><I>// mit dem Ziel-Thread verbinden (die Message-Queues)</I></FONT>
        Attached := AttachThreadInput(SelfId, ThreadId, True);
        <FONT COLOR="#000080"><I>// prüfen ob wir verbunden, (x)oder es selbst sind</I></FONT>
        <B>if</B> Attached <B>xor</B> (ThreadId = SelfId) <B>then</B>
        <B>try</B>
        <FONT COLOR="#000080"><I>// Handle des Controls mit dem Eingabefokus</I></FONT>
        Fokus := GetFocus;
        <FONT COLOR="#000080"><I>// Nachricht versenden, um die aktuelle Textlänge zu bekommen</I></FONT>
        TextLen := SendMessage(Fokus, WM_GETTEXTLENGTH, 0, 0);
        <FONT COLOR="#000080"><I>// Fokus prüfen - und wir starten hier nur unsere Aktion,</I></FONT>
        <FONT COLOR="#000080"><I>// wenn nicht zuviel Text vorhanden ist (ist halt nur Demo)</I></FONT>
        <B>if</B> (Fokus <> 0) <B>and</B> (TextLen >= 0) <B>and</B> (TextLen < 1024) <B>then</B>
        <B>begin</B>
        <FONT COLOR="#000080"><I>// Speicher anfordern (+ 1 jeweils für abschließende 0 und '*')</I></FONT>
        GetMem(Text, TextLen + 2);
        <B>try</B>
        <FONT COLOR="#000080"><I>// Speicher initialisieren</I></FONT>
        FillChar(Text^, TextLen + 2, 0);
        <FONT COLOR="#000080"><I>// Text holen</I></FONT>
        TextLen := SendMessage(Fokus, WM_GETTEXT, TextLen + 1, LParam(@Text[0]));
        <B>if</B> TextLen >= 0 <B>then</B>
        <B>begin</B>
        <FONT COLOR="#000080"><I>// nach dem letzten Zeichen ein '*' schreiben</I></FONT>
        <FONT COLOR="#000080"><I>// ist schon nullterminiert wegen + 2 siehe oben</I></FONT>
        Text[TextLen] := <FONT COLOR="#0000FF">'*'</FONT>;
        <FONT COLOR="#000080"><I>// Text setzen</I></FONT>
        SendMessage(Fokus, WM_SETTEXT, 0, LParam(@Text[0]));
        <B>end</B>;
        <B>finally</B>
        <FONT COLOR="#000080"><I>// Speicher wieder freigeben</I></FONT>
        FreeMem(Text);
        <B>end</B>;
        <B>end</B>;
        <B>finally</B>
        <FONT COLOR="#000080"><I>// wenn verbuden, dann wieder trennen</I></FONT>
        <B>if</B> Attached <B>then</B>
        AttachThreadInput(SelfId, ThreadId, False);
        <B>end</B>;
        Timer1.Enabled := True;
        <B>end</B>;
        <p>
        </TT></PRE>

        Gruß Nico

        PS: Bemerkung kann ich erst heute abend dazu geben (muß weg)

        Comment


        • #5
          Hi,

          jau danke, das funktioniert soweit ganz gut. Nur sollte es nicht der gesamte Text eines fokusierten Objekts sein, sondern nur der markierte Text aus Memos oder Editfeldern. Desweiteren sollte auch markierter Text aus dem Standardbrowser "eingefangen" werden können.
          Hast du vielleicht auch dafür einen Ansatz?

          Gruß

          Michae

          Comment


          • #6
            Bin leider nicht mehr dazu gekommen, obigen Quelltext zu kommentieren,<br>
            aber das scheint ja nicht erklärungsbedürftig zu sein.<p>
            Du kannst mit der EM_GETSEL Message die Start- und Endposition<br>
            des selektierten Bereiches im Edit-Feld holen.<br>
            Dann brauchst Du nur noch diesen Bereich aus dem Gesamttext herauskopieren<p>

            Gruß Nic

            Comment


            • #7
              Hi

              Oder Du sendest eine WM_COPY Message an das Fensterhandle. Normalerweiser müsste dann die Standardfensterfunktion den selektierten Text kopieren. Du brauchst dann nur noch die Zwischenablage auszulesen (vor wm_Copy leeren!)

              Gruß Hage

              Comment


              • #8
                Hallo Leute,
                danke nochmal.
                Hab ein bischen herumprobiert...
                Bei Anwendungen wie Notepad oder Word 97 bekomme ich das gewünschte Ergebnis (markierten Text in der Zwischenablage oder direkt mit WM_GETTEXT). Beim Internetexplorer oder Delphi dagegen nicht. Beim Internetexplorer bekomme ich zwar den Text aus der Adress-ComboBox, aber keinen Text aus dem Browserfenster.
                Irgendeine Idee?

                Gruß

                Michae

                Comment

                Working...
                X