Autor Beitrag
whitef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 202
Erhaltene Danke: 1

Windows X
Delphi XE X
BeitragVerfasst: Mo 11.01.16 23:52 
Hallo,
ich habe ein Shortcut erstellt und wenn diese gedrückt wird soll eine simple Textausgabe an das aktive Fenster ausgegeben werden.
Wenn der Shortcut auf bspw. auf F10 liegt und Editor (Notepad, Word, etc.) den fokus hat, dann wird der Text auch gesendet.
Wenn der Shortcut nun aber auf STRG + Num 1 liegt und Editor den fokus hat, dann wird nicht der Text eingefügt. Stattdessen wird wie wild im der Menubar vom Editor herumgewirbelt :D
(zb. öffnet sich unter anderem der Speichern Dialog).

Es wird höchstwahrscheinlich daran liegen, das der Shortcut mit "STRG" gestartet worden ist und zu dem Zeitpunkt in dem der String eigentlich geschrieben wird der Editor noch angehalten ist die Befehle inkl. der "STRG-Funktion" auszuführen.

Wisst ihr wie ich dem entsprechenden Programm nun mitteile dass die "STRG" Taste nun nicht mehr gedrückt ist aber der String übergeben wird?

Mein Quelltext in angepasster Form:


HotKey0.HotKey = STRG + Num 1
HotKey1.HotKey = STRG + Num 2
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
...
   private
    { Private-Deklarationen }
    Hotkey0_id : Integer;
    Hotkey1_id : Integer;
....

procedure SendString(AText: String);
var lCount : Integer;
    lScanCode : Smallint;
    lWithAlt,
    lWithCtrl,
    lWithShift : Boolean;
begin
  for lCount := 1 To Length(AText) Do
  begin
    lScanCode := VkKeyScan(AText[lCount]);
    //Ermitteln ob Shift gedrückt wurde
    lWithShift := lScanCode and (1 shl 8) <> 0;
    //Ermitteln ob Strg gedrückt wurde
    lWithCtrl := lScanCode and (1 shl 9) <> 0;
    //Ermitteln ob Alt gedrückt wurde
    lWithAlt := lScanCode and (1 shl 10) <> 0;

    if lWithShift then
      keybd_event(VK_SHIFT, 000);
    if lWithCtrl then
      keybd_event(VK_CONTROL, 000);
    if lWithAlt then
      keybd_event(VK_MENU, 000);

    keybd_event(lScanCode, 000);
    keybd_event(lScanCode, 0, KEYEVENTF_KEYUP, 0);

    if lWithAlt then
      keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
    if lWithCtrl then
      keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
    if lWithShift then
      keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
  end;
end;

...

// TShortCut für RegisterHotKey umwandeln
procedure ShortCutToHotKey(HotKey: TShortCut; var Key : Word; var Modifiers: Uint);
var
  Shift: TShiftState;
begin
  ShortCutToKey(HotKey, Key, Shift);
  Modifiers := 0;
  if (ssShift in Shift) then
    Modifiers := Modifiers or MOD_SHIFT;
  if (ssAlt in Shift) then
    Modifiers := Modifiers or MOD_ALT;
  if (ssCtrl in Shift) then
    Modifiers := Modifiers or MOD_CONTROL;
end;

...

// WM_HOTKEY Hotkey Handler
procedure TFormMain.WMHotKey(var Msg: TWMHotKey);
var
  TypeText : String;
  i : Integer;
begin
{
while IsControlKeyPressed = True do
begin
  sleep(500);
  //Application.ProcessMessages;
end;
}

  if Msg.HotKey = Hotkey0_id then
  begin
    TypeText := 'Stringtest';
  end;

  if Msg.HotKey = Hotkey1_id then
  begin
    TypeText := DateTimeToStr( Date() );
  end;

  SendString(TypeText);
end;

...

procedure TFormMain.FormCreate(Sender: TObject);
var
  Key : Word;
  Modifiers: UINT;
begin

  TrayIcon1.Visible := True;

  //Hotkey0: Einfügen von Text
  ShortCutToHotKey(HotKey0.HotKey, Key, Modifiers);
  Hotkey0_id := GlobalAddAtom('MyHotKey_0');
  RegisterHotKey(Handle, Hotkey0_id, Modifiers, Key);

  //Hotkey1: Einfügen des Datums
  ShortCutToHotKey(HotKey1.HotKey, Key, Modifiers);
  Hotkey1_id := GlobalAddAtom('MyHotKey_1');
  RegisterHotKey(Handle, Hotkey1_id, Modifiers, Key);
end;

...

procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnRegisterHotKey(Handle, Hotkey0_id);
  GlobalDeleteAtom(Hotkey0_id);

  UnRegisterHotKey(Handle, Hotkey1_id);
  GlobalDeleteAtom(Hotkey1_id);
end;


genial wäre es wenn ich STRG gedrückt halten könnte und bei zusätzlichem drücken der "Num 1" der Text ausgegeben wird. Wenn ich jetzt immernoch die STRG Taste gedrückt halte und nun die "Num 2" Taste drücke der nächste Text ausgegeben wird ohne dem empfangenden Programm die "STRG-Funktion" mitzuteilen. Das wäre Perfekt...