unit UCalc;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    StaticText1: TStaticText;
    RichEdit1: TRichEdit;
    RichEdit2: TRichEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure RichEdit1Enter(Sender: TObject);
    procedure RichEdit2Enter(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses ShellAPI, UCalc2, Clipbrd;

procedure PressKey(Key: Word);
// имитация нажатия клавиши Key
begin
  keybd_event(Key,0,0,0);
end;

procedure ReleaseKey(Key: Word);
// имитация отпускания клавиши Key
begin
  keybd_event(Key,0,KEYEVENTF_KEYUP,0);
end;

procedure ClickKey(Key: Word);
begin
// имитация щелчка на клавише Key
  keybd_event(Key,0,0,0);
  keybd_event(Key,0,KEYEVENTF_KEYUP,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var H:hWnd;
    BMCopy:TBitMap;
begin
// поиск программы 'Калькулятор'
 H:=FindWindow('SciCalc','Калькулятор');
// активизация программы 'Калькулятор'
 SetForegroundWindow(H);
// если 'Калькулятор' не выполняется
 if (H = 0)
// зпуск программы 'Калькулятор'
 then ShellExecute(Handle,'open','Calc',nil,nil,SW_RESTORE);
// задержка
  Sleep(1000);
// щелчок Alt
  ClickKey(VK_MENU);
  Sleep(1000);
// щелчок стрелкой вправо - в меню "Вид"
  ClickKey(VK_RIGHT);
  Sleep(1000);
// щелчок Enter - раскрытие меню
  ClickKey(VK_RETURN);
  Sleep(1000);
// щелчок стрелкой вниз - во второй раздел меню
  ClickKey(VK_DOWN);
  Sleep(1000);
// щелчок Enter - выполнение раздела
  ClickKey(VK_RETURN);
  Sleep(1000);
// нажатие Alt - переход в полосу меню
  PressKey(VK_MENU);
// щелчок клавиши с латинским 'D' и русским 'В' -
// клавиша быстрого доступа
  ClickKey(ord('D'));
// отпускание Alt
  ReleaseKey(VK_MENU);
  Sleep(1000);
// щелчок Enter - выполнение раздела
  ClickKey(VK_RETURN);
  Sleep(1000);
// щелчок цифры 2
  ClickKey(ord('2'));
  Sleep(1000);
// нажатие Shift
  PressKey(VK_SHIFT);
// щелчок клавиши с цифрой 8 и знаком умножение
  ClickKey(187);
// отпускание Shift
  ReleaseKey(VK_SHIFT);
// щелчок цифры 2
  ClickKey(ord('2'));
  Sleep(1000);
// щелчок клавиши с символами '=' и '+' - результат
  ClickKey(187);
  Sleep(1000);
// нажатие Ctrl-C - копирование результата
  PressKey(VK_CONTROL);
  ClickKey(ord('C'));
  ReleaseKey(VK_CONTROL);
  Sleep(1000);
// чтение результата
  RichEdit1.Clear;
  RichEdit1.Lines.Add('2 * 2 = ');
  RichEdit1.SelStart := RichEdit1.SelStart - 2;
  RichEdit1.Perform(WM_PASTE,0,0);
  RichEdit2.Clear;
  RichEdit2.Lines.Add('2 * 2 = ');
  RichEdit2.SelStart := RichEdit2.SelStart - 2;
  RichEdit2.Perform(WM_PASTE,0,0);

// занесение окна в буфер обмена
  PressKey(VK_MENU);
  ClickKey(VK_SNAPSHOT);
  ReleaseKey(VK_MENU);
  Sleep(1000);
// возврат активности в данное приложение
  SetForegroundWindow(Handle);
  ShowMessage('Программа управления Калькулятором выполнена');
  Form2.Visible := false;
  BMCopy := TBitMap.Create;
 try
  try
    BMCopy.LoadFromClipBoardFormat(cf_BitMap,
                         ClipBoard.GetAsHandle(cf_Bitmap),0);
   with Form2 do
    Image1.Canvas.CopyRect(Rect((ClientWidth-BMCopy.Width) div 2,
                                (ClientHeight-Image1.Height) div 2,
                                (ClientWidth+BMCopy.Width) div 2,
                                (ClientHeight+BMCopy.Height) div 2),
         BMCopy.Canvas,Rect(0,0,BMCopy.Width,BMCopy.Height));
  finally
   BMCopy.Free;
  end;
 except
  On EInvalidGraphic do
                     ShowMessage('Ошибочный формат графики');
 end;
 Form2.Show;
end;

procedure TForm1.RichEdit1Enter(Sender: TObject);
begin
 LoadKeyboardLayout('00000419',KLF_ACTIVATE);
 if (GetKeyState(VK_CAPITAL) and 1) = 0
  then ClickKey(VK_CAPITAL);
end;

procedure TForm1.RichEdit2Enter(Sender: TObject);
begin
 LoadKeyboardLayout('00000409',KLF_ACTIVATE);
 if (GetKeyState(VK_CAPITAL) and 1) <> 0
  then ClickKey(VK_CAPITAL);
end;

end.
