Autor Beitrag
Ruditschka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Mi 07.05.03 00:28 
Für einen Terminal-Rechner mit Touchscreen bin ich gebeten worden, eine Bildschirmtastatur zu entwickeln.

Da ich noch keinen Plan habe, wie ich in Windows einen Tastendruck simuliere, wende ich mich mal hierher um Hilfe :?

Wie kann ich ein einzelnes Zeichen an Windows bzw. eine Anwendung schicken?
Erst mal soll auf dem Terminal nur der Internet Explorer laufen, wäre aber nicht schlecht, wenn die Bildschirmtastatur auch in der Lage wäre, Zeichen quasi wie die normale Tastatur einfach ins System zu senden.

Danke und Gruß an alle Interessierten
Rudi

Moderiert von user profile iconTino: Titel geändert & Topic verschoben
Moritz M.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1672



BeitragVerfasst: So 11.05.03 07:58 
Ganz einfach:

Nimm diese Prozedur und bau sie ein:
ausblenden volle Höhe 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:
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean); 
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; 
  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;
end;



Nunn hast du zum Beispiel den Button Namens "A_Taste", der die A-Taste darstellt. Bei Klick soll folgendes passieren:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
procedure A_TasteClick(Sender: TObject);
var buchstabe: word:
begin
  buchstabe:='A';
  PostKeyEx32(Ord(Buchstabe), [], False);
end;


Quelle:
swissdelphicenter.ch.../showcode.php?id=220
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: So 11.05.03 20:33 
Danke für die Antwort. Den gleichen Code habe ich auch schon gefunden und eingebaut. Er klappt komischerweise nur, wenn ich einem bestimmten Edit den Focus zuweise (irgendwie auch klar - was soll ein Button auch mit einem Tastendruck anfangen?).

Jetzt ist mein Problem, das Handle des letzten aktiven Elements zu finden. Innerhalb meiner Anwendung klappt das ganz gut. Das Problem ist nur das Handle bei anderen Anwendungen rauszufinden - und zwar bevor mein Programm die Kontrolle übernimmt (dann ist das aktive Handle ja schon irgendwo in meinem Programm). Ich habe versucht, das ganze mit einem Mouse-Hook zu realisieren, der mich benachrichtigt, wenn die linke Maustaste gedrückt wird.

Falls das immer noch in diesen Thread passt, kann ich auch gerne den Code posten, ansonsten bitte kurze Antwort und ich erstelle einen neuen Thread.

Gruß
Christoph

P.S.: Ja, ich habe schon das Hook-Tutorial gelesen und versucht, den dortigen Tastaturhook als Mousehook umzubauen. Nur weiß ich nicht, ob er überhaupt arbeitet und nur die Message nicht ankommt, oder ob er gar nicht arbeitet. Ein Studium des berühmten Luckie-Spy hat mich auch nicht weitergebracht. :(