首页  编辑  

子程序不支持重定向,如何控制子程序输入

Tags: /超级猛料/Console.控制台程序/   Date Created:

有一个程序,不支持重定向输入输出,我想发送一个按键Q或Ctrl + C给对方,该如何做?

// By Kingron, 2011

首先运行子程序,然后通过AttachConsole,绑定子程序的控制台到本程序,然后通过WriteConsoleInput向子程序写入按键即可。

function AttachConsole(dwProcessId: DWORD): Boolean; stdcall external kernel32;

下面是示例代码

var

 IR: INPUT_RECORD;

 r : Cardinal;

 h : THandle;

begin

 // 运行子程序后,务必保存子程序的进程 ID

 AttachConsole(子程序的.ProcessInfo.dwProcessId);

 h := GetStdHandle(STD_INPUT_HANDLE);

 // 发送Q按下事件

 FillChar(IR, sizeof(IR), 0);

 IR.EventType :=KEY_EVENT;

 IR.Reserved :=0;

 with IR.Event.KeyEvent do

 begin

   bKeyDown :=True;

   wRepeatCount := 1;

   wVirtualKeyCode := Ord('q');

   wVirtualScanCode := MapVirtualKey(Ord('q'), 0);

   AsciiChar :='q';

   dwControlKeyState := 0;

 end;

 WriteConsoleInput(h, IR, 1, R);

 sleep(10);

// 发送 Q 弹起事件,形成完整的一个Q的按键事件,对方接收后就会退出了

 with IR.Event.KeyEvent do

 begin

   bKeyDown :=False;

   wRepeatCount := 1;

   wVirtualKeyCode := Ord('q');

   wVirtualScanCode := MapVirtualKey(Ord('q'), 0);

   AsciiChar :='q';

   dwControlKeyState := 0;

 end;

 WriteConsoleInput(h, IR, 1, R);

end;