Newsgroup: it.comp.lang.delphi
Titolo: catturare testo in applicazione attiva

mi trovo a dover catturare del testo, che si seleziona ma non va in 
clipboard da un'applicazione attiva.
Vorrei sapere se è possibile creare un programmino che mi catturi il testo 
dell'applicazione e me lo faccia mettere magari in un tmemo.
Il problema è che se ho attivo il mio programma di copia testo... non so 
come fare a catturare da un altro programma....
ringrazio tutti per i suggerimenti! 

"NB" ha scritto nel messaggio

Velocemente: trovi l'handle dell'altra applicazione con l'API FindWindow
e simili. Poi invia al controllo i messaggi WM_GETTEXTLENGTH e WM_GETTEXT.
Maggiorni informazioni su MSDN.
Ciao
-- 
ACSH
[TurboDelphi]
Chi fa da se', fatica il doppio 


Ho studiato un po' ed ho impelemntato un paio di funzioni seguendo le tue 
direttive...
Il problema è che le istruzioni che ho usato (
    sendMessage(hwindow, WM_SYSCOMMAND,WM_gettextlength, 0);
    sendMessage(hwindow, WM_SYSCOMMAND,WM_gettext, 0);
vedi sotto...)
non copiano sulla clipboard il testo selezionato..
dove sbaglio?
function FindWindowByTitle(WindowTitle: string): Hwnd;
var
  NextHandle: Hwnd;
  NextTitle: array[0..260] of char;
begin
  // Get the first window
  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
  while NextHandle > 0 do
  begin
    // retrieve its text
    GetWindowText(NextHandle, NextTitle, 255);
    if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
    begin
      Result := NextHandle;
      Exit;
    end
    else
      // Get the next window
      NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
  end;
  Result := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@EnumWindowsProc, Integer(Listbox1));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
  x:integer;
  hwindow: HWND;
begin
  hwindow := FindWindowbytitle(edit1.text);
  if hwindow <> 0 then
  begin
    sendMessage(hwindow, WM_SYSCOMMAND,WM_gettextlength, 0);
    sendMessage(hwindow, WM_SYSCOMMAND,WM_gettext, 0);
    memo1.lines.add(clipboard.AsText);
 end;
end;

 dove sbaglio?
Non copiano nulla perchè non hanno alcun senso: non hai letto la
documentazione su MSDN o nell'help? E la clipboard da dove
salta fuori?
Il seguente metodo recupera il testo presente in un controllo di un'altra
applicazione:
procedure TForm1.RecuperaTestoDaControllo(NomeFinestraPrincipale,
  NomeControllo: string; var Testo: String);
var
 HFinPrincipale, HControllo: HWND;
 chBuffer: array[0..255] of Char;
begin
 // recupero l'handle della finestra principale dato il titolo
 HFinPrincipale := Findwindow(nil, PChar(NomeFinestraPrincipale));
 // recupero l'handle del controllo presente sulla finestra principale
 HControllo := FindWindowEx(HFinPrincipale, 0, PChar(NomeControllo), nil);
 // invio il messaggio per recuperare il testo nel controllo
 if not (HControllo = 0) then
  begin
   SendMessage
     (HControllo, WM_GETTEXT, SizeOf(chBuffer), Integer(@chBuffer[0]));
   Testo := chBuffer;
  end;
end;
Questo è un modo semplice di usare FindWindow ed il messaggio WMGETTEXT:
sono solo tre linee di codice e funzionano bene.
Per usarle fai questa prova:
1 - crea una applicazione vuota;
2 - modifica la caption della form in FormMemo;
3 - metti un memo sulla forma ed inserisci il testo che vuoi;
4 - compila.
Ora, lancia questo banale programma dalla shell e lascialo lì a far niente.
Poi:
1 - crea una seconda applicazione vuota,
2 - inserisci come metodo privato il codice scritto sopra.
3 - metti un bottone e un memo sulla form
4 - nell'OnClick del bottone inserisci
 Memo1.Clear;
 RecuperaTestoDaControllo('MemoForm', 'TMemo', TestoRecuperato);
 Memo1.Lines.Text := TestoRecuperato;
5 - Lancia il programma.
Ad ogni click sul bottone, il testo del Memo della prima applicazione
comparirà nel memo della seconda applicazione.
Il problema ora è un altro: devi conoscere i nomi ESATTI della finestra e
del controllo dove vuoi recuperare il testo. Per fare questo, usa un
programma tipo Winspector Spy.
Ciao
ACSH
-- 
If you don't think carefully, you might think that programming is
just typing statements in a programming language.
(Ward Cunningham)