0

我已经使用 Win32::GUItest 编写了一个 perl 脚本来将击键发送到 windows 中的命令提示符窗口,现在当我的脚本运行时,它使用 perl 中的系统函数并打开一个新的 cmd.exe 文件并将击键发送给它。直到这里一切正常,但我不希望该命令提示符窗口可见并且用户手动运行脚本。我希望将击键发送到后台的 cmd.exe 窗口中。我想使用 schtasks 使用 windows 64 位服务器来安排脚本。

请不要建议我使用Proc::Background,除非您真的尝试过此任务,否则您可以使用它们Win32::ServiceWin32::Daemon

4

2 回答 2

0

我认为您可以使用Win32::Console.

我没有这方面的经验,但文档听起来很有希望:因为有一个Display()功能,我假设控制台默认是隐藏的。

于 2012-07-05T18:33:20.163 回答
0

您需要将WM_CHARWM_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;
}
于 2012-07-06T22:51:05.273 回答