Delphi Tips&Tricks News   Tips   .NET Software   VCL Software   Search   Contacts
Ultimate Pack Special Offer!


Share this page

Follow us
LinkedIn Blogspot Twitter Facebook

Related products
Ultimate Pack  hot!
iGrid Plotter  new!
Image Editor
Runtime Fusion
Form Designer
Object Inspector
Print Suite Pro
Commented Image
Delphi Toys
WinDowse
Delphi Bonus
TMS Scripter Studio
Form Designer VB
Form Designer .NET
Print Suite .NET
Gradient Controls .NET  new!

Related links
Win32.hlp online version
MegaDetailed.NET
Delphi to C#

Special
Free Software Promotion
Offers for Resellers

Hobby projects
cdtrrracks.com
books.storrre.com
in3steps.com
sovietphillumeny.com

Get data from application to Word - Application - Tips & Tricks - Greatis Delphi Pages

This example shows, how to break the 'hello' string on symbols. And for each symbol two messages WM_KEYDOWN and WM_KEYUP are created. These messages are brought in the list of the messages. After that the hook is created, which processes these messages in the Word document.


...
type
  TMessageList = class(TList);

var
  Form1: TForm1;
  MessageList: TMessageList = nil;
  MessageBuffer: TEventMsg;
  HookHandle: hHook = 0;
  MessageCount: Word = 0;
  Go: Boolean = False;

implementation

{$R *.DFM}

procedure Stop;
begin
  if Go then UnHookWindowsHookEx(HookHandle);
  MessageList.Free;
  Go:=False;
end;

function FBack(Code: Integer; wParam, lParam: LongInt): LongInt; stdcall;
begin
  case Code of
    HC_SKIP:
    begin
      Inc(MessageCount);
      if MessageCount>=MessageList.Count then Stop
      else MessageBuffer:=TEventMsg(MessageList.Items[MessageCount]^);
      Result:=0;
    end;
    HC_GETNEXT:
    begin
      PEventMsg(lParam)^:=MessageBuffer;
      Result:=0;
    end
    else
      Result:=CallNextHookEx(HookHandle, Code, wParam, lParam);
  end;
end;

procedure SetHook;
begin
  MessageBuffer:=TEventMsg(MessageList.Items[0]^);
  MessageCount:=0;
  HookHandle:=SetWindowsHookEx(WH_JOURNALPLAYBACK, FBack, hInstance, 0);
  Go:=True;
end;

procedure MakeMessage(Key: byte; Mes: Cardinal);
var
  MyEvent: PEventMsg;
begin
  New(MyEvent);
  with MyEvent^ do
  begin
    message:=Mes;
    ParamL:=Key;
    ParamH:=MapVirtualKey(Key, 0);
    Time:=GetTickCount;
    hWnd:=Form1.Handle;
  end;
  MessageList.Add(MyEvent);
end;

procedure Imitation(KeyCode: Word);
begin
  MakeMessage(Lo(KeyCode), WM_KEYDOWN);
  MakeMessage(Lo(KeyCode), WM_KEYUP);
end;

procedure SetMessages(S: string);
var
  i: Integer;
  KeyCode: Word;
begin
  i:=1;
  repeat
    KeyCode:=vkKeyScan(S[i]);
    Imitation(KeyCode);  // simulate key presses
    Inc(i);
  until i>Length(S);
end;

function SendStr(S: string): Integer;
begin
  try
    MessageList:=TMessageList.Create;
    SetMessages(S);  // set messages
    SetHook;         // set hook
  except
  end;
  Result:=0;  
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Handle: hWnd;
  ProcessInfo: TProcessInformation;
  StartInfo: TStartUpInfo;
  APath: string;
begin
  APath:=Edit1.Text;
  if CreateProcess(
       nil, 
       PChar(APath), 
       nil,
       nil, 
       False, 
       0, 
       nil, 
       nil, 
       StartInfo, 
       ProcessInfo) then
  begin
    WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
    Handle:=FindWindow('winword', nil);
    SetForegroundWindow(Handle);
    SendStr('hello');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    Edit1.Text:=OpenDialog1.FileName;
end;
Related chapters
Manipulators

Related topics
Hook the keyboard
Hook the mouse

For more
Win32 programmer's reference

Download source