Get data from application to Word
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;