![]() |
Control + Copy-Simulation funktioniert nicht!!
Moin zusammen,
ich habe ein kleines Problemchen. Ich möchte gerne mit einem globalen HotKey den selektierten Text einer anderen Anwendung (auch Firefox, IE) in die Zwischenablage kopieren und direkt in ein Editfeld meiner Anwendung einfügen. Alles nur durch Drücken des HotKeys. Ich muss dazu sagen, dass ich schon sämtliche Foren durchforst habe 2 Wochen lang - auch hier - und bin auch fündig geworden, leider funktioniert immer noch nichts davon. Hier mal ein paar Teile des Codes... HotKey festlegen und registrieren:
Delphi-Quellcode:
HotKey-Event:
procedure TFrmMain.FormCreate(Sender: TObject);
const MOD_ALT = 1; VK_R = $52; begin FHotKey := GlobalAddAtom('Hotkey1'); RegisterHotKey(Handle, FHotKey, MOD_ALT, VK_R); // ... end;
Delphi-Quellcode:
Wenn das Formular aktiviert ist:
procedure TFrmMain.WMHotKey(var Msg: TWMHotKey);
begin // Hier muss geprüft werden, ob der HK bereits betätigt wurde if Msg.HotKey = FHotKey then begin FFirstStart := False; FHKUsed := True; // Zwischenablage öffnen Clipboard.Open; // Control + Copy simulieren keybd_event(VK_CONTROL, 0, 0, 0); keybd_event(Ord('C'), 0, 0, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); Sleep(10); if Clipboard.HasFormat(CF_TEXT) then ShowMessage(Clipboard.AsText); // Zeigt nur einen leeren Text an // ... end; end;
Delphi-Quellcode:
HotKey wieder löschen:
procedure TFrmMain.ApplicationEventsActivate(Sender: TObject);
begin // Prüfen, ob es der erste Start des Programms ist if FHKUsed then begin if not FFirstStart then begin // Text aus der Zwischenablage überprüfen und als Nummer verwenden if Clipboard.HasFormat(CF_TEXT) then begin // Rufnummer füllen und "säubern" FRufnummer := CleanString(Clipboard.AsText); EditNumber.Text := FRufnummer; // Bleibt ebenfalls leer!!! end; // Zwischenablage leeren, falls etwas drinne steht ... if Clipboard.AsText <> '' then Clipboard.Clear; // ... und schließen Clipboard.Close; end; end; end;
Delphi-Quellcode:
Wer von Euch weiß Rat? :gruebel:
procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin UnregisterHotKey(Handle, FHotKey); GlobalDeleteAtom(FHotKey); end; OS: WinXP Delphi: Version 5, Enterprise |
Re: Control + Copy-Simulation funktioniert nicht!!
Zitat:
|
Re: Control + Copy-Simulation funktioniert nicht!!
Zitat:
|
Re: Control + Copy-Simulation funktioniert nicht!!
Hallo,
Der Code für CTRL+C ist unvollständig. Du "vergisst" die "C" Taste wieder loszulassen :zwinker: versuche es mal so ...
Delphi-Quellcode:
Schöne Grüße,
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(Ord('C'), 0, 0, 0); keybd_event(Ord('C'), 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); Jens |
Re: Control + Copy-Simulation funktioniert nicht!!
Funktioniert auch nicht!!!
Das Problem ist, dass beispielsweise Firefox keinen Fokus bekommt, wenn ich einen selektierten Text kopieren will. Wenn ich hingegen etwas aus der Adressleiste kopiere, funktioniert es. Nur bei Webseiten nicht! Wie kann das sein? Firefox HAT den Fokus meines Erachtens, sonst würde ich ja nichts aus der Adressleiste kopieren können, oder??? Wo ist das Problem? |
Re: Control + Copy-Simulation funktioniert nicht!!
Hier ein Stückchen Code auf einem meiner Projekte.
Es gibt definitiv keine Probleme mit Browsern. Lediglich bei Terminalservern und anderen "Remote-Desktop Anwendungen" funktioniert es auf diesem Wege nicht.
Delphi-Quellcode:
procedure TMain.WMHotKey(var Msg: TWMHotKey);
begin // Warten, bis der Hotkey durch den User losgelassen wurde ... while not ((GetASYNCKeyState(VK_LSHIFT) = 0) and (GetASYNCKeyState(VK_RSHIFT) = 0) and (GetASYNCKeyState(VK_LSHIFT) = 0) and (GetASYNCKeyState(VK_RCONTROL) = 0) and (GetASYNCKeyState(VK_RCONTROL) = 0) and (GetASYNCKeyState(VK_LMENU) = 0) and (GetASYNCKeyState(VK_RMENU) = 0)) do begin Application.ProcessMessages; end; // CTRL+C senden keybd_event(VK_CONTROL, 0, 0, 0); keybd_event(Ord('C'), 0, 0, 0); keybd_event(Ord('C'), 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // kurz warten, damit das Schreiben der Zwischenablage beendet werden kann sleep(200); Application.processmessages; // Clipboard auf Text prüfen und verarbeiten if Clipboard.HasFormat(CF_TEXT) then s := clipboard.AsText; ... ... end; Schöne Grüße, Jens :hi: PS: Verschlüsselte PDF Dokumente verweigern ebenfalls das Kopieren von Objekten (auch Text) in die Zwischenablage. Wenn du was ganz Geniales bauen willst, dann vergiss CTRL+C. Der Babylon Translator beispielsweise, liest das Wort unter dem Mauszeiger über OCR aus. Damit kannst du dann auch Textinformationen nutzen, die als Images vorliegen. Terminalserver u.Ä. sind dann auch kein Problem mehr. |
Re: Control + Copy-Simulation funktioniert nicht!!
Hast Du die Zwischenablage vor Drücken des Strg + C geöffnet mit Clipboard.Open oder nicht?
Weil ich hab im Moment noch Clipboard.Open vor dem keybd_event stehen! :gruebel: Also bei mir funktioniert es weiterhin definitiv nicht! Edit: Ich hab's nun mit und ohne vorheriges Öffnen probiert. Die Zwischenablage ist weiterhin leer! Ich habe nun noch ein Sleep(200) und ein Application.ProcessMessages eingebaut -> ebenfalls erfolglos! |
Re: Control + Copy-Simulation funktioniert nicht!!
Clipboard.Open ist optional.
Die Zwischenablage wird bei Bedarf automatisch geöffnet. Vor dem CTRL+C macht es definitiv keinen Sinn, weil deine Anwendung nichts in die Clipboard schreibt bzw. aus ihr liest. Der o.a. Code läuft unter Delphi 7 absolut sauber. Auch die Anwendung, die diesen Code benutzt läuft inzwischen auf über 150 Kundenrechnern ohne Probleme. Entweder hat Delphi 5 da einen Bug oder dein Problem steckt irgendwo anders. Ich habe keine Idee mehr, wie ich dir weiterhelfen kann. Schöne Grüße, Jens :hi: |
Re: Control + Copy-Simulation funktioniert nicht!!
Ich hab's auch schon unter Delphi 7 probiert - ebenfalls erfolglos.
Das Problem muss woanders liegen - ich denke, es hängt mit dem nichtvorhandenen Fokus des Browserfensters zusammen. Weiß aber nicht, wie ich das Problem noch lösen könnte. |
Re: Control + Copy-Simulation funktioniert nicht!!
|
Re: Control + Copy-Simulation funktioniert nicht!!
Könntest Du evtl. ein paar Zeilen mehr - vllt. wichtige - Deines Codes bekanntgeben?
Weil irgendwie hab ich alles so wie Du, nur den HotKey mach ich halt anders... |
Re: Control + Copy-Simulation funktioniert nicht!!
Zitat:
Mehr benötigt man nicht um CTRL+C auszuführen und den Textinhalt der Zwischenablage in einen String o.Ä. zu übernehmen. Der Code ist nur um ein paar Funktionsaufrufe gekürz, die den aus der Zwischenablage übernommenen Text letztlich weiterverarbeiten. Mit anderen Worten: Das ist der komplette Code zum Simulieren von CTRL+C, mit dem Zweck, den selektierten Text aus der aktiven Anwendung in die Zwischenablage zu kopieren um ihn dann in der eigenen Anwendung weiterzuverarbeiten. |
Re: Control + Copy-Simulation funktioniert nicht!!
Moin gugelhupf,
Zitat:
|
Re: Control + Copy-Simulation funktioniert nicht!!
Hallo zusammen,
habe das Problem mittlerweile behoben, der Hotkey funktioniert einwandfrei. Nur leider nicht bei einem Kunden - so wie es ausschaut bleibt dort die Zwischenablage leer. Jetzt meine Frage: Ist das ein zeitkritisches Problem, sprich hängt es an dem Sleep(200), das ausgeführt werden muss, damit das Schreiben in die Zwischenablage beendet werden kann? An jensw_2000: Hattest Du dieses Phänomen schon mal bei Deinem TAPIDial? Soll ich das Sleep einfach mal höher setzen oder habt Ihr andere Vorschläge? |
Re: Control + Copy-Simulation funktioniert nicht!!
Öhm, hallo?.. :)
Weiß keiner 'ne Antwort? :wiejetzt: |
Re: Control + Copy-Simulation funktioniert nicht!!
Hmm..mal ne ganz dumme Frage.
Funktioniert die Zwischenablage bei deinem Kunden im allgemeinen ? Man kann die ja unter Windows auch "deinstallieren" Systemsteuerung->Software->Windowskompomente hinzufügen/entfernen-> Zubehör und Diestprogrammer->Zubehör->Zwischenablageansicht Nur mal ne idee ... Ingo |
Re: Control + Copy-Simulation funktioniert nicht!!
Kurze Info an alle die - wie ich - versuchen mit Codeschnipseln zu experimentieren ;)
Um mit Clipboard arbeiten zu können muss bei uses die Unit "Clipbrd" eingebunden werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 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