Как послать нажатие клавиши в какое-нибудь окно?

Материал из DRKB

Как послать нажатие клавиши в какое-нибудь окно?[править | править код]

Эта процедура посылает сообщение о нажатии клавиши.

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
    if ShiftKeys[i].Shift in bShift then 
      keybd_event(ShiftKeys[i].VKey, MapVirtualKey(ShiftKeys[i].VKey, 0), 0, 0);
  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
    if ShiftKeys[i].Shift in bShift then 
      keybd_event(ShiftKeys[i].VKey, MapVirtualKey(ShiftKeys[i].VKey, 0), KEYEVENTF_KEYUP, 0);
end;


Чтобы воспользоваться этой процедурой надо предварительно найти и активизировать нужное окно:

SetForegroundWindow(FindWindow(PChar(WindowClassName), PChar(WindowCaption)));


PS. не забудьте поставить задержки типа Sleep(100) после активизации окна и между посылаемыми клавишами, не то окно может не успевать реагировать на клавиши...


Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 01490