Hallo Leute...
ich glaub ich muß meine Frage besser formulieren...
Wenn ich in einer x-beliebigen Anwendung einen Text markiere, soll der markierte Text ausgelesen werden. Klappt in verschiedenen Situationen einwandfrei - in manchen Situationen gar nicht.
Klappt bei: Notepad, Icontext Desktop, IExplorer Adressfeld ect...
Klappt nicht bei: Word, Excel, Dokumente im IExplorer..
Ich hol mir meine ThreadID, die ThreadID der aktiven Fremdanwendung, verbinde mich mit der Fremdanwendung, hol mir ein Handle auf die Fremdanwendung, und frag mal an, was das Teil so markiert hat
Wenn die Fremdanwendung MDIChild´s oder IFrames ect.. besitzt, find ich den richtigen Handle nicht mehr..
Es ist ja möglich! Manche Übersetzungsprogramme arbeiten ja auch so.. Text in irgendeiner Anwendung markieren - translaten - fertig !
Das OS kennt das GetForegroundWindow
Das OS kennt das Control, das grad aktiv ist
Das OS weiß, was selected wurde - da die Markierung vom selectierten text ja (fast immer) vom OS gezeichnet wird und "WM_Copy/Paste" ja auch auf dieses Ziel zugreifen
(Lösungsanzätze mit OCR, Clippboard als Zwischenlager,Tastatur Hooks ect.. will ich eigentlich nicht verwenden...)
Hat jemand eine Lösung ?
vielen Dank
Erich
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65:
| procedure Tmain.Timer3Timer(Sender: TObject); var SelfId : DWord; ThreadId: DWord; Attached: Boolean; Fokus : HWnd; TextLen : LResult; Text : PChar; SelStart, SelEnd : Integer; aPoint : TPoint; begin
Timer3.Enabled := False; SelfId := GetCurrentThreadId; ThreadId := GetWindowThreadProcessId(GetForegroundWindow, nil); Attached := False; if (ThreadId <> 0) and (ThreadId <> SelfId) then Attached := AttachThreadInput(SelfId, ThreadId, True); if Attached xor (ThreadId = SelfId) then try
Fokus := GetFocus; TextLen := SendMessage(Fokus, WM_GETTEXTLENGTH, 0, 0); if (TextLen >= 0) then begin GetMem(Text, TextLen + 2); try FillChar(Text^, TextLen + 2, 0); TextLen := SendMessage(Fokus, WM_GETTEXT, TextLen + 1, LParam(@Text[0])); if TextLen >= 0 then begin SendMessage(Fokus, EM_GETSEL, Integer(@SelStart), Integer(@SelEnd)); helplabel.Caption:='Von Position:'+Inttostr(SelStart)+' bis Position:'+ Inttostr(SelEnd)+'Text: '+copy(text,SelStart+1,SelEnd-SelStart); end; finally FreeMem(Text); end; end; finally if Attached then AttachThreadInput(SelfId, ThreadId, False); end; Timer3.Enabled := True; end; |
Moderiert von
Narses: Delphi-Tags hinzugefügt