Autor Beitrag
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Sa 12.07.03 11:47 
Hi,

wie kann ich Tastatureingaben an ein Handle senden? Ich habe z.B. das Handle eines Notepad-Fensters und möchte an dieses nun VK_RETURN senden. Wie ist das realisierbar, wenn das Fenster NICHT im Vordergrund ist (sonst ist's ja einfach...)?

So geht es nicht:
ausblenden Delphi-Quelltext
1:
SendMessage(Hnd,WM_KEYDOWN,VK_RETURN,0);					


Danke schon mal,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
schneegurke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 19

Win XP
C# (VS 2003, 2005 Express)
BeitragVerfasst: Di 22.07.03 10:55 
Hiermit sollte das gehen. Ist ein Stück Source aus der JEDI-VCL (www.delphi-jedi.org). Ist übrigens sehr zu empfehlen!

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:
procedure SendShift(H: HWND; Down: Boolean);
var
  vKey, ScanCode: Word;
  lParam: Longint;
begin
  vKey := VK_SHIFT;
  ScanCode := MapVirtualKey(vKey, 0);
  lParam := Longint(ScanCode) shl 16 or 1;
  if not Down then
    lParam := lParam or $C0000000;
  SendMessage(H, WM_KEYDOWN, vKey, lParam);
end;

procedure SendCtrl(H: HWND; Down: Boolean);
var
  vKey, ScanCode: Word;
  lParam: Longint;
begin
  vKey := VK_CONTROL;
  ScanCode := MapVirtualKey(vKey, 0);
  lParam := Longint(ScanCode) shl 16 or 1;
  if not Down then
    lParam := lParam or $C0000000;
  SendMessage(H, WM_KEYDOWN, vKey, lParam);
end;

function SendKey(AppName: string; Key: Char): Boolean;
var
  vKey, ScanCode: Word;
  lParam, ConvKey: longint;
  Shift, Ctrl: Boolean;
  H: HWND;
begin
  H := FindWindow(PChar(AppName), nil);
  if H <> 0 then
  begin
    ConvKey := OemKeyScan(Ord(Key));
    Shift := (ConvKey and $00020000) <> 0;
    Ctrl := (ConvKey and $00040000) <> 0;
    ScanCode := ConvKey and $000000FF or $FF00;
    vKey := Ord(Key);
    lParam := Longint(ScanCode) shl 16 or 1;
    if Shift then
      SendShift(H, True);
    if Ctrl then
      SendCtrl(H, True);
    SendMessage(H, WM_KEYDOWN, vKey, lParam);
    SendMessage(H, WM_CHAR, vKey, lParam);
    lParam := lParam or $C0000000;
    SendMessage(H, WM_KEYUP, vKey, lParam);
    if Shift then
      SendShift(H, False);
    if Ctrl then
      SendCtrl(H, False);
    Result := True;
  end
  else
    Result := False;
end;
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Di 22.07.03 21:26 
Danke, werd's gleich mal ausprobieren

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Fr 26.09.03 21:13 
Sorry, ich bin erst jetzt dazu gekommen auf diese Frage zu "antworten". Leider funktioniert es nicht. SendKey('Notepad','T') bringt nicht den gewünschten Effekt - Notepad ist natürlich offen!

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 26.09.03 22:47 
da das "T" wohl im Edit von Notepad erscheinen sioll, solltest du mal das Handle von dem angeben und nicht vom Hauptfenster.
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Sa 27.09.03 18:47 
:oops:

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Gerhard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: So 28.09.03 19:01 
Hi,

ich habe versucht die oben angeführten Delphi-Anweisung aufzunehmen, aber leider hat Delphi folgendes angezeigt:

HWND ist kein gültiger Typenbezeichner.

Frage: Ist eine spezielle Unit aufzunehmen oder ist das ein prinzipelles Problem mit Delphi3?

Danke Gerhard
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: So 28.09.03 19:06 
Einfach mal mit Cardinal versuchen...

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 28.09.03 19:58 
Windows.pas ist deklariert als THandle.
Gerhard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: So 28.09.03 20:18 
Danke für den Hinweis,

aber viel weiter komme ich nicht, denn in der Zeile

lParam := Longint(ScanCode) shl 16 or 1;

klempt es schon wieder mit der Meldung: '(' erwartet, aber ':=' gefunden.
Sowie mit der Meldeung: Anweisung erforderlich, aber Ausdruck vom Typ 'Integer' gefunden.


Danke Gerhard
maxk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Mo 29.09.03 18:11 
D.h., dass dein Compiler nicht weiß, dass es sich bei Longint um einen Typen handelt. Versuche mal über den Code folgendes zu schreiben:
ausblenden Delphi-Quelltext
1:
type LongInt=–2147483648..2147483647;					

LongInt entspricht einer 32-bit Zahl mit Vorzeichen, daher diese Typendefinition. Wird warscheinlich nicht funktionieren...

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.09.03 20:28 
Das halte ich aber für ein Gerücht.

Von was für einem Datentyp ist ScanCode? Wenn es sschon ein Integer ist, dann sollte es ohne Cast zuweisbar sein. Aber aknn es sein, dass die Klammern nicht richtig sitzen?
Gerhard
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Mo 29.09.03 20:56 
Hi,

leider klemmt es noch immer, der Compiler meldet sich noch immer ... es geht nicht

LongInt. .... geht leider nicht

Unter uses habe ich
die Unit Windows eingebunden, fehlt da vielleicht noch eine Unit?

Gruß Gerhard

Danke für Hiweise!