Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Control + Copy-Simulation funktioniert nicht!! (https://www.delphipraxis.net/68722-control-copy-simulation-funktioniert-nicht.html)

gugelhupf 4. Mai 2006 07:51


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:
procedure TFrmMain.FormCreate(Sender: TObject);
const
  MOD_ALT = 1;
  VK_R = $52;
begin
  FHotKey := GlobalAddAtom('Hotkey1');
  RegisterHotKey(Handle, FHotKey, MOD_ALT, VK_R);

  // ...
end;
HotKey-Event:
Delphi-Quellcode:
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;
Wenn das Formular aktiviert ist:
Delphi-Quellcode:
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;
HotKey wieder löschen:
Delphi-Quellcode:
procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  UnregisterHotKey(Handle, FHotKey);
  GlobalDeleteAtom(FHotKey);
end;
Wer von Euch weiß Rat? :gruebel:

OS: WinXP
Delphi: Version 5, Enterprise

Luckie 4. Mai 2006 08:11

Re: Control + Copy-Simulation funktioniert nicht!!
 
Zitat:

Zitat von gugelhupf
leider funktioniert immer noch nichts davon.

Und was funktioniert nicht? Registrieren des Hotkeys? Reagieren auf den Hotkey? Kopieren des ausgewählten Textes im Browser in die Zwischenablage? ...

gugelhupf 4. Mai 2006 08:20

Re: Control + Copy-Simulation funktioniert nicht!!
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von gugelhupf
leider funktioniert immer noch nichts davon.

Und was funktioniert nicht? Registrieren des Hotkeys? Reagieren auf den Hotkey? Kopieren des ausgewählten Textes im Browser in die Zwischenablage? ...


jensw_2000 4. Mai 2006 08:59

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:
  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);
Schöne Grüße,
Jens

gugelhupf 4. Mai 2006 09:09

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?

jensw_2000 4. Mai 2006 09:32

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.

gugelhupf 4. Mai 2006 09:42

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!

jensw_2000 4. Mai 2006 09:58

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:

gugelhupf 4. Mai 2006 10:08

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.

jensw_2000 4. Mai 2006 10:34

Re: Control + Copy-Simulation funktioniert nicht!!
 
Ich bin ratlos.
Der Code arbeitet sauber, egal ob Browser oder andere Applikation ... Demo hier ...

gugelhupf 4. Mai 2006 11:26

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...

jensw_2000 4. Mai 2006 13:25

Re: Control + Copy-Simulation funktioniert nicht!!
 
Zitat:

Zitat von gugelhupf
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...

Der Code steht (relativ) kompplett oben.
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.

Christian Seehase 4. Mai 2006 15:36

Re: Control + Copy-Simulation funktioniert nicht!!
 
Moin gugelhupf,

Zitat:

Zitat von gugelhupf
nur den HotKey mach ich halt anders...

was ja vielleicht die Ursache dafür sein könnte, dass es bei Dir nicht funktioniert ;-)

gugelhupf 20. Sep 2007 12:19

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?

gugelhupf 24. Sep 2007 10:24

Re: Control + Copy-Simulation funktioniert nicht!!
 
Öhm, hallo?.. :)

Weiß keiner 'ne Antwort? :wiejetzt:

sonz 26. Sep 2007 13:38

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

Andreas.Koch1 8. Dez 2007 15:28

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