[delphi] Keys doorsturen naar andere app werkt maar half

Pagina: 1
Acties:
  • 226 views sinds 30-01-2008
  • Reageer

  • Rambo
  • Registratie: Maart 2001
  • Laatst online: 19-12-2024
Ik ben bezig met een programmaatje dat edit.text doorstuurt naar een opgegeven venster. Ik heb hiervoor een component gevonden:

SendKeys.pas
code:
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
{****************************************************}
{              SendKeys Unit for Delphi 32           }
{    Copyright (c) 1999 by Borut Batagelj (Slovenia) }
{                       Aleksey Kuznetsov (Ukraine)  }
{            Home Page: www.utilmind.com             }
{            E-Mail: info@utilmind.com               }
{****************************************************}

unit SendKeys;

interface

uses
  Windows, SysUtils;

const
  SK_BKSP = #8;
  SK_TAB = #9;
  SK_ENTER = #13;
  SK_ESC = #27;
  SK_ADD = #107;
  SK_SUB = #109;
  SK_F1 = #228;
  SK_F2 = #229;
  SK_F3 = #230;
  SK_F4 = #231;
  SK_F5 = #232;
  SK_F6 = #233;
  SK_F7 = #234;
  SK_F8 = #235;
  SK_F9 = #236;
  SK_F10 = #237;
  SK_F11 = #238;
  SK_F12 = #239;
  SK_HOME = #240;
  SK_END = #241;
  SK_UP = #242;
  SK_DOWN = #243;
  SK_LEFT = #244;
  SK_RIGHT = #245;
  SK_PGUP = #246;
  SK_PGDN = #247;
  SK_INS = #248;
  SK_DEL = #249;
  SK_SHIFT_DN = #250;
  SK_SHIFT_UP = #251;
  SK_CTRL_DN = #252;
  SK_CTRL_UP = #253;
  SK_ALT_DN = #254;
  SK_ALT_UP = #255;

procedure SendKeyString(Text: String);
procedure SendKeysToTitle(WindowTitle: String; Text: String);
procedure SendKeysToHandle(WindowHandle: hWnd; Text: String);
procedure MakeWindowActive(wHandle: hWnd);
function GetHandleFromWindowTitle(TitleText: String): hWnd;

implementation

procedure SendKeyString(Text: String);
var
   i: Integer;
   Shift: Boolean;
   vk, ScanCode: Word;
   ch: Char;
   c, s: Byte;
const
   vk_keys: Array[0..9] of Byte =
      (VK_HOME, VK_END, VK_UP, VK_DOWN, VK_LEFT,
       VK_RIGHT, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE);
   vk_shft: Array[0..2] of Byte = (VK_SHIFT, VK_CONTROL, VK_MENU);
   flags: Array[False..True] of Integer = (KEYEVENTF_KEYUP, 0);
begin
   Shift := False;
   for i := 1 to Length(Text) do
    begin
     ch := Text[i];
     if ch >= #250 then
      begin
       s := Ord(ch) - 250;
       Shift := not Odd(s);
       c := vk_shft[s shr 1];
       ScanCode := MapVirtualKey(c,0);
       Keybd_Event(c, Scancode, Flags[shift], 0);
      end
     else
      begin
       vk := 0;
       if ch >= #240 then
        c := vk_keys[Ord(ch) - 240]
       else
        if ch >= #228 then {228 (F1) => $70 (vk_F1)}
         c := Ord(ch) - 116
        else
         if ch < #110 then
          c := Ord(ch)
         else
          begin
           vk := VkKeyScan(ch);
           c := LoByte(vk);
          end;
       ScanCode := MapVirtualKey(c,0);
       if not Shift and (Hi(vk) > 0) then { $2A = scancode of VK_SHIFT }
        Keybd_Event(VK_SHIFT, $2A, 0, 0);
       Keybd_Event(c,scancode, 0, 0);
       Keybd_Event(c,scancode, KEYEVENTF_KEYUP, 0);
       if not Shift and (Hi(vk) > 0) then
        Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0);
      end;
    end;
