![]() |
ClipBord
Hallo,
ich habe ein kleines Delphi-Programm in der Taskbar aktiv und kann jetzt per Tastatur einen Text über ClipBord in die Zwischenablage kopieren. Wie bekomme ich diesen Text in ein externes Formular (Textdatei, Textverarbeitung). Ich kenne zwar PasteFromClipboard aber ich weiß nicht wie ich damit den Text in die fremde Anwendung bekommen soll. Es soll folgendermaßen ablaufen: Ich öffne z. B. eine Textverarbeitung und möchte nun einen vordefinierten Text über eine Tastenkombination z.B. (Strg +T) den mein Programm dann in die Zwischenablage kopiert, sofort in die Textverarbeitung einfügen. Vielleicht könnte mir hier jemand auf die Sprünge helfen. Gruß Oldmann |
AW: ClipBord
Ich kann dir leider nicht helfen, aber vielleicht kannst du mir kurz helfen...
Ich habe keine Ahnung wie ich eine Frage stellen kann?:pale::pale::pale::pale: |
AW: ClipBord
Hallo,
wenn Du angemeldet bist klicke auf 'Neues Thema erstellen', Gruss Olmann |
AW: ClipBord
Wenn ich dich richtig verstehe ist dein einziges Problem doch nur zu erkennen dass jemand [Strg]+[T] gedrückt hat, den Rest hast du im Griff, oder?
|
AW: ClipBord
Ich hätte jetzt gedacht, das Problem ist der Textverarbeitung automatisiert zu sagen, das an irgendeiner Stelle was rein gepastet / eingefügt werden soll. Dazu müsste man mMn die Textverarbeitung erstmal fernsteuern, oder?
|
AW: ClipBord
Ich bezweifle dass er den "Rest" im Griff - oder ich verstehe es falsht.
Es geht doch darum wie er den Text in die Textverarbeitung bekommt. Diese Textverarbeitung ist aber nicht sein Delphi-Programm - oder? Ic habe mich jahrelang mich damit beschäftigt, meinen Text in eine fremde Textverarbeitung zu schieben. Der Anwender muss wo einstellen, was er denn hat. Bei extrem wenigen kann man dann ein wm_Paste schicken. Bei den meisten muss man über FindWindow das Fenster raussuchen und dann die richtige Message schicken. Gescheitert bin ich dnn bei Staroffice. Und weil die in der Mailingliste so arrogant waren habe ich es dann gelassen. |
AW: ClipBord
Hallo,
erst mal Danke für die rege Anteilnahme. Nochmal zum besseren Verständnis. Der Anwender hat eine Textverarbeitung oder ein Textdokument geöffnet und der Cursor steht in der Textverarbeitung an einer leeren Stelle. Wenn der Anwender jetzt "Strg+T" drückt wird ein vorher bestimmter Text in die Zwischenablage von Windows kopiert. Ich möchte das dieser Text jetzt automatisch in der Textverarbeitung an der Cursorposition eingefügt wird. Ich möchte also nicht noch einmal "Control + Einf" drücken müssen. Also den Text in die Zwischenablage kopieren klappt. Was noch nicht klappt ist den Text in der Textverarbeitung oder dem Textdokument einzufügen. Gruss Oldmann |
AW: ClipBord
Liste der Anhänge anzeigen (Anzahl: 1)
Hab hier eine Unit namens SendKeys rumliegen, die kann Tastenanschläge an ein Programm senden.
OT: Kann mal jemand dem Thread einen vernünftigen Titel geben? "Tastenanschläge an Programm senden" oder so. Kann man auch einfach mal suchen hier, dann würde man sicher auch schon eine Lösung finden. |
AW: ClipBord
Besorg Dir einen Window-Spy, der verrät Dir wie der Classname lautet von der Komponente wo Du zugriff drauf haben möchtest.
Dann über WinApi nurnoch Clipboard kommandos fürs Classname Handle aufrufen, fertig. Alternativ, Dein Hotkey muss ja so oder so Systemweit funktionieren, lass bei Deiner Hotkey Aktion einfach Deinen Text ins Clipboard Kopieren, der Anwender muss dann zwar doppelt drücken (CTRL-T danach CTRL+V) aber Du brauchst Dir nie Gedanken machen was ein Anwender da gerade offen hat (falls das Zielprogramm auf unterschiedlichen Systemem ein anderes ist, System A = Notepad, System B = WinWord.... nur so als Beispiel) Gleichzeitig könntest Du ja bei CTRL+T ein kleines popup einblenden lassen wo der User per Wiederholtem T drücken sich was anderes aus ner Liste aussuchen kann. |
AW: ClipBord
Zitat:
|
AW: ClipBord
Hallo,
scheinbar gibt es immer noch unklarheiten mit meiner Frage. Es ist ein Sytemweiter Hotkey. Der Text liegt schon in der Zwischenablage von Windows. Ich möchte gerade vermeiden, dass der Anwender zusätzlich Tasten drücken muss. Das Ziel ist, das der Text aus der Zwischenablage in einem Zug in das Textdokument eingefügt wird. Also der Anwender drückt "Strg+E" und der hinterlegte Text wird in die Zwischenablage kopiert. Also wie bekomme ich den Text ohne zusätzlich Tasten zu drücken in das Textdokument. Ich hoffe, dass das deutlich war. Gruss Oldmann |
AW: ClipBord
Hallo,
ich gehe mal davon aus, dass MS-Word zur Textverarbeitung verwendet wird. In diesem Fall könnte man das so realisieren:
Delphi-Quellcode:
Wie das mit anderen Textverarbeitungs-Tools geht, kann ich Dir nicht sagen.
procedure CpClipToWord;
var WordApp, WordDoc: OleVariant; begin try WordApp := GetActiveOleObject('Word.Application'); // Aktives geöffnetes Word except Exit; end; WordDoc:=WordApp.ActiveDocument; // Aktives Worddokument WordApp.Selection.Paste; // Inhalt vom Clipboard an der aktuellen Cursorposition im Worddokument schreiben WordApp.Selection.TypeText(#13#10); // ggf. den Cursor in die nächste Zeile setzen end; |
AW: ClipBord
Zitat:
Wenn du erstmal weißt, wo du her kamst, dann sollte es möglich sein, da Text hinzupasten. Siehe z.B. #9. |
AW: ClipBord
Hab ich da was falsch verstanden?
[Strg+V] und gut ist? Gruß K-H |
AW: ClipBord
Hallo,
Danke erst mal wieder. man kann doch über "Shift Einf" jeden Text aus der Zwischenablage in jede Textverarbeitung oder jedes Textdokument einfügen. Dazu ist es doch vollkommen egal welche Textverarbeitung oder welches Textdokument es ist. Man müsste diese Tastendrücke doch in Delphi auch simulieren können ? Ich möchte mich nicht auf irgend eine Spezielle Anwendung festlegen, da ich ja nicht weiß welche Anwendung der Benutzer hat. Es sieht simpel aus, aber scheinbar ist es doch komplizierter. Ich habe das bis jetzt nicht geschafft aber es gibt doch unter euch sicher Profis die so etwas können. Gruss oldmann |
AW: ClipBord
Nach welchen Kriterien soll die Anwendung ermittelt werden, an die eine Tastenkombination zu senden ist?
Wahrscheinlich doch an das Anwendungsfenster, welches zuvor als letztes aktiv war? Weist du nicht wie das geht? Ansonsten hat die Redeemer bereits Quellcode zur Verfügung gestellt, um eine Tastenkombination an eine Anwendung zu senden. Kommst du damit nicht klar? "Shift+Einf" wird möglicherweise nicht in jedem Fall funktionieren, "Strg+V" ist besser. |
AW: ClipBord
Ich blicke da immer noch nicht durch aber hier ein Ansatz mit Delphi 5:
Delphi-Quellcode:
Das bewirkt folgendes:
for i := 1 to Length(MeinText) do
begin keybd_event(Ord(MeinText[i]), 0, 0, 0); Sleep(10); keybd_event(Ord(MeinText[i]), 0, 0 or KEYEVENTF_KEYUP, 0); Sleep(10); end; Egal was gerade den Focus hat bekommt deinen "MeinText" gesendet. Ist es das was Du wolltest? |
AW: ClipBord
Wie schon teilweise oben beschrieben.
Wenn du mit der Zwischenablage arbeitest und beispielsweise STRG + C drückst, dann wird das Objekt oder der Bereich der aktiven Anwendung in die Zwischenablage kopiert. Nun musst du dein anderes Programm als aktiv erklären und dann würde auch STRG +V gehen. Das ist offenbar dein Problem. Deshalb musst du wissen, welches das "Zielprogramm" sein soll. Ansonsten würde ein STRG + V wieder in dein Quellprogramm kopieren. Ich mache das mit einem meiner Programme so, dass ich das "Zielprogramm" anlerne und dann weiß mein Programm, mit welchem anderen Programm es zusammenarbeiten soll. |
AW: ClipBord
Wenn ich es nun richtig verstanden habe, dann wird deine Anwendung mit Strg+T NICHT zur aktiven Anwendung.
Und die Textverarbeitung war und ist immer noch die aktive. Dann sollte das was KodeZwerg schrieb funktionieren. |
AW: ClipBord
Wenn ich das richtig verstanden habe, dann muss man also vorher einen Text in deiner Anwendung auswählen.
Dann wechselt man in die Textverarbeitung, drückt STRG+T was dann in deiner Anwendung den Text in die Zwischenablage kopiert, und dann soll dieser Text quasi automatisch an der Cursorposition eingefügt werden. In der Annahme, dass ich das richtig verstanden habe, wäre es nicht wesentlich einfacher, wenn die Auswahlaktion in deiner Anwendung den Text gleich bei der Auswahl in die Zwischenablage kopiert und der Anwender dann in der Textverarbeitung nur noch STRG+V drückt? Immerhin muss er ja sowieso in deine Anwendung wechseln, um einen Text auszuwählen. Warum dann noch mal das ganze umständlich über STRG+T? Mal abgesehen, dass du dann ja auch sicherstellen musst, dass die ZielTextverarbeitung nicht STRG+T selbst verwenden möchte, und dass STRG+V eigentlich den meisten Anwendern geläufig ist. |
AW: ClipBord
Hallo,
erst mal wieder ein großes Danke für die rege Teilname. Aber wie ich aus den Hinweisen ersehen kann, ist noch nicht allen klar worum es genau geht. Wahrscheinlich drücke ich mich zu ungenau aus. Daher nochmal, der Anwender öffnet ein Textformular und der Cursor steht im Textfeld. Er drückt jetzt "Strg+T" und es öffnet sich ein Listfeld mit verschiedenen Texten die der Anwender erstellt hat. Er klickt eine Textdatei an. Die Datei wird gelesen und der Text wird in die Zwischenablage von Windows kopiert und das Listfeld schließt sich. Natürlich könnte der Anwender den Text jetzt per "Shift+Einf" in sein Textdokument einfügen, aber genau das möchte ich vermeiden. Der Text soll nach drücken von "Strg+T" sofort in das Textdokument eingefügt werden. Der Ansatz von CodeZwerg scheint ein guter Weg zu sein. Ich gehe davon aus, dass 's' den Text aus der Zwischenablage übernehmen soll. Leider werden im Textfeld aber nur ein paar Zahlen ausgegeben. Aber zumindest wird schon mal was ausgegeben. Gleichzeitig öffnet sich ein Suchfeld, in dem auch einige Zahlen stehen. Ich denke, dass mit der Lösung dieses Problems auch vielen anderen geholfen wird die ein ähnliches Problem haben. Gruss Oldmann |
AW: ClipBord
Wie wäre es wenn Du uns einfach mal Dein Projekt zeigst?
Das was Du wolltest macht der Schnippsel den ich gab, wie Du den benutzt kann ich nicht beurteilen da ich kein Code sehe. Du hast ein Talent Dich so auszudrücken das nicht nur ein Result bei rauskommen kann und bei jeder Aussage kommt was anderes hinzu wo noch mehr ??? auftauchen da wieder irgendwas verschleiert bleibt. Vielleicht hat ja jemand ne stärkere Glaskugel, mir geht der Saft aus :-) |
AW: ClipBord
Das Clipboard arbeitet immer mit dem aktiven Fenster (hat den Fokus). Dies habe ich schon im Beitrag #18 versucht, deutlich zu machen.
Wenn du also über die Zwischenablage gehen willst, dann musst du dein Zielprogramm zum aktiven Fenster machen. Sonst wird das nichts. Beiträge über "aktives Fenster" gibt es zuhauf im Forum. |
AW: ClipBord
Hallo CodeZwerg,
Hier ist das Listing:
Delphi-Quellcode:
Gruss Oldmann
procedure TForm4.FileListBox1Click(Sender: TObject);
var s,d_name:string; i:integer; begin If FileListBox1.ItemIndex >= 0 Then begin Clipboard.clear; d_name:=ExtractFileName(filelistbox1.filename); Try Assignfile(f,lpf+'\Mustertexte\'+d_name); Reset(f); while not eof (f) do begin readln(f,s); Clipboard.AsText:=Clipboard.AsText+s+#13#10; end; Closefile(f); Except Closefile(f); end; Form4.Close; end; [COLOR="Blue"]// Hier habe ich Deinen Text eingefügt.[/COLOR] for i := 1 to Length(s) do begin keybd_event(Ord(s[i]), 0, 0, 0); Sleep(10); keybd_event(Ord(s[i]), 0, 0 or KEYEVENTF_KEYUP, 0); Sleep(10); end; end; |
AW: ClipBord
Wenn Form4.Close aufgerufen wurde, was hat dann den Focus? Deine ListBox1 ? (so klappt mein Code nicht)
|
AW: ClipBord
Hallo KodeZwerg,
Form4 wird ja nicht mehr gebraucht, da der Text ja in der Zwischenablage von Windows ist. Oldmann |
AW: ClipBord
Damit es präziser arbeitet solltest Du per
![]() ![]() Ps: Die Zwischenablage/Clipboard benötigst Du nicht um ans Ziel zu kommen. |
AW: ClipBord
Hallo KodeZwerg,
Diesen Befehl kenne ich nicht. Wie und wo mus ich den in meinem Code einsetzen. Oldmann |
AW: ClipBord
GetForegroundWindow() im Hotkey-Event. Gleich als erstest bevor Du Deinen Kram anzeigen lässt.
SetForegroundWindow() vor meinem Schnippsel mit dem Result vom obigen GetForegroundWindow(). Wenn Du da mehr Hilfe brauchst müsste man mehr Code von Dir sehen. Wenn es nicht gerade ein Geheimprojekt ist, häng es doch einfach mal ran. |
AW: ClipBord
Hallo KodeZwerg,
Hier ist mehr Code:
Delphi-Quellcode:
oldmann
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
var fNameBMP, fNameJPG, verz_name:string; pic : TImage; begin if Msg.HotKey = id1 then begin Form4.Filelistbox1.Mask:=Lpf+'Mustertexte\*.txt'; Form4.Show; end; if Msg.HotKey = id2 then begin Clipboard.clear; Clipboard.AsText:=Clipboard.AsText+'ews@eberhard-werner.de'; // Form1.PasteFromClipBoard; end; end; procedure TForm1.WMTASKBAREVENT(var message: TMessage); var point : TPoint; begin case message.LParamLo of WM_LBUTTONDBLCLK : begin form2.show; end; WM_RBUTTONDOWN : begin GetCursorPos(point); popupmenu1.popup(point.x,point.y); end; end; end; procedure TaskBarAddIcon; var tnid : TNOTIFYICONDATA ; begin tnid.cbSize := sizeof(TNOTIFYICONDATA); // Größenangabe der Struktur tnid.Wnd := Form1.handle; // Handle des Message-Empfängers tnid.uID := 1; // ID beliebig tnid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP; // siehe Tabelle tnid.uCallbackMessage := WM_TASKBAREVENT; // Message# für Form1 tnid.hIcon := form1.image2.picture.icon.handle; // Iconhandle strcopy(tnid.szTip,'Textdateien'); // Tooltiptext Shell_NotifyIcon(NIM_ADD, @tnid); // Registrieren ... end; procedure TaskBarRemoveIcon; var tnid : TNOTIFYICONDATA ; begin tnid.cbSize := sizeof(TNOTIFYICONDATA); tnid.Wnd := Form1.handle; tnid.uID := 1; Shell_NotifyIcon(NIM_DELETE, @tnid); end; procedure TForm1.FormCreate(Sender: TObject); const MOD_ALT = 1; MOD_CONTROL = 2; MOD_SHIFT = 4; MOD_WIN = 8; VK_A = $41; VK_R = $52; VK_F4 = $73; VK_T = $54; VK_E = $45; VK_0 = $30; VK_1 = $31; VK_2 = $32; VK_3 = $33; VK_4 = $34; VK_5 = $35; VK_6 = $36; VK_7 = $37; VK_8 = $38; VK_9 = $39; begin // Register Hotkey Ctrl + T id1 := GlobalAddAtom('Hotkey1'); RegisterHotKey(Handle, id1, MOD_CONTROL, VK_T); ShowWindow(GetWindow(handle,GW_OWNER),SW_HIDE); id2 := GlobalAddAtom('Hotkey2'); RegisterHotKey(Handle, id2, MOD_CONTROL, VK_E); end; |
AW: ClipBord
Zitat:
Es existiert eine Anwendung, die Du selbst geschrieben hast. Wenn der Cursor in einem bestimmten Textfeld steht, betätigt der Anwender [Strg+T] und er bekommt eine Dateiauswahl (von Dateien deren Inhalt in diesem Zusammenhang sinnvoll sind). Er wählt eine Datei aus und Teile oder dier ganze Inhalt soll in das Textfeld übernommen werden, daß gerade aktiv ist. Ist das soweit korrekt? Gruß K-H |
AW: ClipBord
Hallo p80286
das ist korrekt. oldmann |
AW: ClipBord
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm..
Ich hab das mal aufgegriffen und nen kleines TestTool gebastelt. Es wird gestartet und minimiert sich. Dann öffne ich eine beliebige Anwendung gehe dort in ein Text-Feld und drücke STRG+T. Nun kommt das Fenster nach Vorne. Der Einfachheithalber ein einfaches Memo, kann auch ne Auswahl sein.. Hier nen Text eingeben und 'Take' clicken. Es minimiert sich dann wieder, setzt dann das andere Fenster in den Vordergrund und überträgt den Text per KeyEvent.. Ganz ohne Clipboard ;) (Erstellt und getestet mit D6 auf Windows 7) |
AW: ClipBord
Ja so in etwa hatte ich mir das gedacht. Wenn es funktioniert sollte ja nun ein brauchbares Beispiel existieren mit dem man was machen kann da die Aussage "Hallo p80286; das ist korrekt." mich wieder völlig aus der Bahn gehauen hat.
Hat oldman nun selbst eine Textverarbeitung in der er was reingeschrieben haben will? Dann sind unsere Bemühungen hier mehr als deplaziert. Bin gespannt was er zu HolgerXs Demo sagt... |
AW: ClipBord
Hallo,
erst mal wieder Danke für Eure Bemühungen. Das große Interesse an dem Thema hat mich sehr gefreut. Ich hoffe, dass KodeZwerg inzwischen wieder in der Bahn ist. Natürlich habe ich eine Anwendung geschrieben, aus der ich wie ich mehrfach in meinen Beiträgen betont habe, Textfragmente aus meiner Anwendung in andere Anwendungen wie Textverarbeitung, Textdokumente, E-Mail einfügen kann. Ein ganz besonderer Dank gebührt HolgerX der sich hingesetzt hat und ein kleines Beispiel für mich geschrieben hat, dass auch noch wunderbar funktioniert. Das ist echte Hilfe. Daher ist das Thema erst einmal erledigt. Vielleicht könnte mir noch mal jemand sagen, ob und wie man das Thema offiziell als erledigt markiert. Also nochmals vielen Dank. Oldmann |
AW: ClipBord
Zitat:
Schade das meine Hilfe nicht echt war. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 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