A znajduje wszystkie okna i pokazuje "ok" w Memo? Jak tak, to może spróbuj ten komponent ze strony:
http://www.torry.net/vcl/system/keys/sssendkeys.zip - mi on działał na przykłąd w wysyłaniu znaków
do okna DosBox'a albo w przypadku wysyłania klawisza do okna przeglądarki managera plików "FAR".
Może Tobie też pomoże. Ja nie mam jak sprawdzić, bo pod WMVare nie chce instalować Windowsów,
a póki co mam tylko Dosa ze starym trackerem do modułów FastTracker 2, ale lepiej owy tracker działa
pod DosBox'em, bo ja mam dosyć wolny komp jak na wymagania WMVare (z początku 2004 roku). No i
próbowałem wysłać klawisz najpierw Twoją metodą do okna dosowego w WMVare, ale Y = 0. Nie da
się znaleźć uchwytu okien wewnątrz WMVare. Próbowałem taki kod jak poniżej, ale po if nie wykonuje.
var
H, Y : HWND;
begin
H := FindWindow('VMUIFrame', nil);
Y := FindWindowEX(H, 0, 'MKSEmbedded', nil);
Caption := Format('X: %d, Y: %d', [H, Y]);
if Y <> 0 then
begin
Memo1.Lines.Add('ok');
SendMessage(Y, WM_CHAR, VkKeyScan('l'), 0);
end;
end;
Generalnie z moich testów wynika, że SendMessage zadziała dla typowej kontrolki edycyjnej jak Memo
czy Edit. Na przykład poniższy kod działa z Notatnikiem, ale z Operą już nie - działa za to następny kod:
var
HC, Y : HWND;
begin
HC := FindWindow('Notepad', nil);
Y := FindWindowEx(HC, 0, 'Edit', nil);
SendMessage(Y, WM_CHAR, Ord('B'), 0);
SendMessage(Y, WM_CHAR, Ord('a'), 0);
SendMessage(Y, WM_CHAR, Ord('h'), 0);
SendMessage(Y, WM_KEYDOWN, VK_RETURN,0);
end;
I tak jak pisałem poniższy kod wyśle F2 do okna Opery. Może w podobny sposób spróbuj z WMVare:
var
H, OldH, Y : HWND;
begin
H := FindWindow('OpWindow', nil);
Y := FindWindowEx(H, 0, 'OperaWindowClass', nil);
OldH := GetForegroundWindow;
if Y <> 0 then
begin
Memo1.Lines.Add('ok');
SetForeGroundWindow(H);
SetForeGroundWindow(Y);
Keybd_Event(VK_F2, 0, 0, 0);
Keybd_Event(VK_F2, 0, KEYEVENTF_KEYUP, 0);
SetForeGroundWindow(OldH);
end;
end;