![]() |
Text aus fremder Anwendung läßt sich nicht kopieren
Liste der Anhänge anzeigen (Anzahl: 5)
Hallo Leute,
ich habe die Suchfunktion und Google schon bemüht aber alle gefundenen Lösungsansätze haben mir leider nicht geholfen. Vielleicht habt ihr ja einen Tipp: Ich möchte an den Text aus einer fremden Anwendung kommen. Wie ist mir im Prinzip egal :) Die Anwendung ist die Entwicklungsumgebung der Sprache NATURAL.(wie das aussieht, siehe Bild 1) Ich habe alle möglichen Handles im Zugriff. Die Fensterstruktur könnt' ihr auf Bild 2 sehen. Der Text an den ich ran möchte, steht in der Fensterklasse "PgmEdtEditWin" Die Properties des Fensters seht ihr in Bild 3 bis 5. Wie es aussieht, hat das Fenster keine weiteren Fenster(Edits etc), also muss der Text ja wohl "da drin stecken" Meine Idee war, an den Text über die Zwischenablage zu kommen. Aber alle meine Versuche mit WM_COPY bzw. Tasten senden sind gescheitert. Passiert nix :pale: Etwas erschwerend kommt hinzu, dass mein Code per Hook aufgerufen wird.. ich weiß nicht, ob das einen Einfluss hat(Taste senden etc.) (der Hook reagiert auf die rechte Maustaste bzw. auf das sich dann öffnende Popupmenü) Hier mal ein Stück Code(ist nicht vollständig!)
Delphi-Quellcode:
Habt ihr eine Idee?
if nCode = HC_ACTION then
begin fillchar(cwps,Sizeof(CWPStruct),0); CopyMemory(@cwps, Pointer(lParam), SizeOf(CWPSTRUCT)); GetClassName(cwps.hwnd, szClassName, SizeOf(szClassName)); klasse := szClassName; if pos('NIDE', klasse) > 0 then begin case cwps.message of WM_INITMENU: begin focus := getfocus; GetClassName(focus, szClassName, SizeOf(szClassName)); klasse := szClassName; if klasse = 'PgmEdtEditWin' then begin SendMessage(focus,WM_COPY , 0, 0); s := clipboard.AsText; MessageBox(0,pchar(s),'Info',0); // STRG A und STRG C senden Keybd_Event(VK_CONTROL,0,0,0); Keybd_Event(byte('A'),0,0,0); Keybd_Event(byte('A'),0,KEYEVENTF_KEYUP,0); Keybd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); sleep(200); Keybd_Event(VK_CONTROL,0,0,0); Keybd_Event(byte('C'),0,0,0); Keybd_Event(byte('C'),0,KEYEVENTF_KEYUP,0); Keybd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); s := clipboard.AsText; MessageBox(0,pchar(s),'Info',0); end; end; Wenn ich per Winspector die Messages anschaue, die bei einem manuellen STRG A + C ausgelöst werden, sind da ein Haufen WM_USER+Zahl dabei aber kein WM_COPY :?: Danke schon mal |
AW: Text aus fremder Anwendung läßt sich nicht kopieren
Zitat:
warum sollte nicht so etwas dahinter stecken?
Delphi-Quellcode:
Gruß
for i:=0 to liste.Count-1 do
mycanvas.Textout(x,y,liste[i]); K-H |
AW: Text aus fremder Anwendung läßt sich nicht kopieren
|
AW: Text aus fremder Anwendung läßt sich nicht kopieren
@DeddyH: habe ich auch schon probiert. Leider keinen Erfolg. Wenn die Klasse nicht von Edit, Memo oder RichEdit
abgeleitet ist, kommt man mit GETTEXT&Co nicht ran.(wenn es z. Bsp. so gemacht wurde wie von p80286 beschrieben) Deshalb hatte ich ja die Idee mit der Zwischenablage. Aber anscheinend "sperrt" sich die Anwendung auch gegen ein "fernsteuern" :cry: |
AW: Text aus fremder Anwendung läßt sich nicht kopieren
Dass das selbst gezeichnet wird, ist ja relativ offensichtlich. Und wenn auch die Standard-Windowsmessages zur Textabfrage nicht behandelt werden, und du auch im Menü nicht an den Eintrag, der den Text kopiert, herankommst (wobei das den Benutzer wohl auch ziemlich stören würde), bleibt wohl nur einen Hook auf die Zeichenfunktionen zu setzen.
|
AW: Text aus fremder Anwendung läßt sich nicht kopieren
So, drei Schokoladenstückchen weiter ... :-D
Die Anwendung sperrt sich nicht gegen das Strg-A+C, sondern die Tasten kommen schon im Kontextmenü an :? Das widerspricht aber dem MSDN: WM_INITMENUPOPUP Sent when a drop-down menu or submenu is about to become active. This allows an application to modify the menu before it is displayed, without changing the entire menu. Das Menü ist noch nicht sichtbar aber hat schon den Focus :roll: |
AW: Text aus fremder Anwendung läßt sich nicht kopieren
Zitat:
![]() Tipp: Im 2ten Beitrag ist ne überarbeitete Version von Tonic ;) |
AW: Text aus fremder Anwendung läßt sich nicht kopieren
Hallo,
also mit dem OLE-Drop bin ich nicht so recht klar gekommen...habe aber nur die Demo mal angeschaut. :roll: Ich bin aber trotzdem einen Schritt weiter. Es scheint aber wirklich so zu sein, dass die Anwendung sich dagegen "wehrt", dass man ihr den Text klaut. Tastaturevents schicken ging nicht. Mit Winspector Spy habe ich mir mal die Messages angeschaut, welche durch ein STRG-A/C ausgelöst werden und habe die mal genauso "nachgebaut"
Delphi-Quellcode:
Was die Zahlen bedeuten, weiß ich nicht... aber es tut. :stupid:
// Ctrl-A
sendMessage(focus, WM_user + 5018, $0017573,0); sendMessage(focus, WM_user + 5694, 0,0); sendMessage(focus, WM_user + 5678, 0,$0012e27c); // Ctrl-C sendMessage(focus, WM_user + 5018, $0017570,0); sendMessage(focus, WM_user + 5694, 0,0); sendMessage(focus, WM_user + 5678, 0,$0012e294 ); Habe die Anwendung auch mehrfach gestartet, auch Win neu gestartet, die Zahlen blieben immer gleich. So richtig glücklich bin ich damit nicht, da ich nicht genau weiß, was da abgeht... Durch den simulierten CTRL-A ist nun aber der Text selektiert. Weiß jemand, wie man einen Text nun wieder "deselektiert"? |
AW: Text aus fremder Anwendung läßt sich nicht kopieren
Schick ein "Pfeil auf" oder ähnliches ...
|
AW: Text aus fremder Anwendung läßt sich nicht kopieren
Liste der Anhänge anzeigen (Anzahl: 1)
OK, danke für die schnelle Antwort.
Im Anhang könnt' ihr mal das Ergebnis "bewundern" :-D Links im Bild seht ihr das Popupmenü, welches ich um das Untermenü "Jump" erweitert habe. Im Untermenü stehen nun alle Subroutinen(ähnlich Prozeduren in Delphi) der NATURAL-Programmsource. Nächste Herausforderung: Bei der Vergabe der Command-Id, dache ich, wäre man recht wahlfrei. Ist aber nicht so. Ich habe mir eine globale Variable definiert:
Delphi-Quellcode:
id : Integer = 400;
Die einzelnen Menüeinträge hänge ich so an:
Delphi-Quellcode:
Dummerweise sind so alle Einträge des Untermenüs Jump disabled.
id := id + 1;
AppendMenu(jump, MF_STRING or MF_ENABLED, id, PChar(s)); Setzte ich den Startwert von id auf 400000 sind die Einträge auswählbar(fragt nicht wie lange ich da rum gesucht habe :evil:) Gibt es einen definierten "Startwert"? WM_USER + ????? ab dem ich "meine" Command-Ids vergeben kann? Kann es nicht vorkommen, dass meine Einträge mit den bestehenden Einträgen kollidieren könnten :?: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz