Symulacja klawiatury

0

Witam

var
  h,y:HWND;
begin

  h:=FindWindow(nil, 'Windows XP Professional - VMware Workstation' );
  //h:=FindWindow(nil, 'a - Notatnik' );

  y:= FindWindowEx(h,0,'VMWare.GuestWindow',0 );

  if y<>0 then
  begin
    memo1.Lines.add( 'ok' );
    SendMessage(y, WM_CHAR, VkKeyScan('l'), 0);



  end;
end;

to jest kod ktory teoretycznie powinien wyslac 'l' do okna VMware. Moze ktos juz probowal zasymulowac klawiature do tego programu ?

0

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;
0

Witam

Ten ostani kod dziala juz go probowalem, ale zalezy mi na tym aby wysylal kod nie widocznie dla mnie. Chodzi o to zeby aplikacja nie byla na wierzchu.

0

No to niebardzo wiem jak to zrobić. A z tego co zauważyłem to VMWare inaczej obsługuje wirtualne
maszyni w nim doane. Na przykład nie reaguje na HotKeye stworzone w programie AutoHotkey, który
to program działa w trayu. Dlatego nie wiem czy okno systemu VMWare może przyjmować komunikaty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1