我使用Win32 :: GUItest编写了一个perl脚本,将键击发送到windows中的命令提示符窗口,现在当我的脚本运行时,它使用perl中的系统函数并打开一个新的cmd.exe文件并发送键击它。一切正常,直到这里,但我不希望该命令提示窗口可见,用户手动运行脚本。我希望将键击发送到后台的cmd.exe窗口。我想使用Windows 64位服务器使用schtasks安排脚本。
请不要建议我使用Proc::Background
,Win32::Service
和Win32::Daemon
,除非你真的尝试过这项任务,因为你可以使用它们。
答案 0 :(得分:0)
我认为您可以使用Win32::Console
来控制控制台。
我没有使用它的经验,但文档听起来很有希望:因为有一个Display()
函数,我假设控制台默认是隐藏的。
答案 1 :(得分:0)
您需要向相关窗口发送WM_CHAR或WM_UNICHAR消息,而不是依赖于处于活动状态且位于前台的窗口。
这个例子似乎对我有用。当密钥被发送到links
窗口中运行的cmd.exe
时,我能够切换到其他应用程序。当我输入电子邮件时,链接已导航到example.com
。
#!/usr/bin/env perl
use strict; use warnings;
use Encode qw(encode);
use Time::HiRes qw( usleep );
use Win32::GuiTest qw(SendMessage ShowWindow WaitWindow);
use constant WM_CHAR => 0x0102;
use constant SW_HIDE => 0;
use constant SW_SHOW => 5;
system qw(start links);
my $hwnd = WaitWindow('Links', 5);
ShowWindow $hwnd, SW_HIDE;
send_message($hwnd, "ghttp://example.com/\r");
ShowWindow $hwnd, SW_SHOW;
send_message($hwnd, "q\r", 3_000_000);
sub send_message {
my ($hwnd, $msg, $delay) = @_;
$delay ||= 25_000;
my @keys = encode_keys($msg);
for my $key (@keys) {
SendMessage $hwnd, WM_CHAR, $key, 0;
usleep $delay;
}
return;
}
sub encode_keys {
my ($msg) = @_;
map ord, map encode('UTF16-LE', $_), split //, $msg;
}