end;

procedure MakeWindowActive(wHandle: hWnd);
begin
  if IsIconic(wHandle) then
   ShowWindow(wHandle, SW_RESTORE)
  else
   BringWindowToTop(wHandle);
end;

function GetHandleFromWindowTitle(TitleText: String): hWnd;
var
  StrBuf: Array[0..$FF] of Char;
begin
  Result := FindWindow(PChar(0), StrPCopy(StrBuf, TitleText));
end;

procedure SendKeysToTitle(WindowTitle: String; Text: String);
var
  Window: hWnd;
begin
  Window := GetHandleFromWindowTitle(WindowTitle);
  MakeWindowActive(Window);
  SendKeyString(Text);
end;

procedure SendKeysToHandle(WindowHandle: hWnd; Text: String);
begin
  MakeWindowActive(WindowHandle);
  SendKeyString(Text);
end;

end.


Het doorsturen lukt maar half.
Alleen letters in uppercase worden goed weergegeven. Als je ze in lowercase invoert dat worden er rare tekens naar het doelprogramma gestuurt.

Ik wilde de string www.adres.nl doorsturen naar het doelprogramma.
Dit lukt voor geen meter :/

Wat ik tot nu toe heb:
code:
1
2
3
4
5
6
7
...
bericht := UpperCase(Edit1.Text);
programma := Edit2.Text;
...
//alleen a tm z en 0 t/m 9 lukt op deze manier, SK_ENTER=enter :)
SendKeysToTitle(programma, bericht+SK_ENTER); 
...


Wat voorbeelden:
code:
1
2
3
//zonder de input naar uppercase te zetten dus
bericht :=Edit1.Text; //invoer is: 'teststring' 
SendKeysToTitle(programma, bericht+SK_ENTER);

output:
t5ststr9n7

code:
1
2
3
//wel eerst naar uppercase
bericht :=UpperCase(Edit1.Text); //invoer is: 'teststring' 
SendKeysToTitle(programma, bericht+SK_ENTER);

output:
teststring

code:
1
2
3
//wel eerst naar uppercase
bericht :=UpperCase(Edit1.Text); //invoer is: 'www.google.nl' 
SendKeysToTitle(programma, bericht+SK_ENTER);

output:
wwwgooglenl

Maar hoe krijg ik daar nu een .(punt) tussen?
Heb echt al alles geprobeerd. Ben er al 2 dagen mee bezig en met google/delphi sites kom ik ook niet veel verder.
Wat ik uitgevogeld heb is dat ik waarschijnlijk iets met #46 moet doen :?
Dat is de punt. Maar ergens anders kom ik weer het getal 110 tegen.
Ik heb ook al zitten spelen met Ord en Chr, maar het lukt maar niet.

Iemand een idee hoe ik dit kan oplossen? 8)7

  • Woohooo
  • Registratie: Februari 2001
  • Laatst online: 06-05 23:25

Woohooo

Smilie, James Smilie

Heb je al geprobeert om die tekst uit Edit1.Text in een aparte String te zetten?
en daarna in die UpperCase te plaatsen?

Verwijderd

IK zou zeggen ga eens op zoek naar de unit sndkey32.pas die doet het wel goed opzich.

staat btw op de Delphi CD.

[ Voor 15% gewijzigd door Verwijderd op 09-12-2003 11:25 ]


  • Rambo
  • Registratie: Maart 2001
  • Laatst online: 19-12-2024
Verwijderd schreef op 09 december 2003 @ 11:22:
IK zou zeggen ga eens op zoek naar de unit sndkey32.pas die doet het wel goed opzich.

staat btw op de Delphi CD.
Ben nu op stage ;)
Dus ik zoek hem even op internet.
Dit wordt niks meer zo, met het huidige component.

edit:
ik gebruik nu bovenstaand component, werkt prima.
Voor meer info:
Topic op nldelphi forum

[ Voor 24% gewijzigd door Rambo op 09-12-2003 15:28 ]