![]() |
STRG+C senden. Geht nicht :(
Ich möchte mit Delphi die Tastenkombination STRG+C senden um einen markierten Text in die Zwischenablage zu kopieren. Wie das geht, das weiß ich (zumindest theoretisch). (SuFu und Google benutzt).
Leider funktioniert es praktisch nicht. STRG+ALT+ENTFERNEN z.B. geht, STRG+C geht nicht. Diese Procedure habe ich benutzt:
Delphi-Quellcode:
Dan mit diesem Code gesendet:
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
{************************************************************ * Procedure PostKeyEx32 * * Parameters: * key : virtual keycode of the key to send. For printable * keys this is simply the ANSI code (Ord(character)). * shift : state of the modifier keys. This is a set, so you * can set several of these keys (shift, control, alt, * mouse buttons) in tandem. The TShiftState type is * declared in the Classes Unit. * specialkey: normally this should be False. Set it to True to * specify a key on the numeric keypad, for example. * Description: * Uses keybd_event to manufacture a series of key events matching * the passed parameters. The events go to the control with focus. * Note that for characters key is always the upper-case version of * the character. Sending without any modifier keys will result in * a lower-case character, sending it with [ssShift] will result * in an upper-case character! // Code by P. Below ************************************************************} type TShiftKeyInfo = record shift: Byte; vkey: Byte; end; byteset = set of 0..7; const shiftkeys: array [1..3] of TShiftKeyInfo = ((shift: Ord(ssCtrl); vkey: VK_CONTROL), (shift: Ord(ssShift); vkey: VK_SHIFT), (shift: Ord(ssAlt); vkey: VK_MENU)); var flag: DWORD; bShift: ByteSet absolute shift; i: Integer; begin for i := 1 to 3 do begin if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0); end; { For } if specialkey then flag := KEYEVENTF_EXTENDEDKEY else flag := 0; keybd_event(key, MapvirtualKey(key, 0), flag, 0); flag := flag or KEYEVENTF_KEYUP; keybd_event(key, MapvirtualKey(key, 0), flag, 0); for i := 3 downto 1 do begin if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), KEYEVENTF_KEYUP, 0); end; { For } end;
Delphi-Quellcode:
Ich habs auch einmal mit Ord('C') statt VK_C probiert, selbes Ergebnis.
...
const VK_C= 43; ... PostKeyEx32(VK_C, [ssctrl, ssAlt], False); Hier in der DP hab ich folgendes gefunden:
Delphi-Quellcode:
Funktioniert auch nicht :(
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(VK_C, 0, 0, 0); keybd_event(VK_C, 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); sleep(20); Was mache ich falsch? |
Re: STRG+C senden. Geht nicht :(
Hallo
Ich hab's mal so gemacht und es funktioniert wunderbar.
Delphi-Quellcode:
procedure Simulate_CtrlC;
begin keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), 0, 0); keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0) end; |
Re: STRG+C senden. Geht nicht :(
Es funktioniert einfach nicht! Ich habe meinem Programm gesagt, dass es Strg und C dürcken soll (Die Methode aus dem Post über mir), sobald es den Hotkey STRG+ALT+Q empfängt. Ich glaube zwar, dass der Befehl gesendet wird, aber der Text aus dem Editor (oder aus Firefox) wird einfach nicht kopiert.
:cry: |
Re: STRG+C senden. Geht nicht :(
Moin Skyquaker,
hat das Fenster denn dann auch den Fokus? |
Re: STRG+C senden. Geht nicht :(
Ja, ich bringe das Fenster in den Vordergrund und drücke dann die Tastenkombi.
|
Re: STRG+C senden. Geht nicht :(
wenn dein Hotkey Strg + Alt + Q ist kannst du logicher Weise Strg nicht nochmal drücken. Gedrückt ist gedrückt und du musst die Taste erst wieder los lassen bis sie wieder gedrückt werden kann. Ansonsten bekommt die Andere Anwendung wohlmöglich nichts mit. Aber ist es nicht einfacher wm_copy zu verwenden oder geht das in dem fall nicht?
|
Re: STRG+C senden. Geht nicht :(
Zitat:
Delphi-Quellcode:
Kann ich damit denn auch jedes beliebige Objekt kopieren (Dateien,...) oder nur Text?
hOtherWin := GetForegroundWindow;
SendMessage(hOtherWin, WM_COPY, 0, 0); Ich hab das ganze auch mal mit dem Hotkey Alt+Q probiert. Hat auch nicht geklappt. |
Re: STRG+C senden. Geht nicht :(
Moin skyquaker,
Mit WM_COPY kannst du nur den markierten Text aus einem Edit oder einer Combo Box kopieren (siehe ![]() Gruß Willnix P.S Kennen wir uns nicht irgendwo her :angel2: ? |
Re: STRG+C senden. Geht nicht :(
Zitat:
Funktioniert denn das mit dem
Delphi-Quellcode:
generell nicht oder nur bei mir?
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(VK_C, 0, 0, 0); keybd_event(VK_C, 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); sleep(20); |
Re: STRG+C senden. Geht nicht :(
Delphi-Quellcode:
Mir ist grade aufgefallen, dass bei dieser Methode werder STRG noch ALT wirklich gefrückt werden. Lediglich DELETE (oder was da halt sonst steht).
PostKeyEx32(VK_DELETE, [ssctrl, ssAlt], False);
@Post unter mir: Sorry :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:34 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