Autor Beitrag
MSC
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63

Win XP Home, Win Vista Buisiness
Delphi 7 Enterprise
BeitragVerfasst: Do 28.12.06 12:48 
Hallo

Ich habe durch die Suchfunktion eine recht gute Möglichkeit gefunden, um Tasten zu "drücken".
Jetz habe ich das Problem, das ich auch Tastenkombinationen brauche, wie z.B.: Strg+C und Strg+V

Strg:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  keybd_event(vk_shift,0,0,0);
  keybd_event(ord($11),0,0,0);
  keybd_event(ord($11),0,keyeventf_keyup,0);
  keybd_event(vk_shift,0,keyeventf_keyup,0);
V:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  keybd_event(vk_shift,0,0,0);
  keybd_event(ord($56),0,0,0);
  keybd_event(ord($56),0,keyeventf_keyup,0);
  keybd_event(vk_shift,0,keyeventf_keyup,0);

Das ineinaderschachteln und Zahlen ändern hat irgendwie nichts gebracht, in der Delphi Hilfe habe ich den Befehl nicht gefunden.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  keybd_event(vk_shift,0,0,0);
  keybd_event(ord($11),0,0,0);
  keybd_event(ord($11),0,keyeventf_keyup,0);  // Strg drücken

  keybd_event(vk_shift,0,0,0);
  keybd_event(ord($56),0,0,0);
  keybd_event(ord($56),1,keyeventf_keyup,1);  // V drücken

  keybd_event(vk_shift,1,keyeventf_keyup,1);  // V loslassen?

  keybd_event(vk_shift,0,keyeventf_keyup,0);  // Strg loslassen?


Nun ist die Frage, ist das mit dieser Art und Weise überhaupt möglich, oder gibt es vordeffinerte "Kopier" und "Einfügen" Tasten, bzw. gibt es bessere Methoden für Tasten?
(brauche Tab, Enter, Pfeiltasten, Leertaste, Kopieren & Einfügen)

Dieses Programm soll in einem anderen Programm Abläufe steuern.

Die Tastencodes habe ich von dort: www.delphipraxis.net...&highlight=vk%2A
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 28.12.06 13:22 
user profile iconMSC hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  keybd_event(vk_shift,0,0,0); //für was drückst du die Shifttaste?
  keybd_event(ord($11),0,0,0); //hier hast du Strg gedrückt ! Und das Ord() ist unnötig!
  keybd_event(ord($11),0,keyeventf_keyup,0);  // Strg drücken !!! hier hast du Strg schon wieder losgelassen !!!

  keybd_event(vk_shift,0,0,0); //für was drückst du nochmal shift?
  keybd_event(ord($56),0,0,0); //hier drückst du v
  keybd_event(ord($56),1,keyeventf_keyup,1);  // (V drücken) nein hier lässt du v los

  keybd_event(vk_shift,1,keyeventf_keyup,1);  // V loslassen? Nein, hier lässt du shift los

  keybd_event(vk_shift,0,keyeventf_keyup,0);  // Strg loslassen? hier lässt du auch shift los!


Nun ist die Frage, ist das mit dieser Art und Weise überhaupt möglich, oder gibt es vordeffinerte "Kopier" und "Einfügen" Tasten, bzw. gibt es bessere Methoden für Tasten?
(brauche Tab, Enter, Pfeiltasten, Leertaste, Kopieren & Einfügen)

Dieses Programm soll in einem anderen Programm Abläufe steuern.

Die Tastencodes habe ich von dort: www.delphipraxis.net...&highlight=vk%2A


Also einiges hast du noch falsch verstanden: ord(chr) ist dafür da, um den Ordinalen Wert eines Characters zurückzuliefern. Es hat keinen sinn, als Parameter einen Ordinalen Wert einzugeben, weil dann genau das selbe wieder herauskommt.

Also ist der Wert für Strg: VK_CONTROL = 17{oder} VK_CONTROL = $11//VK_CONTROL -> VirtualKey_Control
diese Konstanten sind in Windows deklariert, und diese hier hat also Dezimal den wert 17 und Hexadezimal den wert $11.

Wenn der dritte parameter der Procedure KeyBd_Event = 0 ist, dann heißt dass, das die Taste gedrückt wurde (das Ereignis OnKeyDown ausgelöst wurde). Wenn der dritte parameter = KEYEVENTF_KEYUP oder 2 ist, dann heißt das, dass die taste losgelassen wurde (Das Ereignis OnKeyUp wurde ausgelöst).

Also musst du zuerst die Strg-Taste drücken, dann die C-Taste (für Kopieren zb) drücken, dann die C-Taste loslassen und dann die Strg-Taste loslassen.

Die Shifttaste darfst du nicht drücken. Wenn du etwas kopieren willst, dann drückst du sie auch nicht. In manchen programmen bedeutet Shift+Strg+C vllt was ganz was anderes als kopieren.


Zuletzt bearbeitet von Jakob Schöttl am Do 28.12.06 14:27, insgesamt 1-mal bearbeitet
MSC Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63

Win XP Home, Win Vista Buisiness
Delphi 7 Enterprise
BeitragVerfasst: Do 28.12.06 13:53 
Das was du geschrieben hast mit dem Shift leuchtet mir ein, aber bei "VK_CTRL = $11;" sagt mir Delphi [Fehler] Unit1.pas(57): Undefinierter Bezeichner: 'VK_CTRL'

Muss ich dazu extra etwas deklarieren, oder hab ich etwas falsch gemacht?
Oder muss es so in richtung "keybd_event(VK_CTRL = $11);" gehen, aber da macht Delphi die selbe Fehlerausschrift.
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Do 28.12.06 14:26 
Ah, Sorry, ich hab falsch geraten. Die Konstante heißt VK_CONTROL (der Wert braucht dich nicht zu interessieren).
Du drückst sie also durch KeyBd_Event(VK_CONTROL,0,0,0) und lässt sie los durch KeyBd_Event(VK_CONTROL,0,KEYEVENTF_KEYUP,0). Das gleich eben auch bei allen anderen Tasten, nur das du VK_CONTROL durch einen anderen Tasten-Code ersetzt.

Du kannst aber nicht einfach Tastendrücke an andere Anwendungen schicken. Mit KeyBd_Event geht das nur an die eigene Anwendung. Schau dir dazu das hier an!
MSC Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63

Win XP Home, Win Vista Buisiness
Delphi 7 Enterprise
BeitragVerfasst: Do 28.12.06 15:02 
OK!

THX klappt

Ich habe gemerkt, das ich auch " KeyBd_Event(ord($11),0,0,0);" verwenden kann. Das geht ebenfalls.

Vielen Dank
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 25.06.07 20:34 
user profile iconMSC hat folgendes geschrieben:
Jetz habe ich das Problem, das ich auch Tastenkombinationen brauche, wie z.B.: Strg+C und Strg+V

Und warum kein WM_COPY und WM_PASTE an des betreffende Edit senden? Oder Wenn man den Inhalt der Zwischenablage nicht kaputt machen will WM_GETTEXT.