Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